mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Vendor Update Go Libs (#13444)
* denisenkom/go-mssqldb untagged -> v0.9.0 * github.com/editorconfig/editorconfig-core-go v2.3.7 -> v2.3.8 * github.com/go-testfixtures/testfixtures v3.4.0 -> v3.4.1 * github.com/mholt/archiver v3.3.2 -> v3.5.0 * github.com/olivere/elastic v7.0.20 -> v7.0.21 * github.com/urfave/cli v1.22.4 -> v1.22.5 * github.com/xanzy/go-gitlab v0.38.1 -> v0.39.0 * github.com/yuin/goldmark-meta untagged -> v1.0.0 * github.com/ethantkoenig/rupture 0a76f03a811a -> c3b3b810dc77 * github.com/jaytaylor/html2text 8fb95d837f7d -> 3577fbdbcff7 * github.com/kballard/go-shellquote cd60e84ee657 -> 95032a82bc51 * github.com/msteinert/pam 02ccfbfaf0cc -> 913b8f8cdf8b * github.com/unknwon/paginater 7748a72e0141 -> 042474bd0eae * CI.restart() Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		
							
								
								
									
										41
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								go.mod
									
									
									
									
									
								
							@@ -18,21 +18,22 @@ require (
 | 
				
			|||||||
	gitea.com/macaron/session v0.0.0-20201103015045-a177a2701dee
 | 
						gitea.com/macaron/session v0.0.0-20201103015045-a177a2701dee
 | 
				
			||||||
	gitea.com/macaron/toolbox v0.0.0-20190822013122-05ff0fc766b7
 | 
						gitea.com/macaron/toolbox v0.0.0-20190822013122-05ff0fc766b7
 | 
				
			||||||
	github.com/PuerkitoBio/goquery v1.5.1
 | 
						github.com/PuerkitoBio/goquery v1.5.1
 | 
				
			||||||
	github.com/RoaringBitmap/roaring v0.5.1 // indirect
 | 
						github.com/RoaringBitmap/roaring v0.5.5 // indirect
 | 
				
			||||||
	github.com/alecthomas/chroma v0.8.1
 | 
						github.com/alecthomas/chroma v0.8.1
 | 
				
			||||||
	github.com/andybalholm/brotli v1.0.1 // indirect
 | 
						github.com/andybalholm/brotli v1.0.1 // indirect
 | 
				
			||||||
	github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
 | 
						github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
 | 
				
			||||||
	github.com/blevesearch/bleve v1.0.12
 | 
						github.com/blevesearch/bleve v1.0.12
 | 
				
			||||||
 | 
						github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
 | 
				
			||||||
	github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect
 | 
						github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect
 | 
				
			||||||
	github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect
 | 
						github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 // indirect
 | 
				
			||||||
	github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 // indirect
 | 
						github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 // indirect
 | 
				
			||||||
	github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc
 | 
						github.com/denisenkom/go-mssqldb v0.9.0
 | 
				
			||||||
	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 | 
						github.com/dgrijalva/jwt-go v3.2.0+incompatible
 | 
				
			||||||
	github.com/dlclark/regexp2 v1.4.0 // indirect
 | 
						github.com/dlclark/regexp2 v1.4.0 // indirect
 | 
				
			||||||
	github.com/dustin/go-humanize v1.0.0
 | 
						github.com/dustin/go-humanize v1.0.0
 | 
				
			||||||
	github.com/editorconfig/editorconfig-core-go/v2 v2.3.7
 | 
						github.com/editorconfig/editorconfig-core-go/v2 v2.3.8
 | 
				
			||||||
	github.com/emirpasic/gods v1.12.0
 | 
						github.com/emirpasic/gods v1.12.0
 | 
				
			||||||
	github.com/ethantkoenig/rupture v0.0.0-20180203182544-0a76f03a811a
 | 
						github.com/ethantkoenig/rupture v0.0.0-20181029165146-c3b3b810dc77
 | 
				
			||||||
	github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 // indirect
 | 
						github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 // indirect
 | 
				
			||||||
	github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
 | 
						github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
 | 
				
			||||||
	github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect
 | 
						github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 // indirect
 | 
				
			||||||
@@ -45,22 +46,22 @@ require (
 | 
				
			|||||||
	github.com/go-redis/redis/v7 v7.4.0
 | 
						github.com/go-redis/redis/v7 v7.4.0
 | 
				
			||||||
	github.com/go-sql-driver/mysql v1.5.0
 | 
						github.com/go-sql-driver/mysql v1.5.0
 | 
				
			||||||
	github.com/go-swagger/go-swagger v0.25.0
 | 
						github.com/go-swagger/go-swagger v0.25.0
 | 
				
			||||||
	github.com/go-testfixtures/testfixtures/v3 v3.4.0
 | 
						github.com/go-testfixtures/testfixtures/v3 v3.4.1
 | 
				
			||||||
	github.com/gobwas/glob v0.2.3
 | 
						github.com/gobwas/glob v0.2.3
 | 
				
			||||||
	github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28
 | 
						github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28
 | 
				
			||||||
	github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14
 | 
						github.com/gogs/cron v0.0.0-20171120032916-9f6c956d3e14
 | 
				
			||||||
	github.com/google/go-github/v32 v32.1.0
 | 
						github.com/google/go-github/v32 v32.1.0
 | 
				
			||||||
	github.com/google/uuid v1.1.2
 | 
						github.com/google/uuid v1.1.2
 | 
				
			||||||
	github.com/gorilla/context v1.1.1
 | 
						github.com/gorilla/context v1.1.1
 | 
				
			||||||
	github.com/hashicorp/go-retryablehttp v0.6.7 // indirect
 | 
						github.com/hashicorp/go-retryablehttp v0.6.8 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-version v1.2.1
 | 
						github.com/hashicorp/go-version v1.2.1
 | 
				
			||||||
	github.com/huandu/xstrings v1.3.2
 | 
						github.com/huandu/xstrings v1.3.2
 | 
				
			||||||
	github.com/imdario/mergo v0.3.11 // indirect
 | 
						github.com/imdario/mergo v0.3.11 // indirect
 | 
				
			||||||
	github.com/issue9/assert v1.3.2 // indirect
 | 
						github.com/issue9/assert v1.3.2 // indirect
 | 
				
			||||||
	github.com/issue9/identicon v1.0.1
 | 
						github.com/issue9/identicon v1.0.1
 | 
				
			||||||
	github.com/jaytaylor/html2text v0.0.0-20160923191438-8fb95d837f7d
 | 
						github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7
 | 
				
			||||||
	github.com/jmhodges/levigo v1.0.0 // indirect
 | 
						github.com/jmhodges/levigo v1.0.0 // indirect
 | 
				
			||||||
	github.com/kballard/go-shellquote v0.0.0-20170619183022-cd60e84ee657
 | 
						github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
 | 
				
			||||||
	github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4
 | 
						github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4
 | 
				
			||||||
	github.com/klauspost/compress v1.11.2
 | 
						github.com/klauspost/compress v1.11.2
 | 
				
			||||||
	github.com/klauspost/pgzip v1.2.5 // indirect
 | 
						github.com/klauspost/pgzip v1.2.5 // indirect
 | 
				
			||||||
@@ -68,21 +69,25 @@ require (
 | 
				
			|||||||
	github.com/lib/pq v1.8.1-0.20200908161135-083382b7e6fc
 | 
						github.com/lib/pq v1.8.1-0.20200908161135-083382b7e6fc
 | 
				
			||||||
	github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96
 | 
						github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96
 | 
				
			||||||
	github.com/markbates/goth v1.65.0
 | 
						github.com/markbates/goth v1.65.0
 | 
				
			||||||
 | 
						github.com/mattn/go-colorable v0.1.7 // indirect
 | 
				
			||||||
	github.com/mattn/go-isatty v0.0.12
 | 
						github.com/mattn/go-isatty v0.0.12
 | 
				
			||||||
	github.com/mattn/go-runewidth v0.0.9 // indirect
 | 
						github.com/mattn/go-runewidth v0.0.9 // indirect
 | 
				
			||||||
	github.com/mattn/go-sqlite3 v1.14.4
 | 
						github.com/mattn/go-sqlite3 v1.14.4
 | 
				
			||||||
	github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81
 | 
						github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81
 | 
				
			||||||
	github.com/mgechev/revive v1.0.3-0.20200921231451-246eac737dc7
 | 
						github.com/mgechev/revive v1.0.3-0.20200921231451-246eac737dc7
 | 
				
			||||||
	github.com/mholt/archiver/v3 v3.3.2
 | 
						github.com/mholt/archiver/v3 v3.5.0
 | 
				
			||||||
	github.com/microcosm-cc/bluemonday v1.0.4
 | 
						github.com/microcosm-cc/bluemonday v1.0.4
 | 
				
			||||||
	github.com/minio/minio-go/v7 v7.0.5
 | 
						github.com/minio/minio-go/v7 v7.0.5
 | 
				
			||||||
	github.com/mitchellh/go-homedir v1.1.0
 | 
						github.com/mitchellh/go-homedir v1.1.0
 | 
				
			||||||
	github.com/msteinert/pam v0.0.0-20151204160544-02ccfbfaf0cc
 | 
						github.com/msteinert/pam v0.0.0-20200810204841-913b8f8cdf8b
 | 
				
			||||||
	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
 | 
						github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
 | 
				
			||||||
	github.com/niklasfasching/go-org v1.3.2
 | 
						github.com/niklasfasching/go-org v1.3.2
 | 
				
			||||||
	github.com/oliamb/cutter v0.2.2
 | 
						github.com/oliamb/cutter v0.2.2
 | 
				
			||||||
	github.com/olivere/elastic/v7 v7.0.20
 | 
						github.com/olivere/elastic/v7 v7.0.21
 | 
				
			||||||
 | 
						github.com/onsi/ginkgo v1.13.0 // indirect
 | 
				
			||||||
	github.com/pelletier/go-toml v1.8.1
 | 
						github.com/pelletier/go-toml v1.8.1
 | 
				
			||||||
 | 
						github.com/philhofer/fwd v1.1.0 // indirect
 | 
				
			||||||
 | 
						github.com/pierrec/lz4/v4 v4.1.1 // indirect
 | 
				
			||||||
	github.com/pkg/errors v0.9.1
 | 
						github.com/pkg/errors v0.9.1
 | 
				
			||||||
	github.com/pquerna/otp v1.2.0
 | 
						github.com/pquerna/otp v1.2.0
 | 
				
			||||||
	github.com/prometheus/client_golang v1.8.0
 | 
						github.com/prometheus/client_golang v1.8.0
 | 
				
			||||||
@@ -91,6 +96,8 @@ require (
 | 
				
			|||||||
	github.com/sergi/go-diff v1.1.0
 | 
						github.com/sergi/go-diff v1.1.0
 | 
				
			||||||
	github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect
 | 
						github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect
 | 
				
			||||||
	github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546
 | 
						github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546
 | 
				
			||||||
 | 
						github.com/spf13/viper v1.7.1 // indirect
 | 
				
			||||||
 | 
						github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
 | 
				
			||||||
	github.com/stretchr/testify v1.6.1
 | 
						github.com/stretchr/testify v1.6.1
 | 
				
			||||||
	github.com/syndtr/goleveldb v1.0.0
 | 
						github.com/syndtr/goleveldb v1.0.0
 | 
				
			||||||
	github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 // indirect
 | 
						github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 // indirect
 | 
				
			||||||
@@ -99,20 +106,20 @@ require (
 | 
				
			|||||||
	github.com/ulikunitz/xz v0.5.8 // indirect
 | 
						github.com/ulikunitz/xz v0.5.8 // indirect
 | 
				
			||||||
	github.com/unknwon/com v1.0.1
 | 
						github.com/unknwon/com v1.0.1
 | 
				
			||||||
	github.com/unknwon/i18n v0.0.0-20200823051745-09abd91c7f2c
 | 
						github.com/unknwon/i18n v0.0.0-20200823051745-09abd91c7f2c
 | 
				
			||||||
	github.com/unknwon/paginater v0.0.0-20151104151617-7748a72e0141
 | 
						github.com/unknwon/paginater v0.0.0-20200328080006-042474bd0eae
 | 
				
			||||||
	github.com/urfave/cli v1.22.4
 | 
						github.com/urfave/cli v1.22.5
 | 
				
			||||||
	github.com/willf/bitset v1.1.11 // indirect
 | 
						github.com/willf/bitset v1.1.11 // indirect
 | 
				
			||||||
	github.com/xanzy/go-gitlab v0.38.1
 | 
						github.com/xanzy/go-gitlab v0.39.0
 | 
				
			||||||
	github.com/yohcop/openid-go v1.0.0
 | 
						github.com/yohcop/openid-go v1.0.0
 | 
				
			||||||
	github.com/yuin/goldmark v1.2.1
 | 
						github.com/yuin/goldmark v1.2.1
 | 
				
			||||||
	github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691
 | 
						github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691
 | 
				
			||||||
	github.com/yuin/goldmark-meta v0.0.0-20191126180153-f0638e958b60
 | 
						github.com/yuin/goldmark-meta v1.0.0
 | 
				
			||||||
	go.jolheiser.com/hcaptcha v0.0.4
 | 
						go.jolheiser.com/hcaptcha v0.0.4
 | 
				
			||||||
	go.jolheiser.com/pwn v0.0.3
 | 
						go.jolheiser.com/pwn v0.0.3
 | 
				
			||||||
	golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897
 | 
						golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897
 | 
				
			||||||
	golang.org/x/net v0.0.0-20201010224723-4f7140c49acb
 | 
						golang.org/x/net v0.0.0-20201031054903-ff519b6c9102
 | 
				
			||||||
	golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
 | 
						golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
 | 
				
			||||||
	golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211
 | 
						golang.org/x/sys v0.0.0-20201106081118-db71ae66460a
 | 
				
			||||||
	golang.org/x/text v0.3.4
 | 
						golang.org/x/text v0.3.4
 | 
				
			||||||
	golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
 | 
						golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
 | 
				
			||||||
	golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f
 | 
						golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										189
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										189
									
								
								go.sum
									
									
									
									
									
								
							@@ -35,7 +35,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
 | 
				
			|||||||
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
 | 
					cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
 | 
				
			||||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 | 
					cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 | 
				
			||||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 | 
					cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 | 
				
			||||||
code.cloudfoundry.org/bytefmt v0.0.0-20190710193110-1eb035ffe2b6/go.mod h1:wN/zk7mhREp/oviagqUXY3EwuHhWyOvAdsn5Y4CzOrc=
 | 
					 | 
				
			||||||
code.gitea.io/gitea-vet v0.2.1 h1:b30by7+3SkmiftK0RjuXqFvZg2q4p68uoPGuxhzBN0s=
 | 
					code.gitea.io/gitea-vet v0.2.1 h1:b30by7+3SkmiftK0RjuXqFvZg2q4p68uoPGuxhzBN0s=
 | 
				
			||||||
code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFjGGfE=
 | 
					code.gitea.io/gitea-vet v0.2.1/go.mod h1:zcNbT/aJEmivCAhfmkHOlT645KNOf9W2KnkLgFjGGfE=
 | 
				
			||||||
code.gitea.io/sdk/gitea v0.13.1 h1:Y7bpH2iO6Q0KhhMJfjP/LZ0AmiYITeRQlCD8b0oYqhk=
 | 
					code.gitea.io/sdk/gitea v0.13.1 h1:Y7bpH2iO6Q0KhhMJfjP/LZ0AmiYITeRQlCD8b0oYqhk=
 | 
				
			||||||
@@ -86,13 +85,10 @@ github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzS
 | 
				
			|||||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
					github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 | 
					github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 | 
				
			||||||
github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
 | 
					 | 
				
			||||||
github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0=
 | 
					github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0=
 | 
				
			||||||
github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0=
 | 
					github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0=
 | 
				
			||||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 | 
					github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 | 
				
			||||||
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
 | 
					 | 
				
			||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 | 
					github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 | 
				
			||||||
github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
 | 
					 | 
				
			||||||
github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE=
 | 
					github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE=
 | 
				
			||||||
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
 | 
					github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
					github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
				
			||||||
@@ -102,11 +98,10 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV
 | 
				
			|||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
					github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 | 
				
			||||||
github.com/RoaringBitmap/roaring v0.4.23 h1:gpyfd12QohbqhFO4NVDUdoPOCXsyahYRQhINmlHxKeo=
 | 
					github.com/RoaringBitmap/roaring v0.4.23 h1:gpyfd12QohbqhFO4NVDUdoPOCXsyahYRQhINmlHxKeo=
 | 
				
			||||||
github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
 | 
					github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
 | 
				
			||||||
github.com/RoaringBitmap/roaring v0.5.1 h1:ugdwntNygzk1FZnmtxUr+jM9AYrpU3I3zpt49npDWVo=
 | 
					github.com/RoaringBitmap/roaring v0.5.5 h1:naNqvO1mNnghk2UvcsqnzHDBn9DRbCIRy94GmDTRVTQ=
 | 
				
			||||||
github.com/RoaringBitmap/roaring v0.5.1/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo=
 | 
					github.com/RoaringBitmap/roaring v0.5.5/go.mod h1:puNo5VdzwbaIQxSiDIwfXl4Hnc+fbovcX4IW/dSTtUk=
 | 
				
			||||||
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 | 
					github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 | 
				
			||||||
github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 | 
					github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 | 
				
			||||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 | 
					 | 
				
			||||||
github.com/Unknwon/com v0.0.0-20190321035513-0fed4efef755/go.mod h1:voKvFVpXBJxdIPeqjoJuLK+UVcRlo/JLjeToGxPYu68=
 | 
					github.com/Unknwon/com v0.0.0-20190321035513-0fed4efef755/go.mod h1:voKvFVpXBJxdIPeqjoJuLK+UVcRlo/JLjeToGxPYu68=
 | 
				
			||||||
github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
 | 
					github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
 | 
				
			||||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
 | 
					github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
 | 
				
			||||||
@@ -189,7 +184,6 @@ github.com/blevesearch/zap/v14 v14.0.3 h1:ccEv296u6DEUHFF9U4W2E/6/WkbuDrS9/1VJM3
 | 
				
			|||||||
github.com/blevesearch/zap/v14 v14.0.3/go.mod h1:oObAhcDHw7p1ahiTCqhRkdxdl7UA8qpvX10pSgrTMHc=
 | 
					github.com/blevesearch/zap/v14 v14.0.3/go.mod h1:oObAhcDHw7p1ahiTCqhRkdxdl7UA8qpvX10pSgrTMHc=
 | 
				
			||||||
github.com/blevesearch/zap/v15 v15.0.1 h1:jEism63eY+qdcvwXH0K8MiKhv5tb10T1k7SNx6fauCM=
 | 
					github.com/blevesearch/zap/v15 v15.0.1 h1:jEism63eY+qdcvwXH0K8MiKhv5tb10T1k7SNx6fauCM=
 | 
				
			||||||
github.com/blevesearch/zap/v15 v15.0.1/go.mod h1:ho0frqAex2ktT9cYFAxQpoQXsxb/KEfdjpx4s49rf/M=
 | 
					github.com/blevesearch/zap/v15 v15.0.1/go.mod h1:ho0frqAex2ktT9cYFAxQpoQXsxb/KEfdjpx4s49rf/M=
 | 
				
			||||||
github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc=
 | 
					 | 
				
			||||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI=
 | 
					github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI=
 | 
				
			||||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
 | 
					github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
 | 
				
			||||||
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 h1:U/lr3Dgy4WK+hNk4tyD+nuGjpVLPEHuJSFXMw11/HPA=
 | 
					github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668 h1:U/lr3Dgy4WK+hNk4tyD+nuGjpVLPEHuJSFXMw11/HPA=
 | 
				
			||||||
@@ -254,18 +248,18 @@ github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs
 | 
				
			|||||||
github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 h1:MZRmHqDBd0vxNwenEbKSQqRVT24d3C05ft8kduSwlqM=
 | 
					github.com/cznic/strutil v0.0.0-20181122101858-275e90344537 h1:MZRmHqDBd0vxNwenEbKSQqRVT24d3C05ft8kduSwlqM=
 | 
				
			||||||
github.com/cznic/strutil v0.0.0-20181122101858-275e90344537/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
 | 
					github.com/cznic/strutil v0.0.0-20181122101858-275e90344537/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
 | 
				
			||||||
github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
 | 
					github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
 | 
				
			||||||
github.com/daixiang0/gci v0.2.4/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4=
 | 
					 | 
				
			||||||
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ=
 | 
					github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ=
 | 
				
			||||||
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk=
 | 
					github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0=
 | 
					 | 
				
			||||||
github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
 | 
					github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
 | 
				
			||||||
github.com/denisenkom/go-mssqldb v0.0.0-20190924004331-208c0a498538/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
 | 
					github.com/denisenkom/go-mssqldb v0.0.0-20190924004331-208c0a498538/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
 | 
				
			||||||
github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
 | 
					github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
 | 
				
			||||||
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzqk8QCaRC4os14xoKDdbHqqlJtJA0oc1ZAjg=
 | 
					github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc h1:VRRKCwnzqk8QCaRC4os14xoKDdbHqqlJtJA0oc1ZAjg=
 | 
				
			||||||
github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
 | 
					github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
 | 
				
			||||||
 | 
					github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D0yGjAk=
 | 
				
			||||||
 | 
					github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
 | 
				
			||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
 | 
					github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
 | 
				
			||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
					github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
				
			||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
					github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
				
			||||||
@@ -284,8 +278,8 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn
 | 
				
			|||||||
github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
 | 
					github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
 | 
				
			||||||
github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
 | 
					github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
 | 
				
			||||||
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
 | 
					github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
 | 
				
			||||||
github.com/editorconfig/editorconfig-core-go/v2 v2.3.7 h1:e88U5ztaklGv7X0gHIgR/cCJmHkLyVAS8aOIoEPKJP0=
 | 
					github.com/editorconfig/editorconfig-core-go/v2 v2.3.8 h1:nq6QPrFjoI1QP9trhj+bsXoS8MSjhTgQXgTavA5zPbg=
 | 
				
			||||||
github.com/editorconfig/editorconfig-core-go/v2 v2.3.7/go.mod h1:NifC+uYhAGV/U2AxhZa3bNy4EdFMHz9mVU02vbGSMWQ=
 | 
					github.com/editorconfig/editorconfig-core-go/v2 v2.3.8/go.mod h1:z7TIMh40583cev3v8ei7V1RRPKeHQbttoa4Vm5/5u7g=
 | 
				
			||||||
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
 | 
					github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
 | 
				
			||||||
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
 | 
					github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
 | 
				
			||||||
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
 | 
					github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
 | 
				
			||||||
@@ -294,8 +288,7 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
 | 
				
			|||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
					github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 | 
					github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
 | 
				
			||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
					github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
				
			||||||
github.com/ethantkoenig/rupture v0.0.0-20180203182544-0a76f03a811a h1:M1bRpaZAn4GSsqu3hdK2R8H0AH9O6vqCTCbm2oAFGfE=
 | 
					github.com/ethantkoenig/rupture v0.0.0-20181029165146-c3b3b810dc77/go.mod h1:MkKY/CB98aVE4VxO63X5vTQKUgcn+3XP15LMASe3lYs=
 | 
				
			||||||
github.com/ethantkoenig/rupture v0.0.0-20180203182544-0a76f03a811a/go.mod h1:MkKY/CB98aVE4VxO63X5vTQKUgcn+3XP15LMASe3lYs=
 | 
					 | 
				
			||||||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ=
 | 
					github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ=
 | 
				
			||||||
github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64=
 | 
					github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64=
 | 
				
			||||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
 | 
					github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
 | 
				
			||||||
@@ -313,9 +306,6 @@ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8
 | 
				
			|||||||
github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 | 
					github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 | 
				
			||||||
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
 | 
					github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
 | 
				
			||||||
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
 | 
					github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
 | 
				
			||||||
github.com/frankban/quicktest v1.4.0/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ=
 | 
					 | 
				
			||||||
github.com/frankban/quicktest v1.10.0 h1:Gfh+GAJZOAoKZsIZeZbdn2JF10kN1XHNvjsvQK8gVkE=
 | 
					 | 
				
			||||||
github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
 | 
					 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
					github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 | 
					github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 | 
					github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 | 
				
			||||||
@@ -333,7 +323,6 @@ github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31 h1:gclg6gY70GLy
 | 
				
			|||||||
github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
 | 
					github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24=
 | 
				
			||||||
github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8=
 | 
					github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8=
 | 
				
			||||||
github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
 | 
					github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
 | 
				
			||||||
github.com/go-critic/go-critic v0.5.2/go.mod h1:cc0+HvdE3lFpqLecgqMaJcvWWH77sLdBp+wLGPM1Yyo=
 | 
					 | 
				
			||||||
github.com/go-enry/go-enry/v2 v2.5.2 h1:3f3PFAO6JitWkPi1GQ5/m6Xu4gNL1U5soJ8QaYqJ0YQ=
 | 
					github.com/go-enry/go-enry/v2 v2.5.2 h1:3f3PFAO6JitWkPi1GQ5/m6Xu4gNL1U5soJ8QaYqJ0YQ=
 | 
				
			||||||
github.com/go-enry/go-enry/v2 v2.5.2/go.mod h1:GVzIiAytiS5uT/QiuakK7TF1u4xDab87Y8V5EJRpsIQ=
 | 
					github.com/go-enry/go-enry/v2 v2.5.2/go.mod h1:GVzIiAytiS5uT/QiuakK7TF1u4xDab87Y8V5EJRpsIQ=
 | 
				
			||||||
github.com/go-enry/go-oniguruma v1.2.1 h1:k8aAMuJfMrqm/56SG2lV9Cfti6tC4x8673aHCcBk+eo=
 | 
					github.com/go-enry/go-oniguruma v1.2.1 h1:k8aAMuJfMrqm/56SG2lV9Cfti6tC4x8673aHCcBk+eo=
 | 
				
			||||||
@@ -357,7 +346,6 @@ github.com/go-ldap/ldap/v3 v3.2.4/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjR
 | 
				
			|||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
					github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
				
			||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
					github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
				
			||||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 | 
					github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 | 
				
			||||||
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
 | 
					 | 
				
			||||||
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
 | 
					github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
 | 
				
			||||||
github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
 | 
					github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
 | 
				
			||||||
github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
 | 
					github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
 | 
				
			||||||
@@ -439,19 +427,8 @@ github.com/go-swagger/go-swagger v0.25.0 h1:FxhyrWWV8V/A9P6GtI5szWordAdbb6Y0nqdY
 | 
				
			|||||||
github.com/go-swagger/go-swagger v0.25.0/go.mod h1:9639ioXrPX9E6BbnbaDklGXjNz7upAXoNBwL4Ok11Vk=
 | 
					github.com/go-swagger/go-swagger v0.25.0/go.mod h1:9639ioXrPX9E6BbnbaDklGXjNz7upAXoNBwL4Ok11Vk=
 | 
				
			||||||
github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0=
 | 
					github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013 h1:l9rI6sNaZgNC0LnF3MiE+qTmyBA/tZAg1rtyrGbUMK0=
 | 
				
			||||||
github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0=
 | 
					github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0=
 | 
				
			||||||
github.com/go-testfixtures/testfixtures/v3 v3.4.0 h1:cny44xqH4ctXRld/COxFGPC7XDyOU8KNnwmfCxEEqoQ=
 | 
					github.com/go-testfixtures/testfixtures/v3 v3.4.1 h1:Qz9y0wUOXPHzKhK6C79A/menChtEu/xd0Dn5ngVyMD0=
 | 
				
			||||||
github.com/go-testfixtures/testfixtures/v3 v3.4.0/go.mod h1:P4L3WxgOsCLbAeUC50qX5rdj1ULZfUMqgCbqah3OH5U=
 | 
					github.com/go-testfixtures/testfixtures/v3 v3.4.1/go.mod h1:P4L3WxgOsCLbAeUC50qX5rdj1ULZfUMqgCbqah3OH5U=
 | 
				
			||||||
github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
 | 
					 | 
				
			||||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
 | 
					 | 
				
			||||||
github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
 | 
					github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
 | 
				
			||||||
github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
 | 
					github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
 | 
				
			||||||
github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
 | 
					github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
 | 
				
			||||||
@@ -479,7 +456,6 @@ github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/V
 | 
				
			|||||||
github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 | 
					github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 | 
				
			||||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
 | 
					github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
 | 
				
			||||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
 | 
					github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
 | 
				
			||||||
github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 | 
					 | 
				
			||||||
github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
 | 
					github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
 | 
				
			||||||
github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 | 
					github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 | 
				
			||||||
github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
 | 
					github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
 | 
				
			||||||
@@ -526,21 +502,6 @@ github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 | 
				
			|||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
					github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
				
			||||||
github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw=
 | 
					github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw=
 | 
				
			||||||
github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
					github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
				
			||||||
github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
 | 
					 | 
				
			||||||
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
 | 
					 | 
				
			||||||
github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
 | 
					 | 
				
			||||||
github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
 | 
					 | 
				
			||||||
github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
 | 
					 | 
				
			||||||
github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
 | 
					 | 
				
			||||||
github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
 | 
					 | 
				
			||||||
github.com/golangci/golangci-lint v1.31.0/go.mod h1:aMQuNCA+NDU5+4jLL5pEuFHoue0IznKE2+/GsFvvs8A=
 | 
					 | 
				
			||||||
github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
 | 
					 | 
				
			||||||
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
 | 
					 | 
				
			||||||
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
 | 
					 | 
				
			||||||
github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
 | 
					 | 
				
			||||||
github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
 | 
					 | 
				
			||||||
github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
 | 
					 | 
				
			||||||
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
 | 
					 | 
				
			||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
					github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
				
			||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
					github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
				
			||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
					github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
				
			||||||
@@ -576,7 +537,6 @@ github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
 | 
				
			|||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 | 
					github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 | 
					github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 | 
				
			||||||
github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
 | 
					 | 
				
			||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
					github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
				
			||||||
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
					github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
				
			||||||
github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
					github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
				
			||||||
@@ -601,10 +561,7 @@ github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE
 | 
				
			|||||||
github.com/gorilla/sessions v1.2.0 h1:S7P+1Hm5V/AT9cjEcUD5uDaQSX0OE577aCXgoaKpYbQ=
 | 
					github.com/gorilla/sessions v1.2.0 h1:S7P+1Hm5V/AT9cjEcUD5uDaQSX0OE577aCXgoaKpYbQ=
 | 
				
			||||||
github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
 | 
					github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
 | 
				
			||||||
github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
					github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
				
			||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
					 | 
				
			||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
					github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
				
			||||||
github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
 | 
					 | 
				
			||||||
github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
 | 
					 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
					github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
					github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
					github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
				
			||||||
@@ -623,8 +580,8 @@ github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh
 | 
				
			|||||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
 | 
					github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
 | 
				
			||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
 | 
					github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
 | 
				
			||||||
github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
					github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
				
			||||||
github.com/hashicorp/go-retryablehttp v0.6.7 h1:8/CAEZt/+F7kR7GevNHulKkUjLht3CPmn7egmhieNKo=
 | 
					github.com/hashicorp/go-retryablehttp v0.6.8 h1:92lWxgpa+fF3FozM4B3UZtHZMJX8T5XT+TFdCxsPyWs=
 | 
				
			||||||
github.com/hashicorp/go-retryablehttp v0.6.7/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
					github.com/hashicorp/go-retryablehttp v0.6.8/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
				
			||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
 | 
					github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
 | 
				
			||||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
 | 
					github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
 | 
				
			||||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
 | 
					github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
 | 
				
			||||||
@@ -698,20 +655,15 @@ github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0f
 | 
				
			|||||||
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
					github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
				
			||||||
github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
					github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
 | 
				
			||||||
github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4=
 | 
					github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4=
 | 
				
			||||||
github.com/jaytaylor/html2text v0.0.0-20160923191438-8fb95d837f7d h1:ig/iUfDDg06RVW8OMby+GrmW6K2nPO3AFHlEIdvJSd4=
 | 
					github.com/jaytaylor/html2text v0.0.0-20200412013138-3577fbdbcff7/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk=
 | 
				
			||||||
github.com/jaytaylor/html2text v0.0.0-20160923191438-8fb95d837f7d/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk=
 | 
					 | 
				
			||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
 | 
					github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
 | 
				
			||||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
 | 
					github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
 | 
				
			||||||
github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=
 | 
					github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA=
 | 
				
			||||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
 | 
					github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
 | 
				
			||||||
github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s=
 | 
					 | 
				
			||||||
github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
 | 
					 | 
				
			||||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 | 
					github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
 | 
				
			||||||
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
 | 
					github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
 | 
				
			||||||
github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U=
 | 
					github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U=
 | 
				
			||||||
github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
 | 
					github.com/jmhodges/levigo v1.0.0/go.mod h1:Q6Qx+uH3RAqyK4rFQroq9RL7mdkABMcfhEI+nNuzMJQ=
 | 
				
			||||||
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
 | 
					 | 
				
			||||||
github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
 | 
					 | 
				
			||||||
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
 | 
					github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
 | 
				
			||||||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 | 
					github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 | 
				
			||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 | 
					github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 | 
				
			||||||
@@ -732,8 +684,7 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
 | 
				
			|||||||
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 | 
					github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 | 
				
			||||||
github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
 | 
					github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
 | 
				
			||||||
github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
 | 
					github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
 | 
				
			||||||
github.com/kballard/go-shellquote v0.0.0-20170619183022-cd60e84ee657 h1:vE7J1m7cCpiRVEIr1B5ccDxRpbPsWT5JU3if2Di5nE4=
 | 
					github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 | 
				
			||||||
github.com/kballard/go-shellquote v0.0.0-20170619183022-cd60e84ee657/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 | 
					 | 
				
			||||||
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
 | 
					github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY=
 | 
				
			||||||
github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
 | 
					github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
 | 
				
			||||||
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4 h1:cTxwSmnaqLoo+4tLukHoB9iqHOu3LmLhRmgUxZo6Vp4=
 | 
					github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4 h1:cTxwSmnaqLoo+4tLukHoB9iqHOu3LmLhRmgUxZo6Vp4=
 | 
				
			||||||
@@ -744,7 +695,6 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
 | 
				
			|||||||
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
					github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
				
			||||||
github.com/klauspost/compress v1.9.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
					github.com/klauspost/compress v1.9.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
				
			||||||
github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
					github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
				
			||||||
github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
					 | 
				
			||||||
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
					github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
				
			||||||
github.com/klauspost/compress v1.11.2 h1:MiK62aErc3gIiVEtyzKfeOHgW7atJb5g/KNX5m3c2nQ=
 | 
					github.com/klauspost/compress v1.11.2 h1:MiK62aErc3gIiVEtyzKfeOHgW7atJb5g/KNX5m3c2nQ=
 | 
				
			||||||
github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
					github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
				
			||||||
@@ -771,7 +721,6 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 | 
				
			|||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
					github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
				
			||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 | 
					github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 | 
				
			||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 | 
					github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 | 
				
			||||||
github.com/kyoh86/exportloopref v0.1.7/go.mod h1:h1rDl2Kdj97+Kwh4gdz3ujE7XHmH51Q0lUiZ1z4NLj8=
 | 
					 | 
				
			||||||
github.com/lafriks/xormstore v1.3.2 h1:hqi3F8s/B4rz8GuEZZDuHuOxRjeuOpEI/cC7vcnWwH4=
 | 
					github.com/lafriks/xormstore v1.3.2 h1:hqi3F8s/B4rz8GuEZZDuHuOxRjeuOpEI/cC7vcnWwH4=
 | 
				
			||||||
github.com/lafriks/xormstore v1.3.2/go.mod h1:mVNIwIa25QIr8rfR7YlVjrqN/apswHkVdtLCyVYBzXw=
 | 
					github.com/lafriks/xormstore v1.3.2/go.mod h1:mVNIwIa25QIr8rfR7YlVjrqN/apswHkVdtLCyVYBzXw=
 | 
				
			||||||
github.com/lestrrat-go/jwx v0.9.0/go.mod h1:iEoxlYfZjvoGpuWwxUz+eR5e6KTJGsaRcy/YNA/UnBk=
 | 
					github.com/lestrrat-go/jwx v0.9.0/go.mod h1:iEoxlYfZjvoGpuWwxUz+eR5e6KTJGsaRcy/YNA/UnBk=
 | 
				
			||||||
@@ -784,7 +733,6 @@ github.com/lib/pq v1.8.1-0.20200908161135-083382b7e6fc h1:ERSU1OvZ6MdWhHieo2oT7x
 | 
				
			|||||||
github.com/lib/pq v1.8.1-0.20200908161135-083382b7e6fc/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 | 
					github.com/lib/pq v1.8.1-0.20200908161135-083382b7e6fc/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 | 
				
			||||||
github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
 | 
					github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
 | 
				
			||||||
github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
 | 
					github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
 | 
				
			||||||
github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
 | 
					 | 
				
			||||||
github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96 h1:uNwtsDp7ci48vBTTxDuwcoTXz4lwtDTe7TjCQ0noaWY=
 | 
					github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96 h1:uNwtsDp7ci48vBTTxDuwcoTXz4lwtDTe7TjCQ0noaWY=
 | 
				
			||||||
github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96/go.mod h1:mmIfjCSQlGYXmJ95jFN84AkQFnVABtKuJL8IrzwvUKQ=
 | 
					github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96/go.mod h1:mmIfjCSQlGYXmJ95jFN84AkQFnVABtKuJL8IrzwvUKQ=
 | 
				
			||||||
github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de h1:nyxwRdWHAVxpFcDThedEgQ07DbcRc5xgNObtbTp76fk=
 | 
					github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de h1:nyxwRdWHAVxpFcDThedEgQ07DbcRc5xgNObtbTp76fk=
 | 
				
			||||||
@@ -803,13 +751,11 @@ github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8
 | 
				
			|||||||
github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
 | 
					github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
 | 
				
			||||||
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
 | 
					github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
 | 
				
			||||||
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 | 
					github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 | 
				
			||||||
github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU=
 | 
					 | 
				
			||||||
github.com/markbates/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA=
 | 
					github.com/markbates/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA=
 | 
				
			||||||
github.com/markbates/goth v1.65.0 h1:IbXpMneUhqbxgJ8JP1Ghl8ghlAaVX66jWDAapU1KxqU=
 | 
					github.com/markbates/goth v1.65.0 h1:IbXpMneUhqbxgJ8JP1Ghl8ghlAaVX66jWDAapU1KxqU=
 | 
				
			||||||
github.com/markbates/goth v1.65.0/go.mod h1:65frybxoeSCfORin51KOKqAKbIh7wREIDvdCkdWj//4=
 | 
					github.com/markbates/goth v1.65.0/go.mod h1:65frybxoeSCfORin51KOKqAKbIh7wREIDvdCkdWj//4=
 | 
				
			||||||
github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
 | 
					github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
 | 
				
			||||||
github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 | 
					github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 | 
				
			||||||
github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
 | 
					 | 
				
			||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 | 
					github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
 | 
					github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
					github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
				
			||||||
@@ -830,22 +776,20 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp
 | 
				
			|||||||
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
					github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
				
			||||||
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
 | 
					github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
 | 
				
			||||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
					github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
					 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
					github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
					github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA=
 | 
					github.com/mattn/go-sqlite3 v1.14.0 h1:mLyGNKR8+Vv9CAU7PphKa2hkEqxxhn8i32J6FPj1/QA=
 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
 | 
					github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus=
 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.14.4 h1:4rQjbDxdu9fSgI/r3KN72G3c2goxknAqHHgPWWs8UlI=
 | 
					github.com/mattn/go-sqlite3 v1.14.4 h1:4rQjbDxdu9fSgI/r3KN72G3c2goxknAqHHgPWWs8UlI=
 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.14.4/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=
 | 
					github.com/mattn/go-sqlite3 v1.14.4/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI=
 | 
				
			||||||
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
 | 
					 | 
				
			||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 | 
					github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
 | 
				
			||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
					github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
				
			||||||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc86qNFvby9AqkLDibfChMtAg5QM=
 | 
					github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc86qNFvby9AqkLDibfChMtAg5QM=
 | 
				
			||||||
github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg=
 | 
					github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg=
 | 
				
			||||||
github.com/mgechev/revive v1.0.3-0.20200921231451-246eac737dc7 h1:ydVkpU/M4/c45yT3e5lzMeguKJm9GxGgsawx4/XlwK0=
 | 
					github.com/mgechev/revive v1.0.3-0.20200921231451-246eac737dc7 h1:ydVkpU/M4/c45yT3e5lzMeguKJm9GxGgsawx4/XlwK0=
 | 
				
			||||||
github.com/mgechev/revive v1.0.3-0.20200921231451-246eac737dc7/go.mod h1:no/hfevHbndpXR5CaJahkYCfM/FFpmM/dSOwFGU7Z1o=
 | 
					github.com/mgechev/revive v1.0.3-0.20200921231451-246eac737dc7/go.mod h1:no/hfevHbndpXR5CaJahkYCfM/FFpmM/dSOwFGU7Z1o=
 | 
				
			||||||
github.com/mholt/archiver/v3 v3.3.2 h1:L72ZVRKdmAWDB+Zl8isK+cb0bfaCa2JQlKCvEXUG1WQ=
 | 
					github.com/mholt/archiver/v3 v3.5.0 h1:nE8gZIrw66cu4osS/U7UW7YDuGMHssxKutU8IfWxwWE=
 | 
				
			||||||
github.com/mholt/archiver/v3 v3.3.2/go.mod h1:wZCaCDpKnb7vsqOlgW3WO756DciCRSCOZCVMkXkrxfs=
 | 
					github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc=
 | 
				
			||||||
github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg=
 | 
					github.com/microcosm-cc/bluemonday v1.0.4 h1:p0L+CTpo/PLFdkoPcJemLXG+fpMD7pYOoDEq1axMbGg=
 | 
				
			||||||
github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w=
 | 
					github.com/microcosm-cc/bluemonday v1.0.4/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w=
 | 
				
			||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 | 
					github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 | 
				
			||||||
@@ -856,11 +800,9 @@ github.com/minio/minio-go/v7 v7.0.5/go.mod h1:TA0CQCjJZHM5SJj9IjqR0NmpmQJ6bCbXif
 | 
				
			|||||||
github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
 | 
					github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
 | 
				
			||||||
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
 | 
					github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
 | 
				
			||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 | 
					github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 | 
				
			||||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
 | 
					 | 
				
			||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
					github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
				
			||||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 | 
					github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 | 
				
			||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
					github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
				
			||||||
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
 | 
					 | 
				
			||||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
 | 
					github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
 | 
				
			||||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
 | 
					github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
 | 
				
			||||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
 | 
					github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
 | 
				
			||||||
@@ -875,17 +817,15 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 | 
				
			|||||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 | 
					github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
 | 
				
			||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
					github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
				
			||||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 | 
					github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 | 
				
			||||||
github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
 | 
					 | 
				
			||||||
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c h1:3wkDRdxK92dF+c1ke2dtj7ZzemFWBHB9plnJOtlwdFA=
 | 
					github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c h1:3wkDRdxK92dF+c1ke2dtj7ZzemFWBHB9plnJOtlwdFA=
 | 
				
			||||||
github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM=
 | 
					github.com/mrjones/oauth v0.0.0-20180629183705-f4e24b6d100c/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM=
 | 
				
			||||||
github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
 | 
					github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg=
 | 
				
			||||||
github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=
 | 
					github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=
 | 
				
			||||||
github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
 | 
					github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
 | 
				
			||||||
github.com/msteinert/pam v0.0.0-20151204160544-02ccfbfaf0cc h1:z1PgdCCmYYVL0BoJTUgmAq1p7ca8fzYIPsNyfsN3xAU=
 | 
					github.com/msteinert/pam v0.0.0-20200810204841-913b8f8cdf8b h1:UZ7RWBA77dedMow4Zkek/gfJ/DRbti7C+Ny/Pf9D3gM=
 | 
				
			||||||
github.com/msteinert/pam v0.0.0-20151204160544-02ccfbfaf0cc/go.mod h1:np1wUFZ6tyoke22qDJZY40URn9Ae51gX7ljIWXN5TJs=
 | 
					github.com/msteinert/pam v0.0.0-20200810204841-913b8f8cdf8b/go.mod h1:np1wUFZ6tyoke22qDJZY40URn9Ae51gX7ljIWXN5TJs=
 | 
				
			||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
					github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
				
			||||||
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
					github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
				
			||||||
github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c=
 | 
					 | 
				
			||||||
github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
 | 
					github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg=
 | 
				
			||||||
github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
 | 
					github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU=
 | 
				
			||||||
github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
 | 
					github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k=
 | 
				
			||||||
@@ -893,14 +833,12 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE
 | 
				
			|||||||
github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
 | 
					github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
 | 
				
			||||||
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
 | 
					github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
 | 
				
			||||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
 | 
					github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
 | 
				
			||||||
github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
 | 
					 | 
				
			||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
 | 
					github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
 | 
				
			||||||
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
 | 
					github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
 | 
				
			||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 | 
					github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 | 
				
			||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 | 
					github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 | 
				
			||||||
github.com/niklasfasching/go-org v1.3.2 h1:ZKTSd+GdJYkoZl1pBXLR/k7DRiRXnmB96TRiHmHdzwI=
 | 
					github.com/niklasfasching/go-org v1.3.2 h1:ZKTSd+GdJYkoZl1pBXLR/k7DRiRXnmB96TRiHmHdzwI=
 | 
				
			||||||
github.com/niklasfasching/go-org v1.3.2/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU=
 | 
					github.com/niklasfasching/go-org v1.3.2/go.mod h1:AsLD6X7djzRIz4/RFZu8vwRL0VGjUvGZCCH1Nz0VdrU=
 | 
				
			||||||
github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0/go.mod h1:wBEpHwM2OdmeNpdCvRPUlkEbBuaFmcK4Wv8Q7FuGW3c=
 | 
					 | 
				
			||||||
github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E=
 | 
					github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E=
 | 
				
			||||||
github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ=
 | 
					github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ=
 | 
				
			||||||
github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
 | 
					github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
 | 
				
			||||||
@@ -914,8 +852,8 @@ github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn
 | 
				
			|||||||
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
 | 
					github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
 | 
				
			||||||
github.com/oliamb/cutter v0.2.2 h1:Lfwkya0HHNU1YLnGv2hTkzHfasrSMkgv4Dn+5rmlk3k=
 | 
					github.com/oliamb/cutter v0.2.2 h1:Lfwkya0HHNU1YLnGv2hTkzHfasrSMkgv4Dn+5rmlk3k=
 | 
				
			||||||
github.com/oliamb/cutter v0.2.2/go.mod h1:4BenG2/4GuRBDbVm/OPahDVqbrOemzpPiG5mi1iryBU=
 | 
					github.com/oliamb/cutter v0.2.2/go.mod h1:4BenG2/4GuRBDbVm/OPahDVqbrOemzpPiG5mi1iryBU=
 | 
				
			||||||
github.com/olivere/elastic/v7 v7.0.20 h1:5FFpGPVJlBSlWBOdict406Y3yNTIpVpAiUvdFZeSbAo=
 | 
					github.com/olivere/elastic/v7 v7.0.21 h1:58a2pMlLketCsLyKg8kJNJG+OZIFKrSQXX6gJBpqqlg=
 | 
				
			||||||
github.com/olivere/elastic/v7 v7.0.20/go.mod h1:Kh7iIsXIBl5qRQOBFoylCsXVTtye3keQU2Y/YbR7HD8=
 | 
					github.com/olivere/elastic/v7 v7.0.21/go.mod h1:Kh7iIsXIBl5qRQOBFoylCsXVTtye3keQU2Y/YbR7HD8=
 | 
				
			||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
				
			||||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
				
			||||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
				
			||||||
@@ -950,15 +888,17 @@ github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bA
 | 
				
			|||||||
github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
 | 
					github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM=
 | 
				
			||||||
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
 | 
					github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
 | 
				
			||||||
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
 | 
					github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
 | 
				
			||||||
github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw=
 | 
					 | 
				
			||||||
github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
 | 
					github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ=
 | 
				
			||||||
github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
 | 
					github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
 | 
				
			||||||
github.com/pierrec/cmdflag v0.0.2/go.mod h1:a3zKGZ3cdQUfxjd0RGMLZr8xI3nvpJOB+m6o/1X5BmU=
 | 
					github.com/philhofer/fwd v1.1.0 h1:PAdZw9+/BCf4gc/kA2L/PbGPkFe72Kl2GLZXTG8HpU8=
 | 
				
			||||||
 | 
					github.com/philhofer/fwd v1.1.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU=
 | 
				
			||||||
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
 | 
					github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
 | 
				
			||||||
github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
 | 
					github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
 | 
				
			||||||
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 | 
					github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 | 
				
			||||||
github.com/pierrec/lz4/v3 v3.3.2 h1:QTUOCbMNDbK4PYtkuHyOBd28C0UhPBw3T4OH4WpFDik=
 | 
					github.com/pierrec/lz4/v4 v4.0.3 h1:vNQKSVZNYUEAvRY9FaUXAF1XPbSOHJtDTiP41kzDz2E=
 | 
				
			||||||
github.com/pierrec/lz4/v3 v3.3.2/go.mod h1:280XNCGS8jAcG++AHdd6SeWnzyJ1w9oow2vbORyey8Q=
 | 
					github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 | 
				
			||||||
 | 
					github.com/pierrec/lz4/v4 v4.1.1 h1:cS6aGkNLJr4u+UwaA21yp+gbWN3WJWtKo1axmPDObMA=
 | 
				
			||||||
 | 
					github.com/pierrec/lz4/v4 v4.1.1/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 | 
				
			||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
					github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
				
			||||||
@@ -1004,9 +944,6 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O
 | 
				
			|||||||
github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
 | 
					github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4=
 | 
				
			||||||
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
					github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
				
			||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
					github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
				
			||||||
github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
 | 
					 | 
				
			||||||
github.com/quasilyte/go-ruleguard v0.2.0/go.mod h1:2RT/tf0Ce0UDj5y243iWKosQogJd8+1G3Rs2fxmlYnw=
 | 
					 | 
				
			||||||
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=
 | 
					 | 
				
			||||||
github.com/quasoft/websspi v1.0.0 h1:5nDgdM5xSur9s+B5w2xQ5kxf5nUGqgFgU4W0aDLZ8Mw=
 | 
					github.com/quasoft/websspi v1.0.0 h1:5nDgdM5xSur9s+B5w2xQ5kxf5nUGqgFgU4W0aDLZ8Mw=
 | 
				
			||||||
github.com/quasoft/websspi v1.0.0/go.mod h1:HmVdl939dQ0WIXZhyik+ARdI03M6bQzaSEKcgpFmewk=
 | 
					github.com/quasoft/websspi v1.0.0/go.mod h1:HmVdl939dQ0WIXZhyik+ARdI03M6bQzaSEKcgpFmewk=
 | 
				
			||||||
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 | 
					github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 | 
				
			||||||
@@ -1018,7 +955,6 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
 | 
				
			|||||||
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
					github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
					github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
					github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.6.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
					 | 
				
			||||||
github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc=
 | 
					github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc=
 | 
				
			||||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 | 
					github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 | 
				
			||||||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
 | 
					github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
 | 
				
			||||||
@@ -1027,25 +963,16 @@ github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNue
 | 
				
			|||||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 | 
					github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
 | 
					github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
					github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
				
			||||||
github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM=
 | 
					 | 
				
			||||||
github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA=
 | 
					 | 
				
			||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 | 
					github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 | 
				
			||||||
github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
 | 
					github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
 | 
				
			||||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 | 
					github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 | 
				
			||||||
github.com/schollz/progressbar/v2 v2.13.2/go.mod h1:6YZjqdthH6SCZKv2rqGryrxPtfmRB/DWZxSMfCXPyD8=
 | 
					 | 
				
			||||||
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
 | 
					github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
 | 
				
			||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 | 
					github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 | 
				
			||||||
github.com/securego/gosec/v2 v2.4.0/go.mod h1:0/Q4cjmlFDfDUj1+Fib61sc+U5IQb2w+Iv9/C3wPVko=
 | 
					 | 
				
			||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 | 
					github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 | 
				
			||||||
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
 | 
					github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
 | 
				
			||||||
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
 | 
					github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
 | 
				
			||||||
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
 | 
					 | 
				
			||||||
github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc=
 | 
					 | 
				
			||||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
 | 
					 | 
				
			||||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE=
 | 
					github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE=
 | 
				
			||||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
 | 
					github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
 | 
				
			||||||
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
 | 
					 | 
				
			||||||
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
 | 
					 | 
				
			||||||
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk=
 | 
					github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk=
 | 
				
			||||||
github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
 | 
					github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
 | 
				
			||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
 | 
					github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
 | 
				
			||||||
@@ -1076,9 +1003,7 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK
 | 
				
			|||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
					github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
				
			||||||
github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
 | 
					github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
 | 
				
			||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 | 
					github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 | 
				
			||||||
github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI=
 | 
					 | 
				
			||||||
github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
 | 
					github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
 | 
				
			||||||
github.com/sourcegraph/go-diff v0.6.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
 | 
					 | 
				
			||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 | 
					github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 | 
				
			||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 | 
					github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 | 
				
			||||||
github.com/spf13/afero v1.3.2 h1:GDarE4TJQI52kYSbSAmLiId1Elfj+xgSDqrUZxFhxlU=
 | 
					github.com/spf13/afero v1.3.2 h1:GDarE4TJQI52kYSbSAmLiId1Elfj+xgSDqrUZxFhxlU=
 | 
				
			||||||
@@ -1088,7 +1013,6 @@ github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
 | 
				
			|||||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
					github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
				
			||||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
					github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
				
			||||||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 | 
					github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
 | 
				
			||||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
 | 
					 | 
				
			||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 | 
					github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 | 
				
			||||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 | 
					github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 | 
				
			||||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
 | 
					github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
 | 
				
			||||||
@@ -1097,12 +1021,11 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
 | 
				
			|||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
					github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
				
			||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
					github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
				
			||||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 | 
					github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 | 
				
			||||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
 | 
					 | 
				
			||||||
github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
 | 
					github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
 | 
				
			||||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 | 
					github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 | 
				
			||||||
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
 | 
					github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
 | 
				
			||||||
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 | 
					github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 | 
				
			||||||
github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=
 | 
					github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM=
 | 
				
			||||||
github.com/steveyen/gtreap v0.1.0 h1:CjhzTa274PyJLJuMZwIzCO1PfC00oRa8d1Kc78bFXJM=
 | 
					github.com/steveyen/gtreap v0.1.0 h1:CjhzTa274PyJLJuMZwIzCO1PfC00oRa8d1Kc78bFXJM=
 | 
				
			||||||
github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7Z4dM9/Y=
 | 
					github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7Z4dM9/Y=
 | 
				
			||||||
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
 | 
					github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
 | 
				
			||||||
@@ -1121,56 +1044,44 @@ github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s
 | 
				
			|||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
					github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
				
			||||||
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
 | 
					github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
 | 
				
			||||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
 | 
					github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
 | 
				
			||||||
github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
 | 
					 | 
				
			||||||
github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 h1:HOxvxvnntLiPn123Fk+twfUhCQdMDaqmb0cclArW0T0=
 | 
					github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 h1:HOxvxvnntLiPn123Fk+twfUhCQdMDaqmb0cclArW0T0=
 | 
				
			||||||
github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8=
 | 
					github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481/go.mod h1:ahpPrc7HpcfEWDQRZEmnXMzHY03mLDYMCxeDzy46i+8=
 | 
				
			||||||
github.com/tetafro/godot v0.4.8/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0=
 | 
					 | 
				
			||||||
github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 | 
					github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 | 
				
			||||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 | 
					github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 | 
				
			||||||
github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
 | 
					 | 
				
			||||||
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
 | 
					github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
 | 
				
			||||||
github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
 | 
					github.com/tinylib/msgp v1.1.2 h1:gWmO7n0Ys2RBEb7GPYB9Ujq8Mk5p2U08lRnmMcGy6BQ=
 | 
				
			||||||
github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
 | 
					github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
 | 
				
			||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
					github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
				
			||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
					github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
				
			||||||
github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig=
 | 
					 | 
				
			||||||
github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ=
 | 
					github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ=
 | 
				
			||||||
github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM=
 | 
					github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM=
 | 
				
			||||||
github.com/tstranex/u2f v1.0.0 h1:HhJkSzDDlVSVIVt7pDJwCHQj67k7A5EeBgPmeD+pVsQ=
 | 
					github.com/tstranex/u2f v1.0.0 h1:HhJkSzDDlVSVIVt7pDJwCHQj67k7A5EeBgPmeD+pVsQ=
 | 
				
			||||||
github.com/tstranex/u2f v1.0.0/go.mod h1:eahSLaqAS0zsIEv80+vXT7WanXs7MQQDg3j3wGBSayo=
 | 
					github.com/tstranex/u2f v1.0.0/go.mod h1:eahSLaqAS0zsIEv80+vXT7WanXs7MQQDg3j3wGBSayo=
 | 
				
			||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 | 
					 | 
				
			||||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
 | 
					github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
 | 
				
			||||||
github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8=
 | 
					github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8=
 | 
				
			||||||
github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 | 
					github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 | 
				
			||||||
github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 | 
					github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 | 
				
			||||||
github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=
 | 
					github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ=
 | 
				
			||||||
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 | 
					github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 | 
				
			||||||
github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
 | 
					 | 
				
			||||||
github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA=
 | 
					 | 
				
			||||||
github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
 | 
					github.com/unknwon/com v0.0.0-20190804042917-757f69c95f3e/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
 | 
				
			||||||
github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
 | 
					github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
 | 
				
			||||||
github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
 | 
					github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
 | 
				
			||||||
github.com/unknwon/i18n v0.0.0-20190805065654-5c6446a380b6/go.mod h1:+5rDk6sDGpl3azws3O+f+GpFSyN9GVr0K8cvQLQM2ZQ=
 | 
					github.com/unknwon/i18n v0.0.0-20190805065654-5c6446a380b6/go.mod h1:+5rDk6sDGpl3azws3O+f+GpFSyN9GVr0K8cvQLQM2ZQ=
 | 
				
			||||||
github.com/unknwon/i18n v0.0.0-20200823051745-09abd91c7f2c h1:679/gJXwrsHC3RATr0YYjZvDMJPYN7W9FGSGNoLmKxM=
 | 
					github.com/unknwon/i18n v0.0.0-20200823051745-09abd91c7f2c h1:679/gJXwrsHC3RATr0YYjZvDMJPYN7W9FGSGNoLmKxM=
 | 
				
			||||||
github.com/unknwon/i18n v0.0.0-20200823051745-09abd91c7f2c/go.mod h1:+5rDk6sDGpl3azws3O+f+GpFSyN9GVr0K8cvQLQM2ZQ=
 | 
					github.com/unknwon/i18n v0.0.0-20200823051745-09abd91c7f2c/go.mod h1:+5rDk6sDGpl3azws3O+f+GpFSyN9GVr0K8cvQLQM2ZQ=
 | 
				
			||||||
github.com/unknwon/paginater v0.0.0-20151104151617-7748a72e0141 h1:Z79lyIznnziKADUf0J7EP8Z4ZL7YJDiPuaazlfUBSy4=
 | 
					github.com/unknwon/paginater v0.0.0-20200328080006-042474bd0eae/go.mod h1:1fdkY6xxl6ExVs2QFv7R0F5IRZHKA8RahhB9fMC9RvM=
 | 
				
			||||||
github.com/unknwon/paginater v0.0.0-20151104151617-7748a72e0141/go.mod h1:TBwoao3Q4Eb/cp+dHbXDfRTrZSsj/k7kLr2j1oWRWC0=
 | 
					 | 
				
			||||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 | 
					github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 | 
				
			||||||
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
					github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
				
			||||||
github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA=
 | 
					github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU=
 | 
				
			||||||
github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
					github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 | 
				
			||||||
github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM=
 | 
					 | 
				
			||||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 | 
					github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 | 
				
			||||||
github.com/valyala/fasthttp v1.15.1/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA=
 | 
					 | 
				
			||||||
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
 | 
					github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
 | 
				
			||||||
github.com/valyala/quicktemplate v1.6.2/go.mod h1:mtEJpQtUiBV0SHhMX6RtiJtqxncgrfmjcUy5T68X8TM=
 | 
					 | 
				
			||||||
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
 | 
					 | 
				
			||||||
github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc=
 | 
					github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc=
 | 
				
			||||||
github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
 | 
					github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
 | 
				
			||||||
github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE=
 | 
					github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE=
 | 
				
			||||||
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
 | 
					github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
 | 
				
			||||||
github.com/xanzy/go-gitlab v0.38.1 h1:st5/Ag4h8CqVfp3LpOWW0Jd4jYHTGETwu0KksYDPnYE=
 | 
					github.com/xanzy/go-gitlab v0.39.0 h1:7aiZ03fJfCdqoHFhsZq/SoVYp2lR91hfYWmiXLOU5Qo=
 | 
				
			||||||
github.com/xanzy/go-gitlab v0.38.1/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug=
 | 
					github.com/xanzy/go-gitlab v0.39.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug=
 | 
				
			||||||
github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
 | 
					github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70=
 | 
				
			||||||
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
 | 
					github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
 | 
				
			||||||
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
 | 
					github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
 | 
				
			||||||
@@ -1181,7 +1092,6 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q
 | 
				
			|||||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 | 
					github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 | 
				
			||||||
github.com/yohcop/openid-go v1.0.0 h1:EciJ7ZLETHR3wOtxBvKXx9RV6eyHZpCaSZ1inbBaUXE=
 | 
					github.com/yohcop/openid-go v1.0.0 h1:EciJ7ZLETHR3wOtxBvKXx9RV6eyHZpCaSZ1inbBaUXE=
 | 
				
			||||||
github.com/yohcop/openid-go v1.0.0/go.mod h1:/408xiwkeItSPJZSTPF7+VtZxPkPrRRpRNK2vjGh6yI=
 | 
					github.com/yohcop/openid-go v1.0.0/go.mod h1:/408xiwkeItSPJZSTPF7+VtZxPkPrRRpRNK2vjGh6yI=
 | 
				
			||||||
github.com/yuin/goldmark v1.1.7/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					 | 
				
			||||||
github.com/yuin/goldmark v1.1.22/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					github.com/yuin/goldmark v1.1.22/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
				
			||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
				
			||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
				
			||||||
@@ -1190,8 +1100,8 @@ github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM=
 | 
				
			|||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
				
			||||||
github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691 h1:VWSxtAiQNh3zgHJpdpkpVYjTPqRE3P6UZCOPa1nRDio=
 | 
					github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691 h1:VWSxtAiQNh3zgHJpdpkpVYjTPqRE3P6UZCOPa1nRDio=
 | 
				
			||||||
github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691/go.mod h1:YLF3kDffRfUH/bTxOxHhV6lxwIB3Vfj91rEwNMS9MXo=
 | 
					github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691/go.mod h1:YLF3kDffRfUH/bTxOxHhV6lxwIB3Vfj91rEwNMS9MXo=
 | 
				
			||||||
github.com/yuin/goldmark-meta v0.0.0-20191126180153-f0638e958b60 h1:gZucqLjL1eDzVWrXj4uiWeMbAopJlBR2mKQAsTGdPwo=
 | 
					github.com/yuin/goldmark-meta v1.0.0 h1:ScsatUIT2gFS6azqzLGUjgOnELsBOxMXerM3ogdJhAM=
 | 
				
			||||||
github.com/yuin/goldmark-meta v0.0.0-20191126180153-f0638e958b60/go.mod h1:i9VhcIHN2PxXMbQrKqXNueok6QNONoPjNMoj9MygVL0=
 | 
					github.com/yuin/goldmark-meta v1.0.0/go.mod h1:zsNNOrZ4nLuyHAJeLQEZcQat8dm70SmB2kHbls092Gc=
 | 
				
			||||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 | 
					github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 | 
				
			||||||
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 | 
					github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 | 
				
			||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
					go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
				
			||||||
@@ -1330,8 +1240,8 @@ golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81R
 | 
				
			|||||||
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10 h1:YfxMZzv3PjGonQYNUaeU2+DhAdqOxerQ30JFB6WgAXo=
 | 
					golang.org/x/net v0.0.0-20200930145003-4acb6c075d10 h1:YfxMZzv3PjGonQYNUaeU2+DhAdqOxerQ30JFB6WgAXo=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200930145003-4acb6c075d10/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb h1:mUVeFHoDKis5nxCAzoAi7E8Ghb86EXh/RK6wtvJIqRY=
 | 
					golang.org/x/net v0.0.0-20201031054903-ff519b6c9102 h1:42cLlJJdEh+ySyeUUbEQ5bsTiq8voBeTuweGVkY6Puw=
 | 
				
			||||||
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
					golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
					golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
					golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
					golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
				
			||||||
@@ -1408,7 +1318,6 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
				
			|||||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
@@ -1419,6 +1328,8 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
				
			|||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211 h1:9UQO31fZ+0aKQOFldThf7BKPMJTiBfWycGh/u3UoO88=
 | 
					golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211 h1:9UQO31fZ+0aKQOFldThf7BKPMJTiBfWycGh/u3UoO88=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20201106081118-db71ae66460a h1:ALUFBKlIyeY7y5ZgPJmblk/vKz+zBQSnNiPkt41sgeg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20201106081118-db71ae66460a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
@@ -1434,19 +1345,14 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
 | 
				
			|||||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s=
 | 
					golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s=
 | 
				
			||||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
					golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
@@ -1461,15 +1367,12 @@ golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgw
 | 
				
			|||||||
golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
@@ -1481,7 +1384,6 @@ golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapK
 | 
				
			|||||||
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
@@ -1491,38 +1393,29 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK
 | 
				
			|||||||
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
					golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
					golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200321224714-0d839f3cf2ed/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200519015757-0d0afa43d58a/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200701041122-1837592efa10/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
 | 
					golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200921210052-fa0125251cc4 h1:v8Jgq9X6Es9K9otVr9jxENEJigepKMZgA9OmrIZDtFA=
 | 
					golang.org/x/tools v0.0.0-20200921210052-fa0125251cc4 h1:v8Jgq9X6Es9K9otVr9jxENEJigepKMZgA9OmrIZDtFA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200921210052-fa0125251cc4/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
 | 
					golang.org/x/tools v0.0.0-20200921210052-fa0125251cc4/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20200928182047-19e03678916f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f h1:18s2P7JILnVhIF2+ZtGJQ9czV5bvTsb13/UGtNPDbjA=
 | 
					golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f h1:18s2P7JILnVhIF2+ZtGJQ9czV5bvTsb13/UGtNPDbjA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
 | 
					golang.org/x/tools v0.0.0-20200929161345-d7fc70abf50f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
@@ -1648,7 +1541,6 @@ gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			|||||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ini.v1 v1.60.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.60.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ini.v1 v1.60.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					 | 
				
			||||||
gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
 | 
					gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
 | 
				
			||||||
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 | 
					gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 | 
				
			||||||
@@ -1678,11 +1570,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
 | 
				
			|||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 | 
					honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 | 
				
			||||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
					honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
				
			||||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
					honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
				
			||||||
honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
					 | 
				
			||||||
mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f/go.mod h1:9VQ397fNXEnF84t90W4r4TRCQK+pg9f8ugVfyj+S26w=
 | 
					 | 
				
			||||||
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 | 
					 | 
				
			||||||
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
 | 
					 | 
				
			||||||
mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw=
 | 
					 | 
				
			||||||
mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A=
 | 
					mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A=
 | 
				
			||||||
mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8=
 | 
					mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8=
 | 
				
			||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 | 
					rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								vendor/github.com/RoaringBitmap/roaring/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/RoaringBitmap/roaring/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -8,7 +8,6 @@ install:
 | 
				
			|||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  email: false
 | 
					  email: false
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
- "1.12.x"
 | 
					 | 
				
			||||||
- "1.13.x"
 | 
					- "1.13.x"
 | 
				
			||||||
- "1.14.x"
 | 
					- "1.14.x"
 | 
				
			||||||
- tip
 | 
					- tip
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/RoaringBitmap/roaring/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/RoaringBitmap/roaring/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -13,4 +13,6 @@ Forud Ghafouri (@fzerorubigd),
 | 
				
			|||||||
Joe Nall (@joenall),
 | 
					Joe Nall (@joenall),
 | 
				
			||||||
(@fredim),
 | 
					(@fredim),
 | 
				
			||||||
Edd Robinson (@e-dard),
 | 
					Edd Robinson (@e-dard),
 | 
				
			||||||
Alexander Petrov (@alldroll)
 | 
					Alexander Petrov (@alldroll),
 | 
				
			||||||
 | 
					Guy Molinari (@guymolinari),
 | 
				
			||||||
 | 
					Ling Jin (@JinLingChristopher)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										88
									
								
								vendor/github.com/RoaringBitmap/roaring/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										88
									
								
								vendor/github.com/RoaringBitmap/roaring/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -3,7 +3,6 @@ roaring [](https
 | 
				
			|||||||

 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||

 | 
					 | 
				
			||||||
=============
 | 
					=============
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This is a go version of the Roaring bitmap data structure. 
 | 
					This is a go version of the Roaring bitmap data structure. 
 | 
				
			||||||
@@ -56,6 +55,93 @@ This code is licensed under Apache License, Version 2.0 (ASL2.0).
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Copyright 2016-... by the authors.
 | 
					Copyright 2016-... by the authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When should you use a bitmap?
 | 
				
			||||||
 | 
					===================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sets are a fundamental abstraction in
 | 
				
			||||||
 | 
					software. They can be implemented in various
 | 
				
			||||||
 | 
					ways, as hash sets, as trees, and so forth.
 | 
				
			||||||
 | 
					In databases and search engines, sets are often an integral
 | 
				
			||||||
 | 
					part of indexes. For example, we may need to maintain a set
 | 
				
			||||||
 | 
					of all documents or rows  (represented by numerical identifier)
 | 
				
			||||||
 | 
					that satisfy some property. Besides adding or removing
 | 
				
			||||||
 | 
					elements from the set, we need fast functions
 | 
				
			||||||
 | 
					to compute the intersection, the union, the difference between sets, and so on.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To implement a set
 | 
				
			||||||
 | 
					of integers, a particularly appealing strategy is the
 | 
				
			||||||
 | 
					bitmap (also called bitset or bit vector). Using n bits,
 | 
				
			||||||
 | 
					we can represent any set made of the integers from the range
 | 
				
			||||||
 | 
					[0,n): the ith bit is set to one if integer i is present in the set.
 | 
				
			||||||
 | 
					Commodity processors use words of W=32 or W=64 bits. By combining many such words, we can
 | 
				
			||||||
 | 
					support large values of n. Intersections, unions and differences can then be implemented
 | 
				
			||||||
 | 
					 as bitwise AND, OR and ANDNOT operations.
 | 
				
			||||||
 | 
					More complicated set functions can also be implemented as bitwise operations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When the bitset approach is applicable, it can be orders of
 | 
				
			||||||
 | 
					magnitude faster than other possible implementation of a set (e.g., as a hash set)
 | 
				
			||||||
 | 
					while using several times less memory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					However, a bitset, even a compressed one is not always applicable. For example, if the
 | 
				
			||||||
 | 
					you have 1000 random-looking integers, then a simple array might be the best representation.
 | 
				
			||||||
 | 
					We refer to this case as the "sparse" scenario.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When should you use compressed bitmaps?
 | 
				
			||||||
 | 
					===================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					An uncompressed BitSet can use a lot of memory. For example, if you take a BitSet
 | 
				
			||||||
 | 
					and set the bit at position 1,000,000 to true and you have just over 100kB. That is over 100kB
 | 
				
			||||||
 | 
					to store the position of one bit. This is wasteful  even if you do not care about memory:
 | 
				
			||||||
 | 
					suppose that you need to compute the intersection between this BitSet and another one
 | 
				
			||||||
 | 
					that has a bit at position 1,000,001 to true, then you need to go through all these zeroes,
 | 
				
			||||||
 | 
					whether you like it or not. That can become very wasteful.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This being said, there are definitively cases where attempting to use compressed bitmaps is wasteful.
 | 
				
			||||||
 | 
					For example, if you have a small universe size. E.g., your bitmaps represent sets of integers
 | 
				
			||||||
 | 
					from [0,n) where n is small (e.g., n=64 or n=128). If you are able to uncompressed BitSet and
 | 
				
			||||||
 | 
					it does not blow up your memory usage,  then compressed bitmaps are probably not useful
 | 
				
			||||||
 | 
					to you. In fact, if you do not need compression, then a BitSet offers remarkable speed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The sparse scenario is another use case where compressed bitmaps should not be used.
 | 
				
			||||||
 | 
					Keep in mind that random-looking data is usually not compressible. E.g., if you have a small set of
 | 
				
			||||||
 | 
					32-bit random integers, it is not mathematically possible to use far less than 32 bits per integer,
 | 
				
			||||||
 | 
					and attempts at compression can be counterproductive.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					How does Roaring compares with the alternatives?
 | 
				
			||||||
 | 
					==================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Most alternatives to Roaring are part of a larger family of compressed bitmaps that are run-length-encoded
 | 
				
			||||||
 | 
					bitmaps. They identify long runs of 1s or 0s and they represent them with a marker word.
 | 
				
			||||||
 | 
					If you have a local mix of 1s and 0, you use an uncompressed word.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There are many formats in this family:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Oracle's BBC is an obsolete format at this point: though it may provide good compression,
 | 
				
			||||||
 | 
					it is likely much slower than more recent alternatives due to excessive branching.
 | 
				
			||||||
 | 
					* WAH is a patented variation on BBC that provides better performance.
 | 
				
			||||||
 | 
					* Concise is a variation on the patented WAH. It some specific instances, it can compress
 | 
				
			||||||
 | 
					much better than WAH (up to 2x better), but it is generally slower.
 | 
				
			||||||
 | 
					* EWAH is both free of patent, and it is faster than all the above. On the downside, it
 | 
				
			||||||
 | 
					does not compress quite as well. It is faster because it allows some form of "skipping"
 | 
				
			||||||
 | 
					over uncompressed words. So though none of these formats are great at random access, EWAH
 | 
				
			||||||
 | 
					is better than the alternatives.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There is a big problem with these formats however that can hurt you badly in some cases: there is no random access. If you want to check whether a given value is present in the set, you have to start from the beginning and "uncompress" the whole thing. This means that if you want to intersect a big set with a large set, you still have to uncompress the whole big set in the worst case...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Roaring solves this problem. It works in the following manner. It divides the data into chunks of 2<sup>16</sup> integers
 | 
				
			||||||
 | 
					(e.g., [0, 2<sup>16</sup>), [2<sup>16</sup>, 2 x 2<sup>16</sup>), ...). Within a chunk, it can use an uncompressed bitmap, a simple list of integers,
 | 
				
			||||||
 | 
					or a list of runs. Whatever format it uses, they all allow you to check for the present of any one value quickly
 | 
				
			||||||
 | 
					(e.g., with a binary search). The net result is that Roaring can compute many operations much faster than run-length-encoded
 | 
				
			||||||
 | 
					formats like WAH, EWAH, Concise... Maybe surprisingly, Roaring also generally offers better compression ratios.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### References
 | 
					### References
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										38
									
								
								vendor/github.com/RoaringBitmap/roaring/arraycontainer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										38
									
								
								vendor/github.com/RoaringBitmap/roaring/arraycontainer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -359,28 +359,17 @@ func (ac *arrayContainer) iorArray(value2 *arrayContainer) container {
 | 
				
			|||||||
	len1 := value1.getCardinality()
 | 
						len1 := value1.getCardinality()
 | 
				
			||||||
	len2 := value2.getCardinality()
 | 
						len2 := value2.getCardinality()
 | 
				
			||||||
	maxPossibleCardinality := len1 + len2
 | 
						maxPossibleCardinality := len1 + len2
 | 
				
			||||||
	if maxPossibleCardinality > arrayDefaultMaxSize { // it could be a bitmap!
 | 
					 | 
				
			||||||
		bc := newBitmapContainer()
 | 
					 | 
				
			||||||
		for k := 0; k < len(value2.content); k++ {
 | 
					 | 
				
			||||||
			v := value2.content[k]
 | 
					 | 
				
			||||||
			i := uint(v) >> 6
 | 
					 | 
				
			||||||
			mask := uint64(1) << (v % 64)
 | 
					 | 
				
			||||||
			bc.bitmap[i] |= mask
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for k := 0; k < len(ac.content); k++ {
 | 
					 | 
				
			||||||
			v := ac.content[k]
 | 
					 | 
				
			||||||
			i := uint(v) >> 6
 | 
					 | 
				
			||||||
			mask := uint64(1) << (v % 64)
 | 
					 | 
				
			||||||
			bc.bitmap[i] |= mask
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		bc.cardinality = int(popcntSlice(bc.bitmap))
 | 
					 | 
				
			||||||
		if bc.cardinality <= arrayDefaultMaxSize {
 | 
					 | 
				
			||||||
			return bc.toArrayContainer()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return bc
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if maxPossibleCardinality > cap(value1.content) {
 | 
						if maxPossibleCardinality > cap(value1.content) {
 | 
				
			||||||
		newcontent := make([]uint16, 0, maxPossibleCardinality)
 | 
							// doubling the capacity reduces new slice allocations in the case of
 | 
				
			||||||
 | 
							// repeated calls to iorArray().
 | 
				
			||||||
 | 
							newSize := 2 * maxPossibleCardinality
 | 
				
			||||||
 | 
							// the second check is to handle overly large array containers
 | 
				
			||||||
 | 
							// and should not occur in normal usage,
 | 
				
			||||||
 | 
							// as all array containers should be at most arrayDefaultMaxSize
 | 
				
			||||||
 | 
							if newSize > 2*arrayDefaultMaxSize && maxPossibleCardinality <= 2*arrayDefaultMaxSize {
 | 
				
			||||||
 | 
								newSize = 2 * arrayDefaultMaxSize
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							newcontent := make([]uint16, 0, newSize)
 | 
				
			||||||
		copy(newcontent[len2:maxPossibleCardinality], ac.content[0:len1])
 | 
							copy(newcontent[len2:maxPossibleCardinality], ac.content[0:len1])
 | 
				
			||||||
		ac.content = newcontent
 | 
							ac.content = newcontent
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
@@ -388,6 +377,13 @@ func (ac *arrayContainer) iorArray(value2 *arrayContainer) container {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	nl := union2by2(value1.content[len2:maxPossibleCardinality], value2.content, ac.content)
 | 
						nl := union2by2(value1.content[len2:maxPossibleCardinality], value2.content, ac.content)
 | 
				
			||||||
	ac.content = ac.content[:nl] // reslice to match actual used capacity
 | 
						ac.content = ac.content[:nl] // reslice to match actual used capacity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if nl > arrayDefaultMaxSize {
 | 
				
			||||||
 | 
							// Only converting to a bitmap when arrayDefaultMaxSize
 | 
				
			||||||
 | 
							// is actually exceeded minimizes conversions in the case of repeated
 | 
				
			||||||
 | 
							// calls to iorArray().
 | 
				
			||||||
 | 
							return ac.toBitmapContainer()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return ac
 | 
						return ac
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/RoaringBitmap/roaring/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/RoaringBitmap/roaring/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
module github.com/RoaringBitmap/roaring
 | 
					module github.com/RoaringBitmap/roaring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.12
 | 
					go 1.14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2
 | 
						github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2
 | 
				
			||||||
@@ -13,4 +13,6 @@ require (
 | 
				
			|||||||
	github.com/stretchr/testify v1.4.0
 | 
						github.com/stretchr/testify v1.4.0
 | 
				
			||||||
	github.com/tinylib/msgp v1.1.0
 | 
						github.com/tinylib/msgp v1.1.0
 | 
				
			||||||
	github.com/willf/bitset v1.1.10
 | 
						github.com/willf/bitset v1.1.10
 | 
				
			||||||
 | 
						golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect
 | 
				
			||||||
 | 
						golang.org/x/tools v0.0.0-20200928182047-19e03678916f // indirect
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										25
									
								
								vendor/github.com/RoaringBitmap/roaring/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/github.com/RoaringBitmap/roaring/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -24,6 +24,31 @@ github.com/tinylib/msgp v1.1.0 h1:9fQd+ICuRIu/ue4vxJZu6/LzxN0HwMds2nq/0cFvxHU=
 | 
				
			|||||||
github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
 | 
					github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
 | 
				
			||||||
github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc=
 | 
					github.com/willf/bitset v1.1.10 h1:NotGKqX0KwQ72NUzqrjZq5ipPNDQex9lo3WpaS8L2sc=
 | 
				
			||||||
github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
 | 
					github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
 | 
				
			||||||
 | 
					github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
				
			||||||
 | 
					golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k=
 | 
				
			||||||
 | 
					golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 | 
				
			||||||
 | 
					golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 | 
				
			||||||
 | 
					golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7 h1:EBZoQjiKKPaLbPrbpssUfuHtwM6KV/vb4U85g/cigFY=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20200928182047-19e03678916f h1:VwGa2Wf+rHGIxvsssCkUNIyFv8jQY0VCBCNWtikoWq0=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20200928182047-19e03678916f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
					gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								vendor/github.com/RoaringBitmap/roaring/roaring.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/RoaringBitmap/roaring/roaring.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -345,9 +345,9 @@ func newIntReverseIterator(a *Bitmap) *intReverseIterator {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// ManyIntIterable allows you to iterate over the values in a Bitmap
 | 
					// ManyIntIterable allows you to iterate over the values in a Bitmap
 | 
				
			||||||
type ManyIntIterable interface {
 | 
					type ManyIntIterable interface {
 | 
				
			||||||
	// pass in a buffer to fill up with values, returns how many values were returned
 | 
						// NextMany fills buf up with values, returns how many values were returned
 | 
				
			||||||
	NextMany(buf []uint32) int
 | 
						NextMany(buf []uint32) int
 | 
				
			||||||
	// pass in a buffer to fill up with 64 bit values, returns how many values were returned
 | 
						// NextMany64 fills up buf with 64 bit values, uses hs as a mask (OR), returns how many values were returned
 | 
				
			||||||
	NextMany64(hs uint64, buf []uint64) int
 | 
						NextMany64(hs uint64, buf []uint64) int
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1006,7 +1006,7 @@ main:
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
				s2 = x2.highlowcontainer.getKeyAtIndex(pos2)
 | 
									s2 = x2.highlowcontainer.getKeyAtIndex(pos2)
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				rb.highlowcontainer.replaceKeyAndContainerAtIndex(pos1, s1, rb.highlowcontainer.getWritableContainerAtIndex(pos1).ior(x2.highlowcontainer.getContainerAtIndex(pos2)), false)
 | 
									rb.highlowcontainer.replaceKeyAndContainerAtIndex(pos1, s1, rb.highlowcontainer.getUnionedWritableContainer(pos1, x2.highlowcontainer.getContainerAtIndex(pos2)), false)
 | 
				
			||||||
				pos1++
 | 
									pos1++
 | 
				
			||||||
				pos2++
 | 
									pos2++
 | 
				
			||||||
				if (pos1 == length1) || (pos2 == length2) {
 | 
									if (pos1 == length1) || (pos2 == length2) {
 | 
				
			||||||
@@ -1581,7 +1581,3 @@ func (rb *Bitmap) Stats() Statistics {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return stats
 | 
						return stats
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
func (rb *Bitmap) FillLeastSignificant32bits(x []uint64, i uint64, mask uint64) {
 | 
					 | 
				
			||||||
	rb.ManyIterator().NextMany64(mask, x[i:])
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								vendor/github.com/RoaringBitmap/roaring/roaringarray.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/RoaringBitmap/roaring/roaringarray.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -328,6 +328,17 @@ func (ra *roaringArray) getFastContainerAtIndex(i int, needsWriteable bool) cont
 | 
				
			|||||||
	return c
 | 
						return c
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// getUnionedWritableContainer switches behavior for in-place Or
 | 
				
			||||||
 | 
					// depending on whether the container requires a copy on write.
 | 
				
			||||||
 | 
					// If it does using the non-inplace or() method leads to fewer allocations.
 | 
				
			||||||
 | 
					func (ra *roaringArray) getUnionedWritableContainer(pos int, other container) container {
 | 
				
			||||||
 | 
						if ra.needCopyOnWrite[pos] {
 | 
				
			||||||
 | 
							return ra.getContainerAtIndex(pos).or(other)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ra.getContainerAtIndex(pos).ior(other)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ra *roaringArray) getWritableContainerAtIndex(i int) container {
 | 
					func (ra *roaringArray) getWritableContainerAtIndex(i int) container {
 | 
				
			||||||
	if ra.needCopyOnWrite[i] {
 | 
						if ra.needCopyOnWrite[i] {
 | 
				
			||||||
		ra.containers[i] = ra.containers[i].clone()
 | 
							ra.containers[i] = ra.containers[i].clone()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/RoaringBitmap/roaring/serialization_generic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/RoaringBitmap/roaring/serialization_generic.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// +build !amd64,!386 appengine
 | 
					// +build !amd64,!386,!arm,!arm64,!ppc64le,!mipsle,!mips64le,!mips64p32le,!wasm appengine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package roaring
 | 
					package roaring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/RoaringBitmap/roaring/serialization_littleendian.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/RoaringBitmap/roaring/serialization_littleendian.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
// +build 386 amd64,!appengine
 | 
					// +build 386,!appengine amd64,!appengine arm,!appengine arm64,!appengine ppc64le,!appengine mipsle,!appengine mips64le,!appengine mips64p32le,!appengine wasm,!appengine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package roaring
 | 
					package roaring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										60
									
								
								vendor/github.com/RoaringBitmap/roaring/setutil.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										60
									
								
								vendor/github.com/RoaringBitmap/roaring/setutil.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -135,66 +135,6 @@ func exclusiveUnion2by2(set1 []uint16, set2 []uint16, buffer []uint16) int {
 | 
				
			|||||||
	return pos
 | 
						return pos
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func union2by2(set1 []uint16, set2 []uint16, buffer []uint16) int {
 | 
					 | 
				
			||||||
	pos := 0
 | 
					 | 
				
			||||||
	k1 := 0
 | 
					 | 
				
			||||||
	k2 := 0
 | 
					 | 
				
			||||||
	if 0 == len(set2) {
 | 
					 | 
				
			||||||
		buffer = buffer[:len(set1)]
 | 
					 | 
				
			||||||
		copy(buffer, set1[:])
 | 
					 | 
				
			||||||
		return len(set1)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if 0 == len(set1) {
 | 
					 | 
				
			||||||
		buffer = buffer[:len(set2)]
 | 
					 | 
				
			||||||
		copy(buffer, set2[:])
 | 
					 | 
				
			||||||
		return len(set2)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	s1 := set1[k1]
 | 
					 | 
				
			||||||
	s2 := set2[k2]
 | 
					 | 
				
			||||||
	buffer = buffer[:cap(buffer)]
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		if s1 < s2 {
 | 
					 | 
				
			||||||
			buffer[pos] = s1
 | 
					 | 
				
			||||||
			pos++
 | 
					 | 
				
			||||||
			k1++
 | 
					 | 
				
			||||||
			if k1 >= len(set1) {
 | 
					 | 
				
			||||||
				copy(buffer[pos:], set2[k2:])
 | 
					 | 
				
			||||||
				pos += len(set2) - k2
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			s1 = set1[k1]
 | 
					 | 
				
			||||||
		} else if s1 == s2 {
 | 
					 | 
				
			||||||
			buffer[pos] = s1
 | 
					 | 
				
			||||||
			pos++
 | 
					 | 
				
			||||||
			k1++
 | 
					 | 
				
			||||||
			k2++
 | 
					 | 
				
			||||||
			if k1 >= len(set1) {
 | 
					 | 
				
			||||||
				copy(buffer[pos:], set2[k2:])
 | 
					 | 
				
			||||||
				pos += len(set2) - k2
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if k2 >= len(set2) {
 | 
					 | 
				
			||||||
				copy(buffer[pos:], set1[k1:])
 | 
					 | 
				
			||||||
				pos += len(set1) - k1
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			s1 = set1[k1]
 | 
					 | 
				
			||||||
			s2 = set2[k2]
 | 
					 | 
				
			||||||
		} else { // if (set1[k1]>set2[k2])
 | 
					 | 
				
			||||||
			buffer[pos] = s2
 | 
					 | 
				
			||||||
			pos++
 | 
					 | 
				
			||||||
			k2++
 | 
					 | 
				
			||||||
			if k2 >= len(set2) {
 | 
					 | 
				
			||||||
				copy(buffer[pos:], set1[k1:])
 | 
					 | 
				
			||||||
				pos += len(set1) - k1
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			s2 = set2[k2]
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return pos
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func union2by2Cardinality(set1 []uint16, set2 []uint16) int {
 | 
					func union2by2Cardinality(set1 []uint16, set2 []uint16) int {
 | 
				
			||||||
	pos := 0
 | 
						pos := 0
 | 
				
			||||||
	k1 := 0
 | 
						k1 := 0
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/RoaringBitmap/roaring/setutil_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/RoaringBitmap/roaring/setutil_arm64.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					// +build arm64,!gccgo,!appengine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package roaring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:noescape
 | 
				
			||||||
 | 
					func union2by2(set1 []uint16, set2 []uint16, buffer []uint16) (size int)
 | 
				
			||||||
							
								
								
									
										132
									
								
								vendor/github.com/RoaringBitmap/roaring/setutil_arm64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								vendor/github.com/RoaringBitmap/roaring/setutil_arm64.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,132 @@
 | 
				
			|||||||
 | 
					// +build arm64,!gccgo,!appengine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This implements union2by2 using golang's version of arm64 assembly
 | 
				
			||||||
 | 
					// The algorithm is very similar to the generic one,
 | 
				
			||||||
 | 
					// but makes better use of arm64 features so is notably faster.
 | 
				
			||||||
 | 
					// The basic algorithm structure is as follows:
 | 
				
			||||||
 | 
					// 1. If either set is empty, copy the other set into the buffer and return the length
 | 
				
			||||||
 | 
					// 2. Otherwise, load the first element of each set into a variable (s1 and s2).
 | 
				
			||||||
 | 
					// 3. a. Compare the values of s1 and s2.
 | 
				
			||||||
 | 
					 // b. add the smaller one to the buffer.
 | 
				
			||||||
 | 
					 // c. perform a bounds check before incrementing.
 | 
				
			||||||
 | 
					 // If one set is finished, copy the rest of the other set over.
 | 
				
			||||||
 | 
					 // d. update s1 and or s2 to the next value, continue loop.
 | 
				
			||||||
 | 
					 //
 | 
				
			||||||
 | 
					 // Past the fact of the algorithm, this code makes use of several arm64 features
 | 
				
			||||||
 | 
					 // Condition Codes:
 | 
				
			||||||
 | 
					 // arm64's CMP operation sets 4 bits that can be used for branching,
 | 
				
			||||||
 | 
					 // rather than just true or false.
 | 
				
			||||||
 | 
					 // As a consequence, a single comparison gives enough information to distinguish the three cases
 | 
				
			||||||
 | 
					 //
 | 
				
			||||||
 | 
					 // Post-increment pointers after load/store:
 | 
				
			||||||
 | 
					 // Instructions like `MOVHU.P 2(R0), R6`
 | 
				
			||||||
 | 
					 // increment the register by a specified amount, in this example 2.
 | 
				
			||||||
 | 
					 // Because uint16's are exactly 2 bytes and the length of the slices
 | 
				
			||||||
 | 
					 // is part of the slice header,
 | 
				
			||||||
 | 
					 // there is no need to separately track the index into the slice.
 | 
				
			||||||
 | 
					 // Instead, the code can calculate the final read value and compare against that,
 | 
				
			||||||
 | 
					 // using the post-increment reads to move the pointers along.
 | 
				
			||||||
 | 
					 //
 | 
				
			||||||
 | 
					 // TODO: CALL out to memmove once the list is exhausted.
 | 
				
			||||||
 | 
					 // Right now it moves the necessary shorts so that the remaining count
 | 
				
			||||||
 | 
					 // is a multiple of 4 and then copies 64 bits at a time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·union2by2(SB), NOSPLIT, $0-80
 | 
				
			||||||
 | 
						// R0, R1, and R2 for the pointers to the three slices
 | 
				
			||||||
 | 
						MOVD set1+0(FP), R0
 | 
				
			||||||
 | 
						MOVD set2+24(FP), R1
 | 
				
			||||||
 | 
						MOVD buffer+48(FP), R2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//R3 and R4 will be the values at which we will have finished reading set1 and set2.
 | 
				
			||||||
 | 
						// R3 should be R0 + 2 * set1_len+8(FP)
 | 
				
			||||||
 | 
						MOVD set1_len+8(FP), R3
 | 
				
			||||||
 | 
						MOVD set2_len+32(FP), R4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ADD R3<<1, R0, R3
 | 
				
			||||||
 | 
						ADD R4<<1, R1, R4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//Rather than counting the number of elements added separately
 | 
				
			||||||
 | 
						//Save the starting register of buffer.
 | 
				
			||||||
 | 
						MOVD buffer+48(FP), R5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// set1 is empty, just flush set2
 | 
				
			||||||
 | 
						CMP R0, R3
 | 
				
			||||||
 | 
						BEQ flush_right
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// set2 is empty, just flush set1
 | 
				
			||||||
 | 
						CMP R1, R4
 | 
				
			||||||
 | 
						BEQ flush_left
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// R6, R7 are the working space for s1 and s2
 | 
				
			||||||
 | 
						MOVD ZR, R6
 | 
				
			||||||
 | 
						MOVD ZR, R7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVHU.P 2(R0), R6
 | 
				
			||||||
 | 
						MOVHU.P 2(R1), R7
 | 
				
			||||||
 | 
					loop:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CMP R6, R7
 | 
				
			||||||
 | 
						BEQ pop_both // R6 == R7
 | 
				
			||||||
 | 
						BLS pop_right // R6 > R7
 | 
				
			||||||
 | 
					//pop_left: // R6 < R7
 | 
				
			||||||
 | 
						MOVHU.P R6, 2(R2)
 | 
				
			||||||
 | 
						CMP R0, R3
 | 
				
			||||||
 | 
						BEQ pop_then_flush_right
 | 
				
			||||||
 | 
						MOVHU.P 2(R0), R6
 | 
				
			||||||
 | 
						JMP loop
 | 
				
			||||||
 | 
					pop_both:
 | 
				
			||||||
 | 
						MOVHU.P R6, 2(R2) //could also use R7, since they are equal
 | 
				
			||||||
 | 
						CMP R0, R3
 | 
				
			||||||
 | 
						BEQ flush_right
 | 
				
			||||||
 | 
						CMP R1, R4
 | 
				
			||||||
 | 
						BEQ flush_left
 | 
				
			||||||
 | 
						MOVHU.P 2(R0), R6
 | 
				
			||||||
 | 
						MOVHU.P 2(R1), R7
 | 
				
			||||||
 | 
						JMP loop
 | 
				
			||||||
 | 
					pop_right:
 | 
				
			||||||
 | 
						MOVHU.P R7, 2(R2)
 | 
				
			||||||
 | 
						CMP R1, R4
 | 
				
			||||||
 | 
						BEQ pop_then_flush_left
 | 
				
			||||||
 | 
						MOVHU.P 2(R1), R7
 | 
				
			||||||
 | 
						JMP loop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pop_then_flush_right:
 | 
				
			||||||
 | 
						MOVHU.P R7, 2(R2)
 | 
				
			||||||
 | 
					flush_right:
 | 
				
			||||||
 | 
						MOVD R1, R0
 | 
				
			||||||
 | 
						MOVD R4, R3
 | 
				
			||||||
 | 
						JMP flush_left
 | 
				
			||||||
 | 
					pop_then_flush_left:
 | 
				
			||||||
 | 
						MOVHU.P R6, 2(R2)
 | 
				
			||||||
 | 
					flush_left:
 | 
				
			||||||
 | 
						CMP R0, R3
 | 
				
			||||||
 | 
						BEQ return
 | 
				
			||||||
 | 
						//figure out how many bytes to slough off. Must be a multiple of two
 | 
				
			||||||
 | 
						SUB R0, R3, R4
 | 
				
			||||||
 | 
						ANDS $6, R4
 | 
				
			||||||
 | 
						BEQ long_flush //handles the 0 mod 8 case
 | 
				
			||||||
 | 
						SUBS $4, R4, R4 // since possible values are 2, 4, 6, this splits evenly
 | 
				
			||||||
 | 
						BLT pop_single  // exactly the 2 case
 | 
				
			||||||
 | 
						MOVW.P 4(R0), R6
 | 
				
			||||||
 | 
						MOVW.P R6, 4(R2)
 | 
				
			||||||
 | 
						BEQ long_flush // we're now aligned by 64 bits, as R4==4, otherwise 2 more
 | 
				
			||||||
 | 
					pop_single:
 | 
				
			||||||
 | 
						MOVHU.P 2(R0), R6
 | 
				
			||||||
 | 
						MOVHU.P R6, 2(R2)
 | 
				
			||||||
 | 
					long_flush:
 | 
				
			||||||
 | 
						// at this point we know R3 - R0 is a multiple of 8.
 | 
				
			||||||
 | 
						CMP R0, R3
 | 
				
			||||||
 | 
						BEQ return
 | 
				
			||||||
 | 
						MOVD.P 8(R0), R6
 | 
				
			||||||
 | 
						MOVD.P R6, 8(R2)
 | 
				
			||||||
 | 
						JMP long_flush
 | 
				
			||||||
 | 
					return:
 | 
				
			||||||
 | 
						// number of shorts written is (R5 - R2) >> 1
 | 
				
			||||||
 | 
						SUB R5, R2
 | 
				
			||||||
 | 
						LSR $1, R2, R2
 | 
				
			||||||
 | 
						MOVD R2, size+72(FP)
 | 
				
			||||||
 | 
						RET
 | 
				
			||||||
							
								
								
									
										63
									
								
								vendor/github.com/RoaringBitmap/roaring/setutil_generic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								vendor/github.com/RoaringBitmap/roaring/setutil_generic.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,63 @@
 | 
				
			|||||||
 | 
					// +build !arm64 gccgo appengine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package roaring
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func union2by2(set1 []uint16, set2 []uint16, buffer []uint16) int {
 | 
				
			||||||
 | 
						pos := 0
 | 
				
			||||||
 | 
						k1 := 0
 | 
				
			||||||
 | 
						k2 := 0
 | 
				
			||||||
 | 
						if 0 == len(set2) {
 | 
				
			||||||
 | 
							buffer = buffer[:len(set1)]
 | 
				
			||||||
 | 
							copy(buffer, set1[:])
 | 
				
			||||||
 | 
							return len(set1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if 0 == len(set1) {
 | 
				
			||||||
 | 
							buffer = buffer[:len(set2)]
 | 
				
			||||||
 | 
							copy(buffer, set2[:])
 | 
				
			||||||
 | 
							return len(set2)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						s1 := set1[k1]
 | 
				
			||||||
 | 
						s2 := set2[k2]
 | 
				
			||||||
 | 
						buffer = buffer[:cap(buffer)]
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							if s1 < s2 {
 | 
				
			||||||
 | 
								buffer[pos] = s1
 | 
				
			||||||
 | 
								pos++
 | 
				
			||||||
 | 
								k1++
 | 
				
			||||||
 | 
								if k1 >= len(set1) {
 | 
				
			||||||
 | 
									copy(buffer[pos:], set2[k2:])
 | 
				
			||||||
 | 
									pos += len(set2) - k2
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								s1 = set1[k1]
 | 
				
			||||||
 | 
							} else if s1 == s2 {
 | 
				
			||||||
 | 
								buffer[pos] = s1
 | 
				
			||||||
 | 
								pos++
 | 
				
			||||||
 | 
								k1++
 | 
				
			||||||
 | 
								k2++
 | 
				
			||||||
 | 
								if k1 >= len(set1) {
 | 
				
			||||||
 | 
									copy(buffer[pos:], set2[k2:])
 | 
				
			||||||
 | 
									pos += len(set2) - k2
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if k2 >= len(set2) {
 | 
				
			||||||
 | 
									copy(buffer[pos:], set1[k1:])
 | 
				
			||||||
 | 
									pos += len(set1) - k1
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								s1 = set1[k1]
 | 
				
			||||||
 | 
								s2 = set2[k2]
 | 
				
			||||||
 | 
							} else { // if (set1[k1]>set2[k2])
 | 
				
			||||||
 | 
								buffer[pos] = s2
 | 
				
			||||||
 | 
								pos++
 | 
				
			||||||
 | 
								k2++
 | 
				
			||||||
 | 
								if k2 >= len(set2) {
 | 
				
			||||||
 | 
									copy(buffer[pos:], set1[k1:])
 | 
				
			||||||
 | 
									pos += len(set1) - k1
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								s2 = set2[k2]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return pos
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										29
									
								
								vendor/github.com/denisenkom/go-mssqldb/appveyor.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/denisenkom/go-mssqldb/appveyor.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,7 @@
 | 
				
			|||||||
version: 1.0.{build}
 | 
					version: 1.0.{build}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
os: Windows Server 2012 R2
 | 
					image:
 | 
				
			||||||
 | 
					  - Visual Studio 2015
 | 
				
			||||||
 | 
					
 | 
				
			||||||
clone_folder: c:\gopath\src\github.com\denisenkom\go-mssqldb
 | 
					clone_folder: c:\gopath\src\github.com\denisenkom\go-mssqldb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -10,20 +11,35 @@ environment:
 | 
				
			|||||||
  SQLUSER: sa
 | 
					  SQLUSER: sa
 | 
				
			||||||
  SQLPASSWORD: Password12!
 | 
					  SQLPASSWORD: Password12!
 | 
				
			||||||
  DATABASE: test
 | 
					  DATABASE: test
 | 
				
			||||||
  GOVERSION: 111
 | 
					  GOVERSION: 113
 | 
				
			||||||
  matrix:
 | 
					  matrix:
 | 
				
			||||||
    - GOVERSION: 18
 | 
					    - GOVERSION: 18
 | 
				
			||||||
      SQLINSTANCE: SQL2016
 | 
					      SQLINSTANCE: SQL2017
 | 
				
			||||||
    - GOVERSION: 19
 | 
					    - GOVERSION: 19
 | 
				
			||||||
      SQLINSTANCE: SQL2016
 | 
					      SQLINSTANCE: SQL2017
 | 
				
			||||||
    - GOVERSION: 110
 | 
					    - GOVERSION: 110
 | 
				
			||||||
      SQLINSTANCE: SQL2016
 | 
					      SQLINSTANCE: SQL2017
 | 
				
			||||||
    - GOVERSION: 111
 | 
					    - GOVERSION: 111
 | 
				
			||||||
      SQLINSTANCE: SQL2016
 | 
					      SQLINSTANCE: SQL2017
 | 
				
			||||||
 | 
					    - GOVERSION: 112
 | 
				
			||||||
 | 
					      SQLINSTANCE: SQL2017
 | 
				
			||||||
 | 
					    - SQLINSTANCE: SQL2017
 | 
				
			||||||
 | 
					    - SQLINSTANCE: SQL2016
 | 
				
			||||||
    - SQLINSTANCE: SQL2014
 | 
					    - SQLINSTANCE: SQL2014
 | 
				
			||||||
    - SQLINSTANCE: SQL2012SP1
 | 
					    - SQLINSTANCE: SQL2012SP1
 | 
				
			||||||
    - SQLINSTANCE: SQL2008R2SP2
 | 
					    - SQLINSTANCE: SQL2008R2SP2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #  Go 1.14+ and SQL2019 are available on the Visual Studio 2019 image only
 | 
				
			||||||
 | 
					    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
 | 
				
			||||||
 | 
					      GOVERSION: 114
 | 
				
			||||||
 | 
					      SQLINSTANCE: SQL2019
 | 
				
			||||||
 | 
					    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
 | 
				
			||||||
 | 
					      GOVERSION: 115
 | 
				
			||||||
 | 
					      SQLINSTANCE: SQL2019
 | 
				
			||||||
 | 
					    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
 | 
				
			||||||
 | 
					      GOVERSION: 115
 | 
				
			||||||
 | 
					      SQLINSTANCE: SQL2017
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
  - set GOROOT=c:\go%GOVERSION%
 | 
					  - set GOROOT=c:\go%GOVERSION%
 | 
				
			||||||
  - set PATH=%GOPATH%\bin;%GOROOT%\bin;%PATH%
 | 
					  - set PATH=%GOPATH%\bin;%GOROOT%\bin;%PATH%
 | 
				
			||||||
@@ -44,7 +60,6 @@ before_test:
 | 
				
			|||||||
  - sqlcmd -S "(local)\%SQLINSTANCE%" -h -1 -Q "set nocount on; Select @@version"
 | 
					  - sqlcmd -S "(local)\%SQLINSTANCE%" -h -1 -Q "set nocount on; Select @@version"
 | 
				
			||||||
  - pip install codecov
 | 
					  - pip install codecov
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
test_script:
 | 
					test_script:
 | 
				
			||||||
  - go test -race -cpu 4 -coverprofile=coverage.txt -covermode=atomic
 | 
					  - go test -race -cpu 4 -coverprofile=coverage.txt -covermode=atomic
 | 
				
			||||||
  - codecov -f coverage.txt
 | 
					  - codecov -f coverage.txt
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/denisenkom/go-mssqldb/mssql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/denisenkom/go-mssqldb/mssql.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -285,7 +285,7 @@ func (c *Conn) begin(ctx context.Context, tdsIsolation isoLevel) (tx driver.Tx,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	tx, err = c.processBeginResponse(ctx)
 | 
						tx, err = c.processBeginResponse(ctx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, c.checkBadConn(err)
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/denisenkom/go-mssqldb/tds.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/denisenkom/go-mssqldb/tds.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -838,6 +838,12 @@ func connect(ctx context.Context, c *Connector, log optionalLogger, p connectPar
 | 
				
			|||||||
		defer cancel()
 | 
							defer cancel()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// if instance is specified use instance resolution service
 | 
						// if instance is specified use instance resolution service
 | 
				
			||||||
 | 
						if p.instance != "" && p.port != 0 {
 | 
				
			||||||
 | 
							// both instance name and port specified
 | 
				
			||||||
 | 
							// when port is specified instance name is not used
 | 
				
			||||||
 | 
							// you should not provide instance name when you provide port
 | 
				
			||||||
 | 
							log.Println("WARN: You specified both instance name and port in the connection string, port will be used and instance name will be ignored");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	if p.instance != "" && p.port == 0 {
 | 
						if p.instance != "" && p.port == 0 {
 | 
				
			||||||
		p.instance = strings.ToUpper(p.instance)
 | 
							p.instance = strings.ToUpper(p.instance)
 | 
				
			||||||
		d := c.getDialer(&p)
 | 
							d := c.getDialer(&p)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								vendor/github.com/denisenkom/go-mssqldb/token.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/denisenkom/go-mssqldb/token.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -704,14 +704,18 @@ func (ts *parseResp) sendAttention(ch chan tokenStruct) parseRespIter {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ts *parseResp) dlog(msg string) {
 | 
					func (ts *parseResp) dlog(msg string) {
 | 
				
			||||||
	if ts.sess.logFlags&logDebug != 0 {
 | 
						// logging from goroutine is disabled to prevent
 | 
				
			||||||
 | 
						// data race detection from firing
 | 
				
			||||||
 | 
						// The race is probably happening when
 | 
				
			||||||
 | 
						// test logger changes between tests.
 | 
				
			||||||
 | 
						/*if ts.sess.logFlags&logDebug != 0 {
 | 
				
			||||||
		ts.sess.log.Println(msg)
 | 
							ts.sess.log.Println(msg)
 | 
				
			||||||
	}
 | 
						}*/
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (ts *parseResp) dlogf(f string, v ...interface{}) {
 | 
					func (ts *parseResp) dlogf(f string, v ...interface{}) {
 | 
				
			||||||
	if ts.sess.logFlags&logDebug != 0 {
 | 
						/*if ts.sess.logFlags&logDebug != 0 {
 | 
				
			||||||
		ts.sess.log.Printf(f, v...)
 | 
							ts.sess.log.Printf(f, v...)
 | 
				
			||||||
	}
 | 
						}*/
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ts *parseResp) iter(ctx context.Context, ch chan tokenStruct, tokChan chan tokenStruct) parseRespIter {
 | 
					func (ts *parseResp) iter(ctx context.Context, ch chan tokenStruct, tokChan chan tokenStruct) parseRespIter {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								vendor/github.com/editorconfig/editorconfig-core-go/v2/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/editorconfig/editorconfig-core-go/v2/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,14 @@
 | 
				
			|||||||
# Change log
 | 
					# Change log
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## v2.3.8 - 2020-10-17
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Feat more tests
 | 
				
			||||||
 | 
					  ([#83](https://github.com/editorconfig/editorconfig-core-go/pull/83));
 | 
				
			||||||
 | 
					- Upgrade go-ini v1.61.0
 | 
				
			||||||
 | 
					  ([#84](https://github.com/editorconfig/editorconfig-core-go/pull/84));
 | 
				
			||||||
 | 
					- Upgrade go-ini v1.62.0
 | 
				
			||||||
 | 
					  ([#85](https://github.com/editorconfig/editorconfig-core-go/pull/85)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## v2.3.7 - 2020-09-05
 | 
					## v2.3.7 - 2020-09-05
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Upgrade go-ini v1.60.2, and go-cmp v0.5.2
 | 
					- Upgrade go-ini v1.60.2, and go-cmp v0.5.2
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/editorconfig/editorconfig-core-go/v2/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/editorconfig/editorconfig-core-go/v2/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -6,5 +6,5 @@ require (
 | 
				
			|||||||
	github.com/google/go-cmp v0.5.2
 | 
						github.com/google/go-cmp v0.5.2
 | 
				
			||||||
	github.com/smartystreets/goconvey v1.6.4 // indirect
 | 
						github.com/smartystreets/goconvey v1.6.4 // indirect
 | 
				
			||||||
	golang.org/x/mod v0.3.0
 | 
						golang.org/x/mod v0.3.0
 | 
				
			||||||
	gopkg.in/ini.v1 v1.60.2
 | 
						gopkg.in/ini.v1 v1.62.0
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/editorconfig/editorconfig-core-go/v2/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/editorconfig/editorconfig-core-go/v2/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -27,5 +27,5 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 | 
				
			|||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 | 
					golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
gopkg.in/ini.v1 v1.60.2 h1:7i8mqModL63zqi8nQn8Q3+0zvSCZy1AxhBgthKfi4WU=
 | 
					gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
 | 
				
			||||||
gopkg.in/ini.v1 v1.60.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/ethantkoenig/rupture/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/ethantkoenig/rupture/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,8 +1,8 @@
 | 
				
			|||||||
language: go
 | 
					language: go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
  - 1.8.x
 | 
					  - "1.10.x"
 | 
				
			||||||
  - 1.9.x
 | 
					  - "1.11.x"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
before_script:
 | 
					before_script:
 | 
				
			||||||
  - go get -u github.com/golang/lint/golint
 | 
					  - go get -u github.com/golang/lint/golint
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/ethantkoenig/rupture/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/ethantkoenig/rupture/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
# rupture
 | 
					# rupture
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://travis-ci.org/ethantkoenig/rupture) [](https://godoc.org/github.com/ethantkoenig/rupture) [](https://goreportcard.com/report/blevesearch/bleve)
 | 
					[](https://travis-ci.org/ethantkoenig/rupture) [](https://godoc.org/github.com/ethantkoenig/rupture) [](https://goreportcard.com/report/github.com/ethantkoenig/rupture)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
An explosive companion to the [bleve indexing library](https://www.github.com/blevesearch/bleve)
 | 
					An explosive companion to the [bleve indexing library](https://www.github.com/blevesearch/bleve)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								vendor/github.com/go-testfixtures/testfixtures/v3/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/go-testfixtures/testfixtures/v3/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,10 @@
 | 
				
			|||||||
# Changelog
 | 
					# Changelog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## v3.4.1 - 2020-10-19
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Fix for Microsoft SQL Server databases with views
 | 
				
			||||||
 | 
					  ([#78](https://github.com/go-testfixtures/testfixtures/pull/78)).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## v3.4.0 - 2020-08-09
 | 
					## v3.4.0 - 2020-08-09
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Add support to CockroachDB
 | 
					- Add support to CockroachDB
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/go-testfixtures/testfixtures/v3/Dockerfile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-testfixtures/testfixtures/v3/Dockerfile
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
FROM golang:1.14-alpine
 | 
					FROM golang:1.15-alpine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RUN apk update
 | 
					RUN apk update
 | 
				
			||||||
RUN apk add alpine-sdk
 | 
					RUN apk add alpine-sdk
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								vendor/github.com/go-testfixtures/testfixtures/v3/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/go-testfixtures/testfixtures/v3/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
# testfixtures
 | 
					# testfixtures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[][doc]
 | 
					[](https://pkg.go.dev/github.com/go-testfixtures/testfixtures/v3?tab=doc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> ***Warning***: this package will wipe the database data before loading the
 | 
					> ***Warning***: this package will wipe the database data before loading the
 | 
				
			||||||
fixtures! It is supposed to be used on a test database. Please, double check
 | 
					fixtures! It is supposed to be used on a test database. Please, double check
 | 
				
			||||||
@@ -436,8 +436,15 @@ each test run in a transaction.
 | 
				
			|||||||
## CLI
 | 
					## CLI
 | 
				
			||||||
 | 
					
 | 
				
			||||||
We also have a CLI to load fixtures in a given database.
 | 
					We also have a CLI to load fixtures in a given database.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Grab it from the [releases page](https://github.com/go-testfixtures/testfixtures/releases)
 | 
					Grab it from the [releases page](https://github.com/go-testfixtures/testfixtures/releases)
 | 
				
			||||||
and use it like:
 | 
					or install with Homebrew:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					brew install go-testfixtures/tap/testfixtures
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Usage is like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
testfixtures -d postgres -c "postgres://user:password@localhost/database" -D testdata/fixtures
 | 
					testfixtures -d postgres -c "postgres://user:password@localhost/database" -D testdata/fixtures
 | 
				
			||||||
@@ -445,7 +452,7 @@ testfixtures -d postgres -c "postgres://user:password@localhost/database" -D tes
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
The connection string changes for each database driver.
 | 
					The connection string changes for each database driver.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Use `--help` for all flags.
 | 
					Use `testfixtures --help` for all flags.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Contributing
 | 
					## Contributing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -490,7 +497,6 @@ unit test database code without having to connect to a real database
 | 
				
			|||||||
- [dbcleaner][dbcleaner] - Clean database for testing, inspired by
 | 
					- [dbcleaner][dbcleaner] - Clean database for testing, inspired by
 | 
				
			||||||
database_cleaner for Ruby
 | 
					database_cleaner for Ruby
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[doc]: https://pkg.go.dev/github.com/go-testfixtures/testfixtures/v3?tab=doc
 | 
					 | 
				
			||||||
[railstests]: http://guides.rubyonrails.org/testing.html#the-test-database
 | 
					[railstests]: http://guides.rubyonrails.org/testing.html#the-test-database
 | 
				
			||||||
[gotxdb]: https://github.com/DATA-DOG/go-txdb
 | 
					[gotxdb]: https://github.com/DATA-DOG/go-txdb
 | 
				
			||||||
[gosqlmock]: https://github.com/DATA-DOG/go-sqlmock
 | 
					[gosqlmock]: https://github.com/DATA-DOG/go-sqlmock
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/go-testfixtures/testfixtures/v3/sqlserver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-testfixtures/testfixtures/v3/sqlserver.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -56,7 +56,7 @@ func (*sqlserver) databaseName(q queryable) (string, error) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (*sqlserver) tableNames(q queryable) ([]string, error) {
 | 
					func (*sqlserver) tableNames(q queryable) ([]string, error) {
 | 
				
			||||||
	rows, err := q.Query("SELECT table_schema + '.' + table_name FROM information_schema.tables WHERE table_name <> 'spt_values'")
 | 
						rows, err := q.Query("SELECT table_schema + '.' + table_name FROM information_schema.tables WHERE table_name <> 'spt_values' AND table_type = 'BASE TABLE'")
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								vendor/github.com/hashicorp/go-retryablehttp/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/hashicorp/go-retryablehttp/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -26,6 +26,7 @@ fails so that the full request can be attempted again. See the
 | 
				
			|||||||
details.
 | 
					details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Version 0.6.0 and before are compatible with Go prior to 1.12. From 0.6.1 onward, Go 1.12+ is required.
 | 
					Version 0.6.0 and before are compatible with Go prior to 1.12. From 0.6.1 onward, Go 1.12+ is required.
 | 
				
			||||||
 | 
					From 0.6.7 onward, Go 1.13+ is required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Example Use
 | 
					Example Use
 | 
				
			||||||
===========
 | 
					===========
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										52
									
								
								vendor/github.com/hashicorp/go-retryablehttp/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/github.com/hashicorp/go-retryablehttp/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -404,44 +404,9 @@ func DefaultRetryPolicy(ctx context.Context, resp *http.Response, err error) (bo
 | 
				
			|||||||
		return false, ctx.Err()
 | 
							return false, ctx.Err()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
						// don't propagate other errors
 | 
				
			||||||
		if v, ok := err.(*url.Error); ok {
 | 
						shouldRetry, _ := baseRetryPolicy(resp, err)
 | 
				
			||||||
			// Don't retry if the error was due to too many redirects.
 | 
						return shouldRetry, nil
 | 
				
			||||||
			if redirectsErrorRe.MatchString(v.Error()) {
 | 
					 | 
				
			||||||
				return false, nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Don't retry if the error was due to an invalid protocol scheme.
 | 
					 | 
				
			||||||
			if schemeErrorRe.MatchString(v.Error()) {
 | 
					 | 
				
			||||||
				return false, nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Don't retry if the error was due to TLS cert verification failure.
 | 
					 | 
				
			||||||
			if _, ok := v.Err.(x509.UnknownAuthorityError); ok {
 | 
					 | 
				
			||||||
				return false, nil
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// The error is likely recoverable so retry.
 | 
					 | 
				
			||||||
		return true, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// 429 Too Many Requests is recoverable. Sometimes the server puts
 | 
					 | 
				
			||||||
	// a Retry-After response header to indicate when the server is
 | 
					 | 
				
			||||||
	// available to start processing request from client.
 | 
					 | 
				
			||||||
	if resp.StatusCode == http.StatusTooManyRequests {
 | 
					 | 
				
			||||||
		return true, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Check the response code. We retry on 500-range responses to allow
 | 
					 | 
				
			||||||
	// the server time to recover, as 500's are typically not permanent
 | 
					 | 
				
			||||||
	// errors and may relate to outages on the server side. This will catch
 | 
					 | 
				
			||||||
	// invalid response codes as well, like 0 and 999.
 | 
					 | 
				
			||||||
	if resp.StatusCode == 0 || (resp.StatusCode >= 500 && resp.StatusCode != 501) {
 | 
					 | 
				
			||||||
		return true, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return false, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ErrorPropagatedRetryPolicy is the same as DefaultRetryPolicy, except it
 | 
					// ErrorPropagatedRetryPolicy is the same as DefaultRetryPolicy, except it
 | 
				
			||||||
@@ -453,6 +418,10 @@ func ErrorPropagatedRetryPolicy(ctx context.Context, resp *http.Response, err er
 | 
				
			|||||||
		return false, ctx.Err()
 | 
							return false, ctx.Err()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return baseRetryPolicy(resp, err)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func baseRetryPolicy(resp *http.Response, err error) (bool, error) {
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if v, ok := err.(*url.Error); ok {
 | 
							if v, ok := err.(*url.Error); ok {
 | 
				
			||||||
			// Don't retry if the error was due to too many redirects.
 | 
								// Don't retry if the error was due to too many redirects.
 | 
				
			||||||
@@ -475,6 +444,13 @@ func ErrorPropagatedRetryPolicy(ctx context.Context, resp *http.Response, err er
 | 
				
			|||||||
		return true, nil
 | 
							return true, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 429 Too Many Requests is recoverable. Sometimes the server puts
 | 
				
			||||||
 | 
						// a Retry-After response header to indicate when the server is
 | 
				
			||||||
 | 
						// available to start processing request from client.
 | 
				
			||||||
 | 
						if resp.StatusCode == http.StatusTooManyRequests {
 | 
				
			||||||
 | 
							return true, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check the response code. We retry on 500-range responses to allow
 | 
						// Check the response code. We retry on 500-range responses to allow
 | 
				
			||||||
	// the server time to recover, as 500's are typically not permanent
 | 
						// the server time to recover, as 500's are typically not permanent
 | 
				
			||||||
	// errors and may relate to outages on the server side. This will catch
 | 
						// errors and may relate to outages on the server side. This will catch
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								vendor/github.com/jaytaylor/html2text/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/jaytaylor/html2text/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,12 +1,12 @@
 | 
				
			|||||||
language: go
 | 
					language: go
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
 | 
					  # n.b. For golang release history, see https://golang.org/doc/devel/release.html
 | 
				
			||||||
  - tip
 | 
					  - tip
 | 
				
			||||||
  - 1.7
 | 
					  - "1.13.8"
 | 
				
			||||||
  - 1.6
 | 
					  - "1.12.17"
 | 
				
			||||||
  - 1.5
 | 
					  - "1.11.13"
 | 
				
			||||||
  - 1.4
 | 
					  - "1.10.8"
 | 
				
			||||||
  - 1.3
 | 
					  - "1.9.7"
 | 
				
			||||||
  - 1.2
 | 
					 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  email:
 | 
					  email:
 | 
				
			||||||
    on_success: change
 | 
					    on_success: change
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										50
									
								
								vendor/github.com/jaytaylor/html2text/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/jaytaylor/html2text/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,11 +4,15 @@
 | 
				
			|||||||
[](https://travis-ci.org/jaytaylor/html2text)
 | 
					[](https://travis-ci.org/jaytaylor/html2text)
 | 
				
			||||||
[](https://goreportcard.com/report/github.com/jaytaylor/html2text)
 | 
					[](https://goreportcard.com/report/github.com/jaytaylor/html2text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Converts HTML into text
 | 
					### Converts HTML into text of the markdown-flavored variety
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Introduction
 | 
					## Introduction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Ensure your emails are readable by all!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Turns HTML into raw text, useful for sending fancy HTML emails with an equivalently nicely formatted TXT document as a fallback (e.g. for people who don't allow HTML emails or have other display issues).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
html2text is a simple golang package for rendering HTML into plaintext.
 | 
					html2text is a simple golang package for rendering HTML into plaintext.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
There are still lots of improvements to be had, but FWIW this has worked fine for my [basic] HTML-2-text needs.
 | 
					There are still lots of improvements to be had, but FWIW this has worked fine for my [basic] HTML-2-text needs.
 | 
				
			||||||
@@ -19,7 +23,7 @@ It requires go 1.x or newer ;)
 | 
				
			|||||||
## Download the package
 | 
					## Download the package
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```bash
 | 
				
			||||||
go get github.com/jaytaylor/html2text
 | 
					go get jaytaylor.com/html2text
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Example usage
 | 
					## Example usage
 | 
				
			||||||
@@ -30,12 +34,12 @@ package main
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/jaytaylor/html2text"
 | 
						"jaytaylor.com/html2text"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	inputHtml := `
 | 
						inputHTML := `
 | 
				
			||||||
          <html>
 | 
					<html>
 | 
				
			||||||
  <head>
 | 
					  <head>
 | 
				
			||||||
    <title>My Mega Service</title>
 | 
					    <title>My Mega Service</title>
 | 
				
			||||||
    <link rel=\"stylesheet\" href=\"main.css\">
 | 
					    <link rel=\"stylesheet\" href=\"main.css\">
 | 
				
			||||||
@@ -44,7 +48,7 @@ func main() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  <body>
 | 
					  <body>
 | 
				
			||||||
    <div class="logo">
 | 
					    <div class="logo">
 | 
				
			||||||
                <a href="http://mymegaservice.com/"><img src="/logo-image.jpg" alt="Mega Service"/></a>
 | 
					      <a href="http://jaytaylor.com/"><img src="/logo-image.jpg" alt="Mega Service"/></a>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <h1>Welcome to your new account on my service!</h1>
 | 
					    <h1>Welcome to your new account on my service!</h1>
 | 
				
			||||||
@@ -58,11 +62,23 @@ func main() {
 | 
				
			|||||||
        <li>Something else</li>
 | 
					        <li>Something else</li>
 | 
				
			||||||
      </ul>
 | 
					      </ul>
 | 
				
			||||||
    </p>
 | 
					    </p>
 | 
				
			||||||
            </body>
 | 
					 | 
				
			||||||
          </html>
 | 
					 | 
				
			||||||
	`
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	text, err := html2text.FromString(inputHtml)
 | 
					    <table>
 | 
				
			||||||
 | 
					      <thead>
 | 
				
			||||||
 | 
					        <tr><th>Header 1</th><th>Header 2</th></tr>
 | 
				
			||||||
 | 
					      </thead>
 | 
				
			||||||
 | 
					      <tfoot>
 | 
				
			||||||
 | 
					        <tr><td>Footer 1</td><td>Footer 2</td></tr>
 | 
				
			||||||
 | 
					      </tfoot>
 | 
				
			||||||
 | 
					      <tbody>
 | 
				
			||||||
 | 
					        <tr><td>Row 1 Col 1</td><td>Row 1 Col 2</td></tr>
 | 
				
			||||||
 | 
					        <tr><td>Row 2 Col 1</td><td>Row 2 Col 2</td></tr>
 | 
				
			||||||
 | 
					      </tbody>
 | 
				
			||||||
 | 
					    </table>
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						text, err := html2text.FromString(inputHTML, html2text.Options{PrettyTables: true})
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		panic(err)
 | 
							panic(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -72,7 +88,7 @@ func main() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Output:
 | 
					Output:
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
Mega Service ( http://mymegaservice.com/ )
 | 
					Mega Service ( http://jaytaylor.com/ )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
******************************************
 | 
					******************************************
 | 
				
			||||||
Welcome to your new account on my service!
 | 
					Welcome to your new account on my service!
 | 
				
			||||||
@@ -83,6 +99,15 @@ Here is some more information:
 | 
				
			|||||||
* Link 1: Example.com ( https://example.com )
 | 
					* Link 1: Example.com ( https://example.com )
 | 
				
			||||||
* Link 2: Example2.com ( https://example2.com )
 | 
					* Link 2: Example2.com ( https://example2.com )
 | 
				
			||||||
* Something else
 | 
					* Something else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					+-------------+-------------+
 | 
				
			||||||
 | 
					|  HEADER 1   |  HEADER 2   |
 | 
				
			||||||
 | 
					+-------------+-------------+
 | 
				
			||||||
 | 
					| Row 1 Col 1 | Row 1 Col 2 |
 | 
				
			||||||
 | 
					| Row 2 Col 1 | Row 2 Col 2 |
 | 
				
			||||||
 | 
					+-------------+-------------+
 | 
				
			||||||
 | 
					|  FOOTER 1   |  FOOTER 2   |
 | 
				
			||||||
 | 
					+-------------+-------------+
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -110,3 +135,6 @@ Email: jay at (my github username).com
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Twitter: [@jtaylor](https://twitter.com/jtaylor)
 | 
					Twitter: [@jtaylor](https://twitter.com/jtaylor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Alternatives
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					https://github.com/k3a/html2text - Lightweight
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										411
									
								
								vendor/github.com/jaytaylor/html2text/html2text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										411
									
								
								vendor/github.com/jaytaylor/html2text/html2text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,57 +7,163 @@ import (
 | 
				
			|||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"unicode"
 | 
						"unicode"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/olekukonko/tablewriter"
 | 
				
			||||||
 | 
						"github.com/ssor/bom"
 | 
				
			||||||
	"golang.org/x/net/html"
 | 
						"golang.org/x/net/html"
 | 
				
			||||||
	"golang.org/x/net/html/atom"
 | 
						"golang.org/x/net/html/atom"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Options provide toggles and overrides to control specific rendering behaviors.
 | 
				
			||||||
 | 
					type Options struct {
 | 
				
			||||||
 | 
						PrettyTables        bool                 // Turns on pretty ASCII rendering for table elements.
 | 
				
			||||||
 | 
						PrettyTablesOptions *PrettyTablesOptions // Configures pretty ASCII rendering for table elements.
 | 
				
			||||||
 | 
						OmitLinks           bool                 // Turns on omitting links
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PrettyTablesOptions overrides tablewriter behaviors
 | 
				
			||||||
 | 
					type PrettyTablesOptions struct {
 | 
				
			||||||
 | 
						AutoFormatHeader     bool
 | 
				
			||||||
 | 
						AutoWrapText         bool
 | 
				
			||||||
 | 
						ReflowDuringAutoWrap bool
 | 
				
			||||||
 | 
						ColWidth             int
 | 
				
			||||||
 | 
						ColumnSeparator      string
 | 
				
			||||||
 | 
						RowSeparator         string
 | 
				
			||||||
 | 
						CenterSeparator      string
 | 
				
			||||||
 | 
						HeaderAlignment      int
 | 
				
			||||||
 | 
						FooterAlignment      int
 | 
				
			||||||
 | 
						Alignment            int
 | 
				
			||||||
 | 
						ColumnAlignment      []int
 | 
				
			||||||
 | 
						NewLine              string
 | 
				
			||||||
 | 
						HeaderLine           bool
 | 
				
			||||||
 | 
						RowLine              bool
 | 
				
			||||||
 | 
						AutoMergeCells       bool
 | 
				
			||||||
 | 
						Borders              tablewriter.Border
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewPrettyTablesOptions creates PrettyTablesOptions with default settings
 | 
				
			||||||
 | 
					func NewPrettyTablesOptions() *PrettyTablesOptions {
 | 
				
			||||||
 | 
						return &PrettyTablesOptions{
 | 
				
			||||||
 | 
							AutoFormatHeader:     true,
 | 
				
			||||||
 | 
							AutoWrapText:         true,
 | 
				
			||||||
 | 
							ReflowDuringAutoWrap: true,
 | 
				
			||||||
 | 
							ColWidth:             tablewriter.MAX_ROW_WIDTH,
 | 
				
			||||||
 | 
							ColumnSeparator:      tablewriter.COLUMN,
 | 
				
			||||||
 | 
							RowSeparator:         tablewriter.ROW,
 | 
				
			||||||
 | 
							CenterSeparator:      tablewriter.CENTER,
 | 
				
			||||||
 | 
							HeaderAlignment:      tablewriter.ALIGN_DEFAULT,
 | 
				
			||||||
 | 
							FooterAlignment:      tablewriter.ALIGN_DEFAULT,
 | 
				
			||||||
 | 
							Alignment:            tablewriter.ALIGN_DEFAULT,
 | 
				
			||||||
 | 
							ColumnAlignment:      []int{},
 | 
				
			||||||
 | 
							NewLine:              tablewriter.NEWLINE,
 | 
				
			||||||
 | 
							HeaderLine:           true,
 | 
				
			||||||
 | 
							RowLine:              false,
 | 
				
			||||||
 | 
							AutoMergeCells:       false,
 | 
				
			||||||
 | 
							Borders:              tablewriter.Border{Left: true, Right: true, Bottom: true, Top: true},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FromHTMLNode renders text output from a pre-parsed HTML document.
 | 
				
			||||||
 | 
					func FromHTMLNode(doc *html.Node, o ...Options) (string, error) {
 | 
				
			||||||
 | 
						var options Options
 | 
				
			||||||
 | 
						if len(o) > 0 {
 | 
				
			||||||
 | 
							options = o[0]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx := textifyTraverseContext{
 | 
				
			||||||
 | 
							buf:     bytes.Buffer{},
 | 
				
			||||||
 | 
							options: options,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := ctx.traverse(doc); err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						text := strings.TrimSpace(newlineRe.ReplaceAllString(
 | 
				
			||||||
 | 
							strings.Replace(ctx.buf.String(), "\n ", "\n", -1), "\n\n"),
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						return text, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FromReader renders text output after parsing HTML for the specified
 | 
				
			||||||
 | 
					// io.Reader.
 | 
				
			||||||
 | 
					func FromReader(reader io.Reader, options ...Options) (string, error) {
 | 
				
			||||||
 | 
						newReader, err := bom.NewReaderWithoutBom(reader)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						doc, err := html.Parse(newReader)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return FromHTMLNode(doc, options...)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FromString parses HTML from the input string, then renders the text form.
 | 
				
			||||||
 | 
					func FromString(input string, options ...Options) (string, error) {
 | 
				
			||||||
 | 
						bs := bom.CleanBom([]byte(input))
 | 
				
			||||||
 | 
						text, err := FromReader(bytes.NewReader(bs), options...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return text, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	spacingRe = regexp.MustCompile(`[ \r\n\t]+`)
 | 
						spacingRe = regexp.MustCompile(`[ \r\n\t]+`)
 | 
				
			||||||
	newlineRe = regexp.MustCompile(`\n\n+`)
 | 
						newlineRe = regexp.MustCompile(`\n\n+`)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type textifyTraverseCtx struct {
 | 
					// traverseTableCtx holds text-related context.
 | 
				
			||||||
	Buf bytes.Buffer
 | 
					type textifyTraverseContext struct {
 | 
				
			||||||
 | 
						buf bytes.Buffer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	prefix          string
 | 
						prefix          string
 | 
				
			||||||
 | 
						tableCtx        tableTraverseContext
 | 
				
			||||||
 | 
						options         Options
 | 
				
			||||||
 | 
						endsWithSpace   bool
 | 
				
			||||||
 | 
						justClosedDiv   bool
 | 
				
			||||||
	blockquoteLevel int
 | 
						blockquoteLevel int
 | 
				
			||||||
	lineLength      int
 | 
						lineLength      int
 | 
				
			||||||
	endsWithSpace   bool
 | 
						isPre           bool
 | 
				
			||||||
	endsWithNewline bool
 | 
					 | 
				
			||||||
	justClosedDiv   bool
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ctx *textifyTraverseCtx) traverse(node *html.Node) error {
 | 
					// tableTraverseContext holds table ASCII-form related context.
 | 
				
			||||||
	switch node.Type {
 | 
					type tableTraverseContext struct {
 | 
				
			||||||
 | 
						header     []string
 | 
				
			||||||
 | 
						body       [][]string
 | 
				
			||||||
 | 
						footer     []string
 | 
				
			||||||
 | 
						tmpRow     int
 | 
				
			||||||
 | 
						isInFooter bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default:
 | 
					func (tableCtx *tableTraverseContext) init() {
 | 
				
			||||||
		return ctx.traverseChildren(node)
 | 
						tableCtx.body = [][]string{}
 | 
				
			||||||
 | 
						tableCtx.header = []string{}
 | 
				
			||||||
	case html.TextNode:
 | 
						tableCtx.footer = []string{}
 | 
				
			||||||
		data := strings.Trim(spacingRe.ReplaceAllString(node.Data, " "), " ")
 | 
						tableCtx.isInFooter = false
 | 
				
			||||||
		return ctx.emit(data)
 | 
						tableCtx.tmpRow = 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
	case html.ElementNode:
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ctx *textifyTraverseContext) handleElement(node *html.Node) error {
 | 
				
			||||||
	ctx.justClosedDiv = false
 | 
						ctx.justClosedDiv = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch node.DataAtom {
 | 
						switch node.DataAtom {
 | 
				
			||||||
	case atom.Br:
 | 
						case atom.Br:
 | 
				
			||||||
		return ctx.emit("\n")
 | 
							return ctx.emit("\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case atom.H1, atom.H2, atom.H3:
 | 
						case atom.H1, atom.H2, atom.H3:
 | 
				
			||||||
			subCtx := textifyTraverseCtx{}
 | 
							subCtx := textifyTraverseContext{}
 | 
				
			||||||
		if err := subCtx.traverseChildren(node); err != nil {
 | 
							if err := subCtx.traverseChildren(node); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			str := subCtx.Buf.String()
 | 
							str := subCtx.buf.String()
 | 
				
			||||||
		dividerLen := 0
 | 
							dividerLen := 0
 | 
				
			||||||
		for _, line := range strings.Split(str, "\n") {
 | 
							for _, line := range strings.Split(str, "\n") {
 | 
				
			||||||
			if lineLen := len([]rune(line)); lineLen-1 > dividerLen {
 | 
								if lineLen := len([]rune(line)); lineLen-1 > dividerLen {
 | 
				
			||||||
				dividerLen = lineLen - 1
 | 
									dividerLen = lineLen - 1
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
			divider := ""
 | 
							var divider string
 | 
				
			||||||
		if node.DataAtom == atom.H1 {
 | 
							if node.DataAtom == atom.H1 {
 | 
				
			||||||
			divider = strings.Repeat("*", dividerLen)
 | 
								divider = strings.Repeat("*", dividerLen)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
@@ -100,7 +206,7 @@ func (ctx *textifyTraverseCtx) traverse(node *html.Node) error {
 | 
				
			|||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		var err error
 | 
							var err error
 | 
				
			||||||
			if ctx.justClosedDiv == false {
 | 
							if !ctx.justClosedDiv {
 | 
				
			||||||
			err = ctx.emit("\n")
 | 
								err = ctx.emit("\n")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ctx.justClosedDiv = true
 | 
							ctx.justClosedDiv = true
 | 
				
			||||||
@@ -118,19 +224,27 @@ func (ctx *textifyTraverseCtx) traverse(node *html.Node) error {
 | 
				
			|||||||
		return ctx.emit("\n")
 | 
							return ctx.emit("\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case atom.B, atom.Strong:
 | 
						case atom.B, atom.Strong:
 | 
				
			||||||
			subCtx := textifyTraverseCtx{}
 | 
							subCtx := textifyTraverseContext{}
 | 
				
			||||||
		subCtx.endsWithSpace = true
 | 
							subCtx.endsWithSpace = true
 | 
				
			||||||
		if err := subCtx.traverseChildren(node); err != nil {
 | 
							if err := subCtx.traverseChildren(node); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
			str := subCtx.Buf.String()
 | 
							str := subCtx.buf.String()
 | 
				
			||||||
		return ctx.emit("*" + str + "*")
 | 
							return ctx.emit("*" + str + "*")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case atom.A:
 | 
						case atom.A:
 | 
				
			||||||
			// If image is the only child, take its alt text as the link text
 | 
							linkText := ""
 | 
				
			||||||
 | 
							// For simple link element content with single text node only, peek at the link text.
 | 
				
			||||||
 | 
							if node.FirstChild != nil && node.FirstChild.NextSibling == nil && node.FirstChild.Type == html.TextNode {
 | 
				
			||||||
 | 
								linkText = node.FirstChild.Data
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// If image is the only child, take its alt text as the link text.
 | 
				
			||||||
		if img := node.FirstChild; img != nil && node.LastChild == img && img.DataAtom == atom.Img {
 | 
							if img := node.FirstChild; img != nil && node.LastChild == img && img.DataAtom == atom.Img {
 | 
				
			||||||
			if altText := getAttrVal(img, "alt"); altText != "" {
 | 
								if altText := getAttrVal(img, "alt"); altText != "" {
 | 
				
			||||||
					ctx.emit(altText)
 | 
									if err := ctx.emit(altText); err != nil {
 | 
				
			||||||
 | 
										return err
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else if err := ctx.traverseChildren(node); err != nil {
 | 
							} else if err := ctx.traverseChildren(node); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
@@ -139,42 +253,162 @@ func (ctx *textifyTraverseCtx) traverse(node *html.Node) error {
 | 
				
			|||||||
		hrefLink := ""
 | 
							hrefLink := ""
 | 
				
			||||||
		if attrVal := getAttrVal(node, "href"); attrVal != "" {
 | 
							if attrVal := getAttrVal(node, "href"); attrVal != "" {
 | 
				
			||||||
			attrVal = ctx.normalizeHrefLink(attrVal)
 | 
								attrVal = ctx.normalizeHrefLink(attrVal)
 | 
				
			||||||
				if attrVal != "" {
 | 
								// Don't print link href if it matches link element content or if the link is empty.
 | 
				
			||||||
 | 
								if !ctx.options.OmitLinks && attrVal != "" && linkText != attrVal {
 | 
				
			||||||
				hrefLink = "( " + attrVal + " )"
 | 
									hrefLink = "( " + attrVal + " )"
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return ctx.emit(hrefLink)
 | 
							return ctx.emit(hrefLink)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		case atom.P, atom.Ul, atom.Table:
 | 
						case atom.P, atom.Ul:
 | 
				
			||||||
			if err := ctx.emit("\n\n"); err != nil {
 | 
							return ctx.paragraphHandler(node)
 | 
				
			||||||
				return err
 | 
					
 | 
				
			||||||
 | 
						case atom.Table, atom.Tfoot, atom.Th, atom.Tr, atom.Td:
 | 
				
			||||||
 | 
							if ctx.options.PrettyTables {
 | 
				
			||||||
 | 
								return ctx.handleTableElement(node)
 | 
				
			||||||
 | 
							} else if node.DataAtom == atom.Table {
 | 
				
			||||||
 | 
								return ctx.paragraphHandler(node)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							return ctx.traverseChildren(node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if err := ctx.traverseChildren(node); err != nil {
 | 
						case atom.Pre:
 | 
				
			||||||
 | 
							ctx.isPre = true
 | 
				
			||||||
 | 
							err := ctx.traverseChildren(node)
 | 
				
			||||||
 | 
							ctx.isPre = false
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return ctx.emit("\n\n")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		case atom.Tr:
 | 
					 | 
				
			||||||
			if err := ctx.traverseChildren(node); err != nil {
 | 
					 | 
				
			||||||
				return err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			return ctx.emit("\n")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case atom.Style, atom.Script, atom.Head:
 | 
						case atom.Style, atom.Script, atom.Head:
 | 
				
			||||||
			// Ignore the subtree
 | 
							// Ignore the subtree.
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return ctx.traverseChildren(node)
 | 
							return ctx.traverseChildren(node)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// paragraphHandler renders node children surrounded by double newlines.
 | 
				
			||||||
 | 
					func (ctx *textifyTraverseContext) paragraphHandler(node *html.Node) error {
 | 
				
			||||||
 | 
						if err := ctx.emit("\n\n"); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := ctx.traverseChildren(node); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ctx.emit("\n\n")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// handleTableElement is only to be invoked when options.PrettyTables is active.
 | 
				
			||||||
 | 
					func (ctx *textifyTraverseContext) handleTableElement(node *html.Node) error {
 | 
				
			||||||
 | 
						if !ctx.options.PrettyTables {
 | 
				
			||||||
 | 
							panic("handleTableElement invoked when PrettyTables not active")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch node.DataAtom {
 | 
				
			||||||
 | 
						case atom.Table:
 | 
				
			||||||
 | 
							if err := ctx.emit("\n\n"); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Re-intialize all table context.
 | 
				
			||||||
 | 
							ctx.tableCtx.init()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Browse children, enriching context with table data.
 | 
				
			||||||
 | 
							if err := ctx.traverseChildren(node); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							buf := &bytes.Buffer{}
 | 
				
			||||||
 | 
							table := tablewriter.NewWriter(buf)
 | 
				
			||||||
 | 
							if ctx.options.PrettyTablesOptions != nil {
 | 
				
			||||||
 | 
								options := ctx.options.PrettyTablesOptions
 | 
				
			||||||
 | 
								table.SetAutoFormatHeaders(options.AutoFormatHeader)
 | 
				
			||||||
 | 
								table.SetAutoWrapText(options.AutoWrapText)
 | 
				
			||||||
 | 
								table.SetReflowDuringAutoWrap(options.ReflowDuringAutoWrap)
 | 
				
			||||||
 | 
								table.SetColWidth(options.ColWidth)
 | 
				
			||||||
 | 
								table.SetColumnSeparator(options.ColumnSeparator)
 | 
				
			||||||
 | 
								table.SetRowSeparator(options.RowSeparator)
 | 
				
			||||||
 | 
								table.SetCenterSeparator(options.CenterSeparator)
 | 
				
			||||||
 | 
								table.SetHeaderAlignment(options.HeaderAlignment)
 | 
				
			||||||
 | 
								table.SetFooterAlignment(options.FooterAlignment)
 | 
				
			||||||
 | 
								table.SetAlignment(options.Alignment)
 | 
				
			||||||
 | 
								table.SetColumnAlignment(options.ColumnAlignment)
 | 
				
			||||||
 | 
								table.SetNewLine(options.NewLine)
 | 
				
			||||||
 | 
								table.SetHeaderLine(options.HeaderLine)
 | 
				
			||||||
 | 
								table.SetRowLine(options.RowLine)
 | 
				
			||||||
 | 
								table.SetAutoMergeCells(options.AutoMergeCells)
 | 
				
			||||||
 | 
								table.SetBorders(options.Borders)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							table.SetHeader(ctx.tableCtx.header)
 | 
				
			||||||
 | 
							table.SetFooter(ctx.tableCtx.footer)
 | 
				
			||||||
 | 
							table.AppendBulk(ctx.tableCtx.body)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Render the table using ASCII.
 | 
				
			||||||
 | 
							table.Render()
 | 
				
			||||||
 | 
							if err := ctx.emit(buf.String()); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return ctx.emit("\n\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case atom.Tfoot:
 | 
				
			||||||
 | 
							ctx.tableCtx.isInFooter = true
 | 
				
			||||||
 | 
							if err := ctx.traverseChildren(node); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx.tableCtx.isInFooter = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case atom.Tr:
 | 
				
			||||||
 | 
							ctx.tableCtx.body = append(ctx.tableCtx.body, []string{})
 | 
				
			||||||
 | 
							if err := ctx.traverseChildren(node); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx.tableCtx.tmpRow++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case atom.Th:
 | 
				
			||||||
 | 
							res, err := ctx.renderEachChild(node)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ctx.tableCtx.header = append(ctx.tableCtx.header, res)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case atom.Td:
 | 
				
			||||||
 | 
							res, err := ctx.renderEachChild(node)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ctx.tableCtx.isInFooter {
 | 
				
			||||||
 | 
								ctx.tableCtx.footer = append(ctx.tableCtx.footer, res)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								ctx.tableCtx.body[ctx.tableCtx.tmpRow] = append(ctx.tableCtx.body[ctx.tableCtx.tmpRow], res)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ctx *textifyTraverseContext) traverse(node *html.Node) error {
 | 
				
			||||||
 | 
						switch node.Type {
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return ctx.traverseChildren(node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case html.TextNode:
 | 
				
			||||||
 | 
							var data string
 | 
				
			||||||
 | 
							if ctx.isPre {
 | 
				
			||||||
 | 
								data = node.Data
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								data = strings.TrimSpace(spacingRe.ReplaceAllString(node.Data, " "))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return ctx.emit(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case html.ElementNode:
 | 
				
			||||||
 | 
							return ctx.handleElement(node)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ctx *textifyTraverseCtx) traverseChildren(node *html.Node) error {
 | 
					func (ctx *textifyTraverseContext) traverseChildren(node *html.Node) error {
 | 
				
			||||||
	for c := node.FirstChild; c != nil; c = c.NextSibling {
 | 
						for c := node.FirstChild; c != nil; c = c.NextSibling {
 | 
				
			||||||
		if err := ctx.traverse(c); err != nil {
 | 
							if err := ctx.traverse(c); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
@@ -184,31 +418,33 @@ func (ctx *textifyTraverseCtx) traverseChildren(node *html.Node) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ctx *textifyTraverseCtx) emit(data string) error {
 | 
					func (ctx *textifyTraverseContext) emit(data string) error {
 | 
				
			||||||
	if len(data) == 0 {
 | 
						if data == "" {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	lines := ctx.breakLongLines(data)
 | 
						var (
 | 
				
			||||||
	var err error
 | 
							lines = ctx.breakLongLines(data)
 | 
				
			||||||
 | 
							err   error
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
	for _, line := range lines {
 | 
						for _, line := range lines {
 | 
				
			||||||
		runes := []rune(line)
 | 
							runes := []rune(line)
 | 
				
			||||||
		startsWithSpace := unicode.IsSpace(runes[0])
 | 
							startsWithSpace := unicode.IsSpace(runes[0])
 | 
				
			||||||
		if !startsWithSpace && !ctx.endsWithSpace {
 | 
							if !startsWithSpace && !ctx.endsWithSpace && !strings.HasPrefix(data, ".") {
 | 
				
			||||||
			ctx.Buf.WriteByte(' ')
 | 
								if err = ctx.buf.WriteByte(' '); err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			ctx.lineLength++
 | 
								ctx.lineLength++
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ctx.endsWithSpace = unicode.IsSpace(runes[len(runes)-1])
 | 
							ctx.endsWithSpace = unicode.IsSpace(runes[len(runes)-1])
 | 
				
			||||||
		for _, c := range line {
 | 
							for _, c := range line {
 | 
				
			||||||
			_, err = ctx.Buf.WriteString(string(c))
 | 
								if _, err = ctx.buf.WriteString(string(c)); err != nil {
 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				return err
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			ctx.lineLength++
 | 
								ctx.lineLength++
 | 
				
			||||||
			if c == '\n' {
 | 
								if c == '\n' {
 | 
				
			||||||
				ctx.lineLength = 0
 | 
									ctx.lineLength = 0
 | 
				
			||||||
				if ctx.prefix != "" {
 | 
									if ctx.prefix != "" {
 | 
				
			||||||
					_, err = ctx.Buf.WriteString(ctx.prefix)
 | 
										if _, err = ctx.buf.WriteString(ctx.prefix); err != nil {
 | 
				
			||||||
					if err != nil {
 | 
					 | 
				
			||||||
						return err
 | 
											return err
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -218,27 +454,31 @@ func (ctx *textifyTraverseCtx) emit(data string) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ctx *textifyTraverseCtx) breakLongLines(data string) []string {
 | 
					const maxLineLen = 74
 | 
				
			||||||
	// only break lines when we are in blockquotes
 | 
					
 | 
				
			||||||
 | 
					func (ctx *textifyTraverseContext) breakLongLines(data string) []string {
 | 
				
			||||||
 | 
						// Only break lines when in blockquotes.
 | 
				
			||||||
	if ctx.blockquoteLevel == 0 {
 | 
						if ctx.blockquoteLevel == 0 {
 | 
				
			||||||
		return []string{data}
 | 
							return []string{data}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	var ret []string
 | 
						var (
 | 
				
			||||||
	runes := []rune(data)
 | 
							ret      = []string{}
 | 
				
			||||||
	l := len(runes)
 | 
							runes    = []rune(data)
 | 
				
			||||||
	existing := ctx.lineLength
 | 
							l        = len(runes)
 | 
				
			||||||
	if existing >= 74 {
 | 
							existing = ctx.lineLength
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						if existing >= maxLineLen {
 | 
				
			||||||
		ret = append(ret, "\n")
 | 
							ret = append(ret, "\n")
 | 
				
			||||||
		existing = 0
 | 
							existing = 0
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for l+existing > 74 {
 | 
						for l+existing > maxLineLen {
 | 
				
			||||||
		i := 74 - existing
 | 
							i := maxLineLen - existing
 | 
				
			||||||
		for i >= 0 && !unicode.IsSpace(runes[i]) {
 | 
							for i >= 0 && !unicode.IsSpace(runes[i]) {
 | 
				
			||||||
			i--
 | 
								i--
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if i == -1 {
 | 
							if i == -1 {
 | 
				
			||||||
			// no spaces, so go the other way
 | 
								// No spaces, so go the other way.
 | 
				
			||||||
			i = 74 - existing
 | 
								i = maxLineLen - existing
 | 
				
			||||||
			for i < l && !unicode.IsSpace(runes[i]) {
 | 
								for i < l && !unicode.IsSpace(runes[i]) {
 | 
				
			||||||
				i++
 | 
									i++
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -257,12 +497,33 @@ func (ctx *textifyTraverseCtx) breakLongLines(data string) []string {
 | 
				
			|||||||
	return ret
 | 
						return ret
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (ctx *textifyTraverseCtx) normalizeHrefLink(link string) string {
 | 
					func (ctx *textifyTraverseContext) normalizeHrefLink(link string) string {
 | 
				
			||||||
	link = strings.TrimSpace(link)
 | 
						link = strings.TrimSpace(link)
 | 
				
			||||||
	link = strings.TrimPrefix(link, "mailto:")
 | 
						link = strings.TrimPrefix(link, "mailto:")
 | 
				
			||||||
	return link
 | 
						return link
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// renderEachChild visits each direct child of a node and collects the sequence of
 | 
				
			||||||
 | 
					// textuual representaitons separated by a single newline.
 | 
				
			||||||
 | 
					func (ctx *textifyTraverseContext) renderEachChild(node *html.Node) (string, error) {
 | 
				
			||||||
 | 
						buf := &bytes.Buffer{}
 | 
				
			||||||
 | 
						for c := node.FirstChild; c != nil; c = c.NextSibling {
 | 
				
			||||||
 | 
							s, err := FromHTMLNode(c, ctx.options)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return "", err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if _, err = buf.WriteString(s); err != nil {
 | 
				
			||||||
 | 
								return "", err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if c.NextSibling != nil {
 | 
				
			||||||
 | 
								if err = buf.WriteByte('\n'); err != nil {
 | 
				
			||||||
 | 
									return "", err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return buf.String(), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getAttrVal(node *html.Node, attrName string) string {
 | 
					func getAttrVal(node *html.Node, attrName string) string {
 | 
				
			||||||
	for _, attr := range node.Attr {
 | 
						for _, attr := range node.Attr {
 | 
				
			||||||
		if attr.Key == attrName {
 | 
							if attr.Key == attrName {
 | 
				
			||||||
@@ -272,29 +533,3 @@ func getAttrVal(node *html.Node, attrName string) string {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return ""
 | 
						return ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
func FromReader(reader io.Reader) (string, error) {
 | 
					 | 
				
			||||||
	doc, err := html.Parse(reader)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx := textifyTraverseCtx{
 | 
					 | 
				
			||||||
		Buf: bytes.Buffer{},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err = ctx.traverse(doc); err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	text := strings.TrimSpace(newlineRe.ReplaceAllString(
 | 
					 | 
				
			||||||
		strings.Replace(ctx.Buf.String(), "\n ", "\n", -1), "\n\n"))
 | 
					 | 
				
			||||||
	return text, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func FromString(input string) (string, error) {
 | 
					 | 
				
			||||||
	text, err := FromReader(strings.NewReader(input))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return "", err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return text, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										12
									
								
								vendor/github.com/kballard/go-shellquote/unquote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/kballard/go-shellquote/unquote.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -40,6 +40,18 @@ func Split(input string) (words []string, err error) {
 | 
				
			|||||||
		if strings.ContainsRune(splitChars, c) {
 | 
							if strings.ContainsRune(splitChars, c) {
 | 
				
			||||||
			input = input[l:]
 | 
								input = input[l:]
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
 | 
							} else if c == escapeChar {
 | 
				
			||||||
 | 
								// Look ahead for escaped newline so we can skip over it
 | 
				
			||||||
 | 
								next := input[l:]
 | 
				
			||||||
 | 
								if len(next) == 0 {
 | 
				
			||||||
 | 
									err = UnterminatedEscapeError
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								c2, l2 := utf8.DecodeRuneInString(next)
 | 
				
			||||||
 | 
								if c2 == '\n' {
 | 
				
			||||||
 | 
									input = next[l2:]
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		var word string
 | 
							var word string
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								vendor/github.com/mholt/archiver/v3/azure-pipelines.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/mholt/archiver/v3/azure-pipelines.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -83,6 +83,13 @@ steps:
 | 
				
			|||||||
    env
 | 
					    env
 | 
				
			||||||
  displayName: Print Go version and environment
 | 
					  displayName: Print Go version and environment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- script: |
 | 
				
			||||||
 | 
					    curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v1.31.0
 | 
				
			||||||
 | 
					    ./bin/golangci-lint run -E gofmt -E goimports -E misspell ./...
 | 
				
			||||||
 | 
					  workingDirectory: '$(modulePath)'
 | 
				
			||||||
 | 
					  condition: eq( variables['Agent.OS'], 'Linux' )
 | 
				
			||||||
 | 
					  displayName: Run Lint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- bash: |
 | 
					- bash: |
 | 
				
			||||||
    go mod tidy
 | 
					    go mod tidy
 | 
				
			||||||
    if [ ! -z "$(git status --porcelain go.mod)" ]; then
 | 
					    if [ ! -z "$(git status --porcelain go.mod)" ]; then
 | 
				
			||||||
@@ -99,10 +106,6 @@ steps:
 | 
				
			|||||||
  displayName: Ensure that module definition and checksums are correct
 | 
					  displayName: Ensure that module definition and checksums are correct
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- script: |
 | 
					- script: |
 | 
				
			||||||
    go get -v -t d ./...
 | 
					 | 
				
			||||||
    # ensure that the CORRECT golangci-list (as per go.mod) is run
 | 
					 | 
				
			||||||
    go mod vendor
 | 
					 | 
				
			||||||
    go run -mod=vendor github.com/golangci/golangci-lint/cmd/golangci-lint run -E gofmt -E goimports -E misspell
 | 
					 | 
				
			||||||
    go test -race ./...
 | 
					    go test -race ./...
 | 
				
			||||||
  workingDirectory: '$(modulePath)'
 | 
					  workingDirectory: '$(modulePath)'
 | 
				
			||||||
  displayName: Run tests
 | 
					  displayName: Run tests
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										27
									
								
								vendor/github.com/mholt/archiver/v3/error.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/mholt/archiver/v3/error.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					package archiver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IllegalPathError is an error returned when an illegal
 | 
				
			||||||
 | 
					// path is detected during the archival process.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// By default, only the Filename is showed on error, but you might
 | 
				
			||||||
 | 
					// also get the absolute value of the invalid path on the AbsolutePath
 | 
				
			||||||
 | 
					// field.
 | 
				
			||||||
 | 
					type IllegalPathError struct {
 | 
				
			||||||
 | 
						AbsolutePath string
 | 
				
			||||||
 | 
						Filename     string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (err *IllegalPathError) Error() string {
 | 
				
			||||||
 | 
						return fmt.Sprintf("illegal file path: %s", err.Filename)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsIllegalPathError returns true if the provided error is of
 | 
				
			||||||
 | 
					// the type IllegalPathError.
 | 
				
			||||||
 | 
					func IsIllegalPathError(err error) bool {
 | 
				
			||||||
 | 
						return err != nil && strings.Contains(err.Error(), "illegal file path: ")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										6
									
								
								vendor/github.com/mholt/archiver/v3/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/mholt/archiver/v3/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,17 +1,15 @@
 | 
				
			|||||||
module github.com/mholt/archiver/v3
 | 
					module github.com/mholt/archiver/v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.12
 | 
					go 1.13
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/andybalholm/brotli v1.0.0
 | 
						github.com/andybalholm/brotli v1.0.0
 | 
				
			||||||
	github.com/dsnet/compress v0.0.1
 | 
						github.com/dsnet/compress v0.0.1
 | 
				
			||||||
	github.com/frankban/quicktest v1.10.0 // indirect
 | 
					 | 
				
			||||||
	github.com/golang/snappy v0.0.1
 | 
						github.com/golang/snappy v0.0.1
 | 
				
			||||||
	github.com/golangci/golangci-lint v1.31.0
 | 
					 | 
				
			||||||
	github.com/klauspost/compress v1.10.10
 | 
						github.com/klauspost/compress v1.10.10
 | 
				
			||||||
	github.com/klauspost/pgzip v1.2.4
 | 
						github.com/klauspost/pgzip v1.2.4
 | 
				
			||||||
	github.com/nwaples/rardecode v1.1.0
 | 
						github.com/nwaples/rardecode v1.1.0
 | 
				
			||||||
	github.com/pierrec/lz4/v3 v3.3.2
 | 
						github.com/pierrec/lz4/v4 v4.0.3
 | 
				
			||||||
	github.com/ulikunitz/xz v0.5.7
 | 
						github.com/ulikunitz/xz v0.5.7
 | 
				
			||||||
	github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8
 | 
						github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										617
									
								
								vendor/github.com/mholt/archiver/v3/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										617
									
								
								vendor/github.com/mholt/archiver/v3/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,637 +1,24 @@
 | 
				
			|||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
					 | 
				
			||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 | 
					 | 
				
			||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 | 
					 | 
				
			||||||
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
 | 
					 | 
				
			||||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
 | 
					 | 
				
			||||||
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
 | 
					 | 
				
			||||||
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
 | 
					 | 
				
			||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 | 
					 | 
				
			||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
 | 
					 | 
				
			||||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
 | 
					 | 
				
			||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 | 
					 | 
				
			||||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
 | 
					 | 
				
			||||||
code.cloudfoundry.org/bytefmt v0.0.0-20190710193110-1eb035ffe2b6/go.mod h1:wN/zk7mhREp/oviagqUXY3EwuHhWyOvAdsn5Y4CzOrc=
 | 
					 | 
				
			||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 | 
					 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
 | 
					 | 
				
			||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
					 | 
				
			||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 | 
					 | 
				
			||||||
github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5 h1:XTrzB+F8+SpRmbhAH8HLxhiiG6nYNwaBZjrFps1oWEk=
 | 
					 | 
				
			||||||
github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
 | 
					 | 
				
			||||||
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
 | 
					 | 
				
			||||||
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
 | 
					 | 
				
			||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 | 
					 | 
				
			||||||
github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us=
 | 
					 | 
				
			||||||
github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
 | 
					 | 
				
			||||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 | 
					 | 
				
			||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
					 | 
				
			||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
					 | 
				
			||||||
github.com/andybalholm/brotli v1.0.0 h1:7UCwP93aiSfvWpapti8g88vVVGp2qqtGyePsSuDafo4=
 | 
					github.com/andybalholm/brotli v1.0.0 h1:7UCwP93aiSfvWpapti8g88vVVGp2qqtGyePsSuDafo4=
 | 
				
			||||||
github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
 | 
					github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
 | 
				
			||||||
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 | 
					 | 
				
			||||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 | 
					 | 
				
			||||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 | 
					 | 
				
			||||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 | 
					 | 
				
			||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
					 | 
				
			||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
					 | 
				
			||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 | 
					 | 
				
			||||||
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
 | 
					 | 
				
			||||||
github.com/bombsimon/wsl/v3 v3.1.0 h1:E5SRssoBgtVFPcYWUOFJEcgaySgdtTNYzsSKDOY7ss8=
 | 
					 | 
				
			||||||
github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc=
 | 
					 | 
				
			||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
					 | 
				
			||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
					 | 
				
			||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 | 
					 | 
				
			||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
					 | 
				
			||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
					 | 
				
			||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
					 | 
				
			||||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
					 | 
				
			||||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
					 | 
				
			||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
					 | 
				
			||||||
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 | 
					 | 
				
			||||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
					 | 
				
			||||||
github.com/daixiang0/gci v0.2.4 h1:BUCKk5nlK2m+kRIsoj+wb/5hazHvHeZieBKWd9Afa8Q=
 | 
					 | 
				
			||||||
github.com/daixiang0/gci v0.2.4/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4=
 | 
					 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					 | 
				
			||||||
github.com/denis-tingajkin/go-header v0.3.1 h1:ymEpSiFjeItCy1FOP+x0M2KdCELdEAHUsNa8F+hHc6w=
 | 
					 | 
				
			||||||
github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0=
 | 
					 | 
				
			||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
					 | 
				
			||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
					 | 
				
			||||||
github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q=
 | 
					github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q=
 | 
				
			||||||
github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo=
 | 
					github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo=
 | 
				
			||||||
github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
 | 
					github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY=
 | 
				
			||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 | 
					 | 
				
			||||||
github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
 | 
					 | 
				
			||||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 | 
					 | 
				
			||||||
github.com/frankban/quicktest v1.4.0 h1:rCSCih1FnSWJEel/eub9wclBSqpF2F/PuvxUWGWnbO8=
 | 
					 | 
				
			||||||
github.com/frankban/quicktest v1.4.0/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ=
 | 
					 | 
				
			||||||
github.com/frankban/quicktest v1.10.0 h1:Gfh+GAJZOAoKZsIZeZbdn2JF10kN1XHNvjsvQK8gVkE=
 | 
					 | 
				
			||||||
github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
 | 
					 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
					 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 | 
					 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 | 
					 | 
				
			||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
					 | 
				
			||||||
github.com/go-critic/go-critic v0.5.2 h1:3RJdgf6u4NZUumoP8nzbqiiNT8e1tC2Oc7jlgqre/IA=
 | 
					 | 
				
			||||||
github.com/go-critic/go-critic v0.5.2/go.mod h1:cc0+HvdE3lFpqLecgqMaJcvWWH77sLdBp+wLGPM1Yyo=
 | 
					 | 
				
			||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 | 
					 | 
				
			||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
					 | 
				
			||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
					 | 
				
			||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
					 | 
				
			||||||
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
 | 
					 | 
				
			||||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 | 
					 | 
				
			||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk=
 | 
					 | 
				
			||||||
github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
 | 
					 | 
				
			||||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=
 | 
					 | 
				
			||||||
github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
 | 
					 | 
				
			||||||
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
 | 
					 | 
				
			||||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
 | 
					 | 
				
			||||||
github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY=
 | 
					 | 
				
			||||||
github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 | 
					 | 
				
			||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 | 
					 | 
				
			||||||
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 | 
					 | 
				
			||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 | 
					 | 
				
			||||||
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 | 
					 | 
				
			||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
					 | 
				
			||||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 | 
					 | 
				
			||||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 | 
					 | 
				
			||||||
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 | 
					github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 | 
				
			||||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
					github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
				
			||||||
github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0=
 | 
					 | 
				
			||||||
github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
 | 
					 | 
				
			||||||
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM=
 | 
					 | 
				
			||||||
github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
 | 
					 | 
				
			||||||
github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w=
 | 
					 | 
				
			||||||
github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
 | 
					 | 
				
			||||||
github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw=
 | 
					 | 
				
			||||||
github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
 | 
					 | 
				
			||||||
github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8=
 | 
					 | 
				
			||||||
github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
 | 
					 | 
				
			||||||
github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d h1:pXTK/gkVNs7Zyy7WKgLXmpQ5bHTrq5GDsp8R9Qs67g0=
 | 
					 | 
				
			||||||
github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
 | 
					 | 
				
			||||||
github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks=
 | 
					 | 
				
			||||||
github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
 | 
					 | 
				
			||||||
github.com/golangci/golangci-lint v1.31.0 h1:+m9I3LEmxXLpymkXRPkDQGzOVBmBYm16UtDiXqZxWek=
 | 
					 | 
				
			||||||
github.com/golangci/golangci-lint v1.31.0/go.mod h1:aMQuNCA+NDU5+4jLL5pEuFHoue0IznKE2+/GsFvvs8A=
 | 
					 | 
				
			||||||
github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI=
 | 
					 | 
				
			||||||
github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
 | 
					 | 
				
			||||||
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA=
 | 
					 | 
				
			||||||
github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
 | 
					 | 
				
			||||||
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA=
 | 
					 | 
				
			||||||
github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
 | 
					 | 
				
			||||||
github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk=
 | 
					 | 
				
			||||||
github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
 | 
					 | 
				
			||||||
github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us=
 | 
					 | 
				
			||||||
github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
 | 
					 | 
				
			||||||
github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg=
 | 
					 | 
				
			||||||
github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
 | 
					 | 
				
			||||||
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys=
 | 
					 | 
				
			||||||
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
 | 
					 | 
				
			||||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
					 | 
				
			||||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
					 | 
				
			||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 | 
					 | 
				
			||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 | 
					 | 
				
			||||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 | 
					 | 
				
			||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 | 
					 | 
				
			||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 | 
					 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 | 
					 | 
				
			||||||
github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
 | 
					 | 
				
			||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 | 
					 | 
				
			||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
					 | 
				
			||||||
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
					 | 
				
			||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
					 | 
				
			||||||
github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
 | 
					 | 
				
			||||||
github.com/gostaticanalysis/analysisutil v0.0.3 h1:iwp+5/UAyzQSFgQ4uR2sni99sJ8Eo9DEacKWM5pekIg=
 | 
					 | 
				
			||||||
github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
 | 
					 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
 | 
					 | 
				
			||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 | 
					 | 
				
			||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 | 
					 | 
				
			||||||
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
 | 
					 | 
				
			||||||
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
 | 
					 | 
				
			||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
 | 
					 | 
				
			||||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 | 
					 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
					 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
					 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
					 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
					 | 
				
			||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 | 
					 | 
				
			||||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 | 
					 | 
				
			||||||
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
 | 
					 | 
				
			||||||
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
 | 
					 | 
				
			||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
					 | 
				
			||||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 | 
					 | 
				
			||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
					 | 
				
			||||||
github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk=
 | 
					 | 
				
			||||||
github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s=
 | 
					 | 
				
			||||||
github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 h1:jNYPNLe3d8smommaoQlK7LOA5ESyUJJ+Wf79ZtA7Vp4=
 | 
					 | 
				
			||||||
github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
 | 
					 | 
				
			||||||
github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
 | 
					 | 
				
			||||||
github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
 | 
					 | 
				
			||||||
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 | 
					 | 
				
			||||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
					 | 
				
			||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 | 
					 | 
				
			||||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 | 
					 | 
				
			||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 | 
					 | 
				
			||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
					 | 
				
			||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
					 | 
				
			||||||
github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
 | 
					 | 
				
			||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
					 | 
				
			||||||
github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
					github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
				
			||||||
github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
					 | 
				
			||||||
github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I=
 | 
					github.com/klauspost/compress v1.10.10 h1:a/y8CglcM7gLGYmlbP/stPE5sR3hbhFRUjCBfd/0B3I=
 | 
				
			||||||
github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
					github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
				
			||||||
github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE=
 | 
					github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE=
 | 
				
			||||||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 | 
					github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 | 
				
			||||||
github.com/klauspost/pgzip v1.2.4 h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A=
 | 
					github.com/klauspost/pgzip v1.2.4 h1:TQ7CNpYKovDOmqzRHKxJh0BeaBI7UdQZYc6p7pMQh1A=
 | 
				
			||||||
github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 | 
					github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
 | 
				
			||||||
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/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
					 | 
				
			||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
					 | 
				
			||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
					 | 
				
			||||||
github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
 | 
					 | 
				
			||||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 | 
					 | 
				
			||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
					 | 
				
			||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 | 
					 | 
				
			||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
					 | 
				
			||||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 | 
					 | 
				
			||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 | 
					 | 
				
			||||||
github.com/kyoh86/exportloopref v0.1.7 h1:u+iHuTbkbTS2D/JP7fCuZDo/t3rBVGo3Hf58Rc+lQVY=
 | 
					 | 
				
			||||||
github.com/kyoh86/exportloopref v0.1.7/go.mod h1:h1rDl2Kdj97+Kwh4gdz3ujE7XHmH51Q0lUiZ1z4NLj8=
 | 
					 | 
				
			||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 | 
					 | 
				
			||||||
github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
 | 
					 | 
				
			||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
					 | 
				
			||||||
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
 | 
					 | 
				
			||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
					 | 
				
			||||||
github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ=
 | 
					 | 
				
			||||||
github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU=
 | 
					 | 
				
			||||||
github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE=
 | 
					 | 
				
			||||||
github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
 | 
					 | 
				
			||||||
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 | 
					 | 
				
			||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
					 | 
				
			||||||
github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw=
 | 
					 | 
				
			||||||
github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
					 | 
				
			||||||
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 | 
					 | 
				
			||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
					 | 
				
			||||||
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
 | 
					 | 
				
			||||||
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
 | 
					 | 
				
			||||||
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 | 
					 | 
				
			||||||
github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 | 
					 | 
				
			||||||
github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
 | 
					 | 
				
			||||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
					 | 
				
			||||||
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 | 
					 | 
				
			||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
 | 
					 | 
				
			||||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
 | 
					 | 
				
			||||||
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
					 | 
				
			||||||
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 | 
					 | 
				
			||||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 | 
					 | 
				
			||||||
github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
 | 
					 | 
				
			||||||
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
 | 
					 | 
				
			||||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
 | 
					 | 
				
			||||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
 | 
					 | 
				
			||||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
					 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
					 | 
				
			||||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
					 | 
				
			||||||
github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
 | 
					 | 
				
			||||||
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 | 
					 | 
				
			||||||
github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw=
 | 
					 | 
				
			||||||
github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c=
 | 
					 | 
				
			||||||
github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E=
 | 
					 | 
				
			||||||
github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
 | 
					 | 
				
			||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 | 
					 | 
				
			||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 | 
					 | 
				
			||||||
github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0 h1:eMV1t2NQRc3r1k3guWiv/zEeqZZP6kPvpUfy6byfL1g=
 | 
					 | 
				
			||||||
github.com/nishanths/exhaustive v0.0.0-20200811152831-6cf413ae40e0/go.mod h1:wBEpHwM2OdmeNpdCvRPUlkEbBuaFmcK4Wv8Q7FuGW3c=
 | 
					 | 
				
			||||||
github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ=
 | 
					github.com/nwaples/rardecode v1.1.0 h1:vSxaY8vQhOcVr4mm5e8XllHWTiM4JF507A0Katqw7MQ=
 | 
				
			||||||
github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
 | 
					github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
 | 
				
			||||||
github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
 | 
					github.com/pierrec/lz4/v4 v4.0.3 h1:vNQKSVZNYUEAvRY9FaUXAF1XPbSOHJtDTiP41kzDz2E=
 | 
				
			||||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 | 
					github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 | 
				
			||||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 | 
					 | 
				
			||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					 | 
				
			||||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					 | 
				
			||||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 | 
					 | 
				
			||||||
github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y=
 | 
					 | 
				
			||||||
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
 | 
					 | 
				
			||||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
					 | 
				
			||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 | 
					 | 
				
			||||||
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
 | 
					 | 
				
			||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 | 
					 | 
				
			||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 | 
					 | 
				
			||||||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
					 | 
				
			||||||
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
 | 
					 | 
				
			||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 | 
					 | 
				
			||||||
github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA=
 | 
					 | 
				
			||||||
github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw=
 | 
					 | 
				
			||||||
github.com/pierrec/cmdflag v0.0.2/go.mod h1:a3zKGZ3cdQUfxjd0RGMLZr8xI3nvpJOB+m6o/1X5BmU=
 | 
					 | 
				
			||||||
github.com/pierrec/lz4/v3 v3.3.2 h1:QTUOCbMNDbK4PYtkuHyOBd28C0UhPBw3T4OH4WpFDik=
 | 
					 | 
				
			||||||
github.com/pierrec/lz4/v3 v3.3.2/go.mod h1:280XNCGS8jAcG++AHdd6SeWnzyJ1w9oow2vbORyey8Q=
 | 
					 | 
				
			||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					 | 
				
			||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					 | 
				
			||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
					 | 
				
			||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					 | 
				
			||||||
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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 | 
					 | 
				
			||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
					 | 
				
			||||||
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 | 
					 | 
				
			||||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 | 
					 | 
				
			||||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 | 
					 | 
				
			||||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 | 
					 | 
				
			||||||
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 | 
					 | 
				
			||||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 | 
					 | 
				
			||||||
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 | 
					 | 
				
			||||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
					 | 
				
			||||||
github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
 | 
					 | 
				
			||||||
github.com/quasilyte/go-ruleguard v0.2.0 h1:UOVMyH2EKkxIfzrULvA9n/tO+HtEhqD9mrLSWMr5FwU=
 | 
					 | 
				
			||||||
github.com/quasilyte/go-ruleguard v0.2.0/go.mod h1:2RT/tf0Ce0UDj5y243iWKosQogJd8+1G3Rs2fxmlYnw=
 | 
					 | 
				
			||||||
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY=
 | 
					 | 
				
			||||||
github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=
 | 
					 | 
				
			||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
					 | 
				
			||||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 | 
					 | 
				
			||||||
github.com/rogpeppe/go-internal v1.6.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
					 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
					 | 
				
			||||||
github.com/ryancurrah/gomodguard v1.1.0 h1:DWbye9KyMgytn8uYpuHkwf0RHqAYO6Ay/D0TbCpPtVU=
 | 
					 | 
				
			||||||
github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM=
 | 
					 | 
				
			||||||
github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw=
 | 
					 | 
				
			||||||
github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA=
 | 
					 | 
				
			||||||
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 | 
					 | 
				
			||||||
github.com/schollz/progressbar/v2 v2.13.2/go.mod h1:6YZjqdthH6SCZKv2rqGryrxPtfmRB/DWZxSMfCXPyD8=
 | 
					 | 
				
			||||||
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
 | 
					 | 
				
			||||||
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 | 
					 | 
				
			||||||
github.com/securego/gosec/v2 v2.4.0 h1:ivAoWcY5DMs9n04Abc1VkqZBO0FL0h4ShTcVsC53lCE=
 | 
					 | 
				
			||||||
github.com/securego/gosec/v2 v2.4.0/go.mod h1:0/Q4cjmlFDfDUj1+Fib61sc+U5IQb2w+Iv9/C3wPVko=
 | 
					 | 
				
			||||||
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU=
 | 
					 | 
				
			||||||
github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
 | 
					 | 
				
			||||||
github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc=
 | 
					 | 
				
			||||||
github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
 | 
					 | 
				
			||||||
github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
 | 
					 | 
				
			||||||
github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
 | 
					 | 
				
			||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 | 
					 | 
				
			||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
					 | 
				
			||||||
github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
 | 
					 | 
				
			||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 | 
					 | 
				
			||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
 | 
					 | 
				
			||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
					 | 
				
			||||||
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 | 
					 | 
				
			||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
					 | 
				
			||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 | 
					 | 
				
			||||||
github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY=
 | 
					 | 
				
			||||||
github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI=
 | 
					 | 
				
			||||||
github.com/sourcegraph/go-diff v0.6.0 h1:WbN9e/jD8ujU+o0vd9IFN5AEwtfB0rn/zM/AANaClqQ=
 | 
					 | 
				
			||||||
github.com/sourcegraph/go-diff v0.6.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
 | 
					 | 
				
			||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 | 
					 | 
				
			||||||
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
 | 
					 | 
				
			||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 | 
					 | 
				
			||||||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
 | 
					 | 
				
			||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
					 | 
				
			||||||
github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
 | 
					 | 
				
			||||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
 | 
					 | 
				
			||||||
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
 | 
					 | 
				
			||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 | 
					 | 
				
			||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
					 | 
				
			||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 | 
					 | 
				
			||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
					 | 
				
			||||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
 | 
					 | 
				
			||||||
github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
 | 
					 | 
				
			||||||
github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 | 
					 | 
				
			||||||
github.com/ssgreg/nlreturn/v2 v2.1.0 h1:6/s4Rc49L6Uo6RLjhWZGBpWWjfzk2yrf1nIW8m4wgVA=
 | 
					 | 
				
			||||||
github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=
 | 
					 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					 | 
				
			||||||
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
 | 
					 | 
				
			||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
					 | 
				
			||||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 | 
					 | 
				
			||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
					 | 
				
			||||||
github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ=
 | 
					 | 
				
			||||||
github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
 | 
					 | 
				
			||||||
github.com/tetafro/godot v0.4.8 h1:h61+hQraWhdI6WYqMwAwZYCE5yxL6a9/Orw4REbabSU=
 | 
					 | 
				
			||||||
github.com/tetafro/godot v0.4.8/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0=
 | 
					 | 
				
			||||||
github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q=
 | 
					 | 
				
			||||||
github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
 | 
					 | 
				
			||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
					 | 
				
			||||||
github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLKKwb7p1cnoygsbKIgNlJqSYBeAFON3Ar8As=
 | 
					 | 
				
			||||||
github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig=
 | 
					 | 
				
			||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 | 
					 | 
				
			||||||
github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8=
 | 
					github.com/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8=
 | 
				
			||||||
github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 | 
					github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 | 
				
			||||||
github.com/ulikunitz/xz v0.5.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4=
 | 
					github.com/ulikunitz/xz v0.5.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4=
 | 
				
			||||||
github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 | 
					github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
 | 
				
			||||||
github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA=
 | 
					 | 
				
			||||||
github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
 | 
					 | 
				
			||||||
github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg=
 | 
					 | 
				
			||||||
github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA=
 | 
					 | 
				
			||||||
github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs=
 | 
					 | 
				
			||||||
github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM=
 | 
					 | 
				
			||||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 | 
					 | 
				
			||||||
github.com/valyala/fasthttp v1.15.1/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA=
 | 
					 | 
				
			||||||
github.com/valyala/quicktemplate v1.6.2/go.mod h1:mtEJpQtUiBV0SHhMX6RtiJtqxncgrfmjcUy5T68X8TM=
 | 
					 | 
				
			||||||
github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
 | 
					 | 
				
			||||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
 | 
					github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
 | 
				
			||||||
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
 | 
					github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
 | 
				
			||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
					 | 
				
			||||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 | 
					 | 
				
			||||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					 | 
				
			||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					 | 
				
			||||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 | 
					 | 
				
			||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
					 | 
				
			||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
					 | 
				
			||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
					 | 
				
			||||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
					 | 
				
			||||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 | 
					 | 
				
			||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
					 | 
				
			||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
					 | 
				
			||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
					 | 
				
			||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 | 
					 | 
				
			||||||
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
 | 
					 | 
				
			||||||
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
 | 
					 | 
				
			||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 | 
					 | 
				
			||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 | 
					 | 
				
			||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
					 | 
				
			||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 | 
					 | 
				
			||||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 | 
					 | 
				
			||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
					 | 
				
			||||||
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
					 | 
				
			||||||
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
					 | 
				
			||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 | 
					 | 
				
			||||||
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 | 
					 | 
				
			||||||
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
 | 
					 | 
				
			||||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 | 
					 | 
				
			||||||
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 | 
					 | 
				
			||||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 | 
					 | 
				
			||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
					 | 
				
			||||||
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
 | 
					 | 
				
			||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
					 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
					 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980 h1:OjiUf46hAmXblsZdnoSXsEUSKU8r1UEzcL5RVZ4gO9Y=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					 | 
				
			||||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					 | 
				
			||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
					 | 
				
			||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
					 | 
				
			||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					 | 
				
			||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200321224714-0d839f3cf2ed/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200519015757-0d0afa43d58a/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200701041122-1837592efa10/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0 h1:SQvH+DjrwqD1hyyQU+K7JegHz1KEZgEwt17p9d6R2eg=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 | 
					 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 | 
					 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					 | 
				
			||||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 | 
					 | 
				
			||||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 | 
					 | 
				
			||||||
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 | 
					 | 
				
			||||||
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 | 
					 | 
				
			||||||
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 | 
					 | 
				
			||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
					 | 
				
			||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					 | 
				
			||||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					 | 
				
			||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 | 
					 | 
				
			||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
					 | 
				
			||||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 | 
					 | 
				
			||||||
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 | 
					 | 
				
			||||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 | 
					 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
					 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
					 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
					 | 
				
			||||||
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/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
					 | 
				
			||||||
google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
 | 
					 | 
				
			||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
					 | 
				
			||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
					 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
 | 
					 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					 | 
				
			||||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
					 | 
				
			||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 | 
					 | 
				
			||||||
gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
 | 
					 | 
				
			||||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					 | 
				
			||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 | 
					 | 
				
			||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 | 
					 | 
				
			||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
					 | 
				
			||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
					 | 
				
			||||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
					 | 
				
			||||||
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
					 | 
				
			||||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 | 
					 | 
				
			||||||
honnef.co/go/tools v0.0.1-2020.1.5 h1:nI5egYTGJakVyOryqLs1cQO5dO0ksin5XXs2pspk75k=
 | 
					 | 
				
			||||||
honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 | 
					 | 
				
			||||||
mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f h1:gi7cb8HTDZ6q8VqsUpkdoFi3vxwHMneQ6+Q5Ap5hjPE=
 | 
					 | 
				
			||||||
mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f/go.mod h1:9VQ397fNXEnF84t90W4r4TRCQK+pg9f8ugVfyj+S26w=
 | 
					 | 
				
			||||||
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
 | 
					 | 
				
			||||||
mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
 | 
					 | 
				
			||||||
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo=
 | 
					 | 
				
			||||||
mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
 | 
					 | 
				
			||||||
mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4=
 | 
					 | 
				
			||||||
mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw=
 | 
					 | 
				
			||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								vendor/github.com/mholt/archiver/v3/lz4.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/mholt/archiver/v3/lz4.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -5,7 +5,7 @@ import (
 | 
				
			|||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"path/filepath"
 | 
						"path/filepath"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/pierrec/lz4/v3"
 | 
						"github.com/pierrec/lz4/v4"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Lz4 facilitates LZ4 compression.
 | 
					// Lz4 facilitates LZ4 compression.
 | 
				
			||||||
@@ -16,7 +16,14 @@ type Lz4 struct {
 | 
				
			|||||||
// Compress reads in, compresses it, and writes it to out.
 | 
					// Compress reads in, compresses it, and writes it to out.
 | 
				
			||||||
func (lz *Lz4) Compress(in io.Reader, out io.Writer) error {
 | 
					func (lz *Lz4) Compress(in io.Reader, out io.Writer) error {
 | 
				
			||||||
	w := lz4.NewWriter(out)
 | 
						w := lz4.NewWriter(out)
 | 
				
			||||||
	w.Header.CompressionLevel = lz.CompressionLevel
 | 
						// TODO archiver v4: use proper lz4.Fast
 | 
				
			||||||
 | 
						// bitshifting for backwards compatibility with lz4/v3
 | 
				
			||||||
 | 
						options := []lz4.Option{
 | 
				
			||||||
 | 
							lz4.CompressionLevelOption(lz4.CompressionLevel(1 << (8 + lz.CompressionLevel))),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := w.Apply(options...); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	defer w.Close()
 | 
						defer w.Close()
 | 
				
			||||||
	_, err := io.Copy(w, in)
 | 
						_, err := io.Copy(w, in)
 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								vendor/github.com/mholt/archiver/v3/rar.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/mholt/archiver/v3/rar.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -40,6 +40,10 @@ type Rar struct {
 | 
				
			|||||||
	// especially on extraction.
 | 
						// especially on extraction.
 | 
				
			||||||
	ImplicitTopLevelFolder bool
 | 
						ImplicitTopLevelFolder bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Strip number of leading paths. This feature is available
 | 
				
			||||||
 | 
						// only during unpacking of the entire archive.
 | 
				
			||||||
 | 
						StripComponents int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If true, errors encountered during reading
 | 
						// If true, errors encountered during reading
 | 
				
			||||||
	// or writing a single file will be logged and
 | 
						// or writing a single file will be logged and
 | 
				
			||||||
	// the operation will continue on remaining files.
 | 
						// the operation will continue on remaining files.
 | 
				
			||||||
@@ -66,7 +70,7 @@ func (*Rar) CheckPath(to, filename string) error {
 | 
				
			|||||||
	dest := filepath.Join(to, filename)
 | 
						dest := filepath.Join(to, filename)
 | 
				
			||||||
	//prevent path traversal attacks
 | 
						//prevent path traversal attacks
 | 
				
			||||||
	if !strings.HasPrefix(dest, to) {
 | 
						if !strings.HasPrefix(dest, to) {
 | 
				
			||||||
		return fmt.Errorf("illegal file path: %s", filename)
 | 
							return &IllegalPathError{AbsolutePath: dest, Filename: filename}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -105,7 +109,7 @@ func (r *Rar) Unarchive(source, destination string) error {
 | 
				
			|||||||
			break
 | 
								break
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			if r.ContinueOnError || strings.Contains(err.Error(), "illegal file path") {
 | 
								if r.ContinueOnError || IsIllegalPathError(err) {
 | 
				
			||||||
				log.Printf("[ERROR] Reading file in rar archive: %v", err)
 | 
									log.Printf("[ERROR] Reading file in rar archive: %v", err)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -168,6 +172,17 @@ func (r *Rar) unrarNext(to string) error {
 | 
				
			|||||||
		return fmt.Errorf("checking path traversal attempt: %v", errPath)
 | 
							return fmt.Errorf("checking path traversal attempt: %v", errPath)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if r.StripComponents > 0 {
 | 
				
			||||||
 | 
							if strings.Count(header.Name, "/") < r.StripComponents {
 | 
				
			||||||
 | 
								return nil // skip path with fewer components
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for i := 0; i < r.StripComponents; i++ {
 | 
				
			||||||
 | 
								slash := strings.Index(header.Name, "/")
 | 
				
			||||||
 | 
								header.Name = header.Name[slash+1:]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return r.unrarFile(f, filepath.Join(to, header.Name))
 | 
						return r.unrarFile(f, filepath.Join(to, header.Name))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								vendor/github.com/mholt/archiver/v3/tar.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/mholt/archiver/v3/tar.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -40,6 +40,10 @@ type Tar struct {
 | 
				
			|||||||
	// especially on extraction.
 | 
						// especially on extraction.
 | 
				
			||||||
	ImplicitTopLevelFolder bool
 | 
						ImplicitTopLevelFolder bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Strip number of leading paths. This feature is available
 | 
				
			||||||
 | 
						// only during unpacking of the entire archive.
 | 
				
			||||||
 | 
						StripComponents int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If true, errors encountered during reading
 | 
						// If true, errors encountered during reading
 | 
				
			||||||
	// or writing a single file will be logged and
 | 
						// or writing a single file will be logged and
 | 
				
			||||||
	// the operation will continue on remaining files.
 | 
						// the operation will continue on remaining files.
 | 
				
			||||||
@@ -67,7 +71,7 @@ func (*Tar) CheckPath(to, filename string) error {
 | 
				
			|||||||
	dest := filepath.Join(to, filename)
 | 
						dest := filepath.Join(to, filename)
 | 
				
			||||||
	//prevent path traversal attacks
 | 
						//prevent path traversal attacks
 | 
				
			||||||
	if !strings.HasPrefix(dest, to) {
 | 
						if !strings.HasPrefix(dest, to) {
 | 
				
			||||||
		return fmt.Errorf("illegal file path: %s", filename)
 | 
							return &IllegalPathError{AbsolutePath: dest, Filename: filename}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -161,7 +165,7 @@ func (t *Tar) Unarchive(source, destination string) error {
 | 
				
			|||||||
			break
 | 
								break
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			if t.ContinueOnError || strings.Contains(err.Error(), "illegal file path") {
 | 
								if t.ContinueOnError || IsIllegalPathError(err) {
 | 
				
			||||||
				log.Printf("[ERROR] Reading file in tar archive: %v", err)
 | 
									log.Printf("[ERROR] Reading file in tar archive: %v", err)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -233,6 +237,17 @@ func (t *Tar) untarNext(destination string) error {
 | 
				
			|||||||
	if errPath != nil {
 | 
						if errPath != nil {
 | 
				
			||||||
		return fmt.Errorf("checking path traversal attempt: %v", errPath)
 | 
							return fmt.Errorf("checking path traversal attempt: %v", errPath)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if t.StripComponents > 0 {
 | 
				
			||||||
 | 
							if strings.Count(header.Name, "/") < t.StripComponents {
 | 
				
			||||||
 | 
								return nil // skip path with fewer components
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for i := 0; i < t.StripComponents; i++ {
 | 
				
			||||||
 | 
								slash := strings.Index(header.Name, "/")
 | 
				
			||||||
 | 
								header.Name = header.Name[slash+1:]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	return t.untarFile(f, destination, header)
 | 
						return t.untarFile(f, destination, header)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								vendor/github.com/mholt/archiver/v3/tarlz4.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/mholt/archiver/v3/tarlz4.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -5,7 +5,7 @@ import (
 | 
				
			|||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/pierrec/lz4/v3"
 | 
						"github.com/pierrec/lz4/v4"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TarLz4 facilitates lz4 compression
 | 
					// TarLz4 facilitates lz4 compression
 | 
				
			||||||
@@ -84,7 +84,14 @@ func (tlz4 *TarLz4) wrapWriter() {
 | 
				
			|||||||
	var lz4w *lz4.Writer
 | 
						var lz4w *lz4.Writer
 | 
				
			||||||
	tlz4.Tar.writerWrapFn = func(w io.Writer) (io.Writer, error) {
 | 
						tlz4.Tar.writerWrapFn = func(w io.Writer) (io.Writer, error) {
 | 
				
			||||||
		lz4w = lz4.NewWriter(w)
 | 
							lz4w = lz4.NewWriter(w)
 | 
				
			||||||
		lz4w.Header.CompressionLevel = tlz4.CompressionLevel
 | 
							// TODO archiver v4: use proper lz4.Fast
 | 
				
			||||||
 | 
							// bitshifting for backwards compatibility with lz4/v3
 | 
				
			||||||
 | 
							options := []lz4.Option{
 | 
				
			||||||
 | 
								lz4.CompressionLevelOption(lz4.CompressionLevel(1 << (8 + tlz4.CompressionLevel))),
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if err := lz4w.Apply(options...); err != nil {
 | 
				
			||||||
 | 
								return lz4w, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		return lz4w, nil
 | 
							return lz4w, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	tlz4.Tar.cleanupWrapFn = func() {
 | 
						tlz4.Tar.cleanupWrapFn = func() {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										37
									
								
								vendor/github.com/mholt/archiver/v3/zip.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/mholt/archiver/v3/zip.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -70,6 +70,10 @@ type Zip struct {
 | 
				
			|||||||
	// especially on extraction.
 | 
						// especially on extraction.
 | 
				
			||||||
	ImplicitTopLevelFolder bool
 | 
						ImplicitTopLevelFolder bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Strip number of leading paths. This feature is available
 | 
				
			||||||
 | 
						// only during unpacking of the entire archive.
 | 
				
			||||||
 | 
						StripComponents int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// If true, errors encountered during reading
 | 
						// If true, errors encountered during reading
 | 
				
			||||||
	// or writing a single file will be logged and
 | 
						// or writing a single file will be logged and
 | 
				
			||||||
	// the operation will continue on remaining files.
 | 
						// the operation will continue on remaining files.
 | 
				
			||||||
@@ -123,7 +127,7 @@ func (*Zip) CheckPath(to, filename string) error {
 | 
				
			|||||||
	dest := filepath.Join(to, filename)
 | 
						dest := filepath.Join(to, filename)
 | 
				
			||||||
	//prevent path traversal attacks
 | 
						//prevent path traversal attacks
 | 
				
			||||||
	if !strings.HasPrefix(dest, to) {
 | 
						if !strings.HasPrefix(dest, to) {
 | 
				
			||||||
		return fmt.Errorf("illegal file path: %s", filename)
 | 
							return &IllegalPathError{AbsolutePath: dest, Filename: filename}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -225,7 +229,7 @@ func (z *Zip) Unarchive(source, destination string) error {
 | 
				
			|||||||
			break
 | 
								break
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			if z.ContinueOnError || strings.Contains(err.Error(), "illegal file path") {
 | 
								if z.ContinueOnError || IsIllegalPathError(err) {
 | 
				
			||||||
				log.Printf("[ERROR] Reading file in zip archive: %v", err)
 | 
									log.Printf("[ERROR] Reading file in zip archive: %v", err)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -243,19 +247,30 @@ func (z *Zip) extractNext(to string) error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	defer f.Close()
 | 
						defer f.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	errPath := z.CheckPath(to, f.Header.(zip.FileHeader).Name)
 | 
					 | 
				
			||||||
	if errPath != nil {
 | 
					 | 
				
			||||||
		return fmt.Errorf("checking path traversal attempt: %v", errPath)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return z.extractFile(f, to)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (z *Zip) extractFile(f File, to string) error {
 | 
					 | 
				
			||||||
	header, ok := f.Header.(zip.FileHeader)
 | 
						header, ok := f.Header.(zip.FileHeader)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		return fmt.Errorf("expected header to be zip.FileHeader but was %T", f.Header)
 | 
							return fmt.Errorf("expected header to be zip.FileHeader but was %T", f.Header)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						errPath := z.CheckPath(to, header.Name)
 | 
				
			||||||
 | 
						if errPath != nil {
 | 
				
			||||||
 | 
							return fmt.Errorf("checking path traversal attempt: %v", errPath)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if z.StripComponents > 0 {
 | 
				
			||||||
 | 
							if strings.Count(header.Name, "/") < z.StripComponents {
 | 
				
			||||||
 | 
								return nil // skip path with fewer components
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for i := 0; i < z.StripComponents; i++ {
 | 
				
			||||||
 | 
								slash := strings.Index(header.Name, "/")
 | 
				
			||||||
 | 
								header.Name = header.Name[slash+1:]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return z.extractFile(f, to, &header)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (z *Zip) extractFile(f File, to string, header *zip.FileHeader) error {
 | 
				
			||||||
	to = filepath.Join(to, header.Name)
 | 
						to = filepath.Join(to, header.Name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// if a directory, no content; simply make the directory and return
 | 
						// if a directory, no content; simply make the directory and return
 | 
				
			||||||
@@ -583,7 +598,7 @@ func (z *Zip) Extract(source, target, destination string) error {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
			joined := filepath.Join(destination, end)
 | 
								joined := filepath.Join(destination, end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			err = z.extractFile(f, joined)
 | 
								err = z.extractFile(f, joined, &zfh)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return fmt.Errorf("extracting file %s: %v", zfh.Name, err)
 | 
									return fmt.Errorf("extracting file %s: %v", zfh.Name, err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/mholt/archiver/v3/zstd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/mholt/archiver/v3/zstd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -10,11 +10,13 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Zstd facilitates Zstandard compression.
 | 
					// Zstd facilitates Zstandard compression.
 | 
				
			||||||
type Zstd struct {
 | 
					type Zstd struct {
 | 
				
			||||||
 | 
						EncoderOptions []zstd.EOption
 | 
				
			||||||
 | 
						DecoderOptions []zstd.DOption
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Compress reads in, compresses it, and writes it to out.
 | 
					// Compress reads in, compresses it, and writes it to out.
 | 
				
			||||||
func (zs *Zstd) Compress(in io.Reader, out io.Writer) error {
 | 
					func (zs *Zstd) Compress(in io.Reader, out io.Writer) error {
 | 
				
			||||||
	w, err := zstd.NewWriter(out)
 | 
						w, err := zstd.NewWriter(out, zs.EncoderOptions...)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -25,7 +27,7 @@ func (zs *Zstd) Compress(in io.Reader, out io.Writer) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Decompress reads in, decompresses it, and writes it to out.
 | 
					// Decompress reads in, decompresses it, and writes it to out.
 | 
				
			||||||
func (zs *Zstd) Decompress(in io.Reader, out io.Writer) error {
 | 
					func (zs *Zstd) Decompress(in io.Reader, out io.Writer) error {
 | 
				
			||||||
	r, err := zstd.NewReader(in)
 | 
						r, err := zstd.NewReader(in, zs.DecoderOptions...)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								vendor/github.com/msteinert/pam/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/msteinert/pam/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,8 +1,8 @@
 | 
				
			|||||||
language: go
 | 
					language: go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
  - 1.4
 | 
					  - 1.10.x
 | 
				
			||||||
  - 1.5
 | 
					  - 1.11.x
 | 
				
			||||||
  - tip
 | 
					  - tip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
before_install:
 | 
					before_install:
 | 
				
			||||||
@@ -15,4 +15,4 @@ before_install:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
script:
 | 
					script:
 | 
				
			||||||
  - sudo GOROOT=$GOROOT GOPATH=$GOPATH $(which go) test -v -covermode=count -coverprofile=coverage.out .
 | 
					  - sudo GOROOT=$GOROOT GOPATH=$GOPATH $(which go) test -v -covermode=count -coverprofile=coverage.out .
 | 
				
			||||||
  - goveralls -coverprofile=coverage.out -service travis-ci -repotoken $REPO_TOKEN
 | 
					  - if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then goveralls -coverprofile=coverage.out -service travis-ci -repotoken $REPO_TOKEN; fi
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										8
									
								
								vendor/github.com/msteinert/pam/transaction.c
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/msteinert/pam/transaction.c
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,9 +2,15 @@
 | 
				
			|||||||
#include <security/pam_appl.h>
 | 
					#include <security/pam_appl.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __sun
 | 
				
			||||||
 | 
					#define PAM_CONST
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define PAM_CONST const
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int cb_pam_conv(
 | 
					int cb_pam_conv(
 | 
				
			||||||
	int num_msg,
 | 
						int num_msg,
 | 
				
			||||||
	const struct pam_message **msg,
 | 
						PAM_CONST struct pam_message **msg,
 | 
				
			||||||
	struct pam_response **resp,
 | 
						struct pam_response **resp,
 | 
				
			||||||
	void *appdata_ptr)
 | 
						void *appdata_ptr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								vendor/github.com/olivere/elastic/v7/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/olivere/elastic/v7/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -163,6 +163,7 @@ Pedro [@otherview](https://github.com/otherview)
 | 
				
			|||||||
Pete C [@peteclark-ft](https://github.com/peteclark-ft)
 | 
					Pete C [@peteclark-ft](https://github.com/peteclark-ft)
 | 
				
			||||||
Peter Nagy [@nagypeterjob](https://github.com/nagypeterjob)
 | 
					Peter Nagy [@nagypeterjob](https://github.com/nagypeterjob)
 | 
				
			||||||
Paolo [@ppiccolo](https://github.com/ppiccolo)
 | 
					Paolo [@ppiccolo](https://github.com/ppiccolo)
 | 
				
			||||||
 | 
					Phillip Baker [@phillbaker](https://github.com/phillbaker)
 | 
				
			||||||
Igor Panychek [@panychek](https://github.com/panychek)
 | 
					Igor Panychek [@panychek](https://github.com/panychek)
 | 
				
			||||||
Radoslaw Wesolowski [@r--w](https://github.com/r--w)
 | 
					Radoslaw Wesolowski [@r--w](https://github.com/r--w)
 | 
				
			||||||
Rafał Gałus [@rgalus](https://github.com/rgalus)
 | 
					Rafał Gałus [@rgalus](https://github.com/rgalus)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								vendor/github.com/olivere/elastic/v7/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/olivere/elastic/v7/client.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -25,7 +25,7 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	// Version is the current version of Elastic.
 | 
						// Version is the current version of Elastic.
 | 
				
			||||||
	Version = "7.0.20"
 | 
						Version = "7.0.21"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// DefaultURL is the default endpoint of Elasticsearch on the local machine.
 | 
						// DefaultURL is the default endpoint of Elasticsearch on the local machine.
 | 
				
			||||||
	// It is used e.g. when initializing a new Client without a specific URL.
 | 
						// It is used e.g. when initializing a new Client without a specific URL.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										4
									
								
								vendor/github.com/olivere/elastic/v7/docker-compose.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/olivere/elastic/v7/docker-compose.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,7 +2,7 @@ version: '3'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
services:
 | 
					services:
 | 
				
			||||||
  elasticsearch:
 | 
					  elasticsearch:
 | 
				
			||||||
    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.9.0
 | 
					    image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.9.2
 | 
				
			||||||
    hostname: elasticsearch
 | 
					    hostname: elasticsearch
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - cluster.name=elasticsearch
 | 
					      - cluster.name=elasticsearch
 | 
				
			||||||
@@ -28,7 +28,7 @@ services:
 | 
				
			|||||||
    ports:
 | 
					    ports:
 | 
				
			||||||
      - 9200:9200
 | 
					      - 9200:9200
 | 
				
			||||||
  platinum:
 | 
					  platinum:
 | 
				
			||||||
    image: docker.elastic.co/elasticsearch/elasticsearch:7.9.0
 | 
					    image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
 | 
				
			||||||
    hostname: elasticsearch-platinum
 | 
					    hostname: elasticsearch-platinum
 | 
				
			||||||
    environment:
 | 
					    environment:
 | 
				
			||||||
      - cluster.name=platinum
 | 
					      - cluster.name=platinum
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								vendor/github.com/olivere/elastic/v7/inner_hit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/olivere/elastic/v7/inner_hit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -41,6 +41,11 @@ func (hit *InnerHit) Query(query Query) *InnerHit {
 | 
				
			|||||||
	return hit
 | 
						return hit
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (hit *InnerHit) Collapse(collapse *CollapseBuilder) *InnerHit {
 | 
				
			||||||
 | 
						hit.source.Collapse(collapse)
 | 
				
			||||||
 | 
						return hit
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (hit *InnerHit) From(from int) *InnerHit {
 | 
					func (hit *InnerHit) From(from int) *InnerHit {
 | 
				
			||||||
	hit.source.From(from)
 | 
						hit.source.From(from)
 | 
				
			||||||
	return hit
 | 
						return hit
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								vendor/github.com/olivere/elastic/v7/scroll.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/olivere/elastic/v7/scroll.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -45,6 +45,7 @@ type ScrollService struct {
 | 
				
			|||||||
	allowNoIndices     *bool
 | 
						allowNoIndices     *bool
 | 
				
			||||||
	expandWildcards    string
 | 
						expandWildcards    string
 | 
				
			||||||
	maxResponseSize    int64
 | 
						maxResponseSize    int64
 | 
				
			||||||
 | 
						restTotalHitsAsInt *bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mu       sync.RWMutex
 | 
						mu       sync.RWMutex
 | 
				
			||||||
	scrollId string
 | 
						scrollId string
 | 
				
			||||||
@@ -249,6 +250,13 @@ func (s *ScrollService) TrackTotalHits(trackTotalHits interface{}) *ScrollServic
 | 
				
			|||||||
	return s
 | 
						return s
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RestTotalHitsAsInt indicates whether hits.total should be rendered as an
 | 
				
			||||||
 | 
					// integer or an object in the rest search response.
 | 
				
			||||||
 | 
					func (s *ScrollService) RestTotalHitsAsInt(enabled bool) *ScrollService {
 | 
				
			||||||
 | 
						s.restTotalHitsAsInt = &enabled
 | 
				
			||||||
 | 
						return s
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Routing is a list of specific routing values to control the shards
 | 
					// Routing is a list of specific routing values to control the shards
 | 
				
			||||||
// the search will be executed on.
 | 
					// the search will be executed on.
 | 
				
			||||||
func (s *ScrollService) Routing(routings ...string) *ScrollService {
 | 
					func (s *ScrollService) Routing(routings ...string) *ScrollService {
 | 
				
			||||||
@@ -507,6 +515,9 @@ func (s *ScrollService) buildFirstURL() (string, url.Values, error) {
 | 
				
			|||||||
	if s.ignoreThrottled != nil {
 | 
						if s.ignoreThrottled != nil {
 | 
				
			||||||
		params.Set("ignore_throttled", fmt.Sprintf("%v", *s.ignoreThrottled))
 | 
							params.Set("ignore_throttled", fmt.Sprintf("%v", *s.ignoreThrottled))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if v := s.restTotalHitsAsInt; v != nil {
 | 
				
			||||||
 | 
							params.Set("rest_total_hits_as_int", fmt.Sprint(*v))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return path, params, nil
 | 
						return path, params, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -607,6 +618,9 @@ func (s *ScrollService) buildNextURL() (string, url.Values, error) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		params.Set("filter_path", strings.Join(s.filterPath, ","))
 | 
							params.Set("filter_path", strings.Join(s.filterPath, ","))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if v := s.restTotalHitsAsInt; v != nil {
 | 
				
			||||||
 | 
							params.Set("rest_total_hits_as_int", fmt.Sprint(*v))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return path, params, nil
 | 
						return path, params, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								vendor/github.com/philhofer/fwd/reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/philhofer/fwd/reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -50,11 +50,24 @@ func NewReader(r io.Reader) *Reader {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewReaderSize returns a new *Reader that
 | 
					// NewReaderSize returns a new *Reader that
 | 
				
			||||||
// reads from 'r' and has a buffer size 'n'
 | 
					// reads from 'r' and has a buffer size 'n'.
 | 
				
			||||||
func NewReaderSize(r io.Reader, n int) *Reader {
 | 
					func NewReaderSize(r io.Reader, n int) *Reader {
 | 
				
			||||||
 | 
						buf := make([]byte, 0, max(n, minReaderSize))
 | 
				
			||||||
 | 
						return NewReaderBuf(r, buf)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewReaderBuf returns a new *Reader that
 | 
				
			||||||
 | 
					// reads from 'r' and uses 'buf' as a buffer.
 | 
				
			||||||
 | 
					// 'buf' is not used when has smaller capacity than 16,
 | 
				
			||||||
 | 
					// custom buffer is allocated instead.
 | 
				
			||||||
 | 
					func NewReaderBuf(r io.Reader, buf []byte) *Reader {
 | 
				
			||||||
 | 
						if cap(buf) < minReaderSize {
 | 
				
			||||||
 | 
							buf = make([]byte, 0, minReaderSize)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buf = buf[:0]
 | 
				
			||||||
	rd := &Reader{
 | 
						rd := &Reader{
 | 
				
			||||||
		r:    r,
 | 
							r:    r,
 | 
				
			||||||
		data: make([]byte, 0, max(minReaderSize, n)),
 | 
							data: buf,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if s, ok := r.(io.Seeker); ok {
 | 
						if s, ok := r.(io.Seeker); ok {
 | 
				
			||||||
		rd.rs = s
 | 
							rd.rs = s
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										24
									
								
								vendor/github.com/philhofer/fwd/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/philhofer/fwd/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -29,16 +29,28 @@ func NewWriter(w io.Writer) *Writer {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewWriterSize returns a new writer
 | 
					// NewWriterSize returns a new writer that
 | 
				
			||||||
// that writes to 'w' and has a buffer
 | 
					// writes to 'w' and has a buffer size 'n'.
 | 
				
			||||||
// that is 'size' bytes.
 | 
					func NewWriterSize(w io.Writer, n int) *Writer {
 | 
				
			||||||
func NewWriterSize(w io.Writer, size int) *Writer {
 | 
						if wr, ok := w.(*Writer); ok && cap(wr.buf) >= n {
 | 
				
			||||||
	if wr, ok := w.(*Writer); ok && cap(wr.buf) >= size {
 | 
					 | 
				
			||||||
		return wr
 | 
							return wr
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						buf := make([]byte, 0, max(n, minWriterSize))
 | 
				
			||||||
 | 
						return NewWriterBuf(w, buf)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewWriterBuf returns a new writer
 | 
				
			||||||
 | 
					// that writes to 'w' and has 'buf' as a buffer.
 | 
				
			||||||
 | 
					// 'buf' is not used when has smaller capacity than 18,
 | 
				
			||||||
 | 
					// custom buffer is allocated instead.
 | 
				
			||||||
 | 
					func NewWriterBuf(w io.Writer, buf []byte) *Writer {
 | 
				
			||||||
 | 
						if cap(buf) < minWriterSize {
 | 
				
			||||||
 | 
							buf = make([]byte, 0, minWriterSize)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buf = buf[:0]
 | 
				
			||||||
	return &Writer{
 | 
						return &Writer{
 | 
				
			||||||
		w:   w,
 | 
							w:   w,
 | 
				
			||||||
		buf: make([]byte, 0, max(size, minWriterSize)),
 | 
							buf: buf,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										23
									
								
								vendor/github.com/pierrec/lz4/v3/debug.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/pierrec/lz4/v3/debug.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,23 +0,0 @@
 | 
				
			|||||||
// +build lz4debug
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package lz4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	"path/filepath"
 | 
					 | 
				
			||||||
	"runtime"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const debugFlag = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func debug(args ...interface{}) {
 | 
					 | 
				
			||||||
	_, file, line, _ := runtime.Caller(1)
 | 
					 | 
				
			||||||
	file = filepath.Base(file)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	f := fmt.Sprintf("LZ4: %s:%d %s", file, line, args[0])
 | 
					 | 
				
			||||||
	if f[len(f)-1] != '\n' {
 | 
					 | 
				
			||||||
		f += "\n"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	fmt.Fprintf(os.Stderr, f, args[1:]...)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										7
									
								
								vendor/github.com/pierrec/lz4/v3/debug_stub.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/pierrec/lz4/v3/debug_stub.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,7 +0,0 @@
 | 
				
			|||||||
// +build !lz4debug
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package lz4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const debugFlag = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func debug(args ...interface{}) {}
 | 
					 | 
				
			||||||
							
								
								
									
										30
									
								
								vendor/github.com/pierrec/lz4/v3/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/github.com/pierrec/lz4/v3/errors.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,30 +0,0 @@
 | 
				
			|||||||
package lz4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"os"
 | 
					 | 
				
			||||||
	rdebug "runtime/debug"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	// ErrInvalidSourceShortBuffer is returned by UncompressBlock or CompressBLock when a compressed
 | 
					 | 
				
			||||||
	// block is corrupted or the destination buffer is not large enough for the uncompressed data.
 | 
					 | 
				
			||||||
	ErrInvalidSourceShortBuffer = errors.New("lz4: invalid source or destination buffer too short")
 | 
					 | 
				
			||||||
	// ErrInvalid is returned when reading an invalid LZ4 archive.
 | 
					 | 
				
			||||||
	ErrInvalid = errors.New("lz4: bad magic number")
 | 
					 | 
				
			||||||
	// ErrBlockDependency is returned when attempting to decompress an archive created with block dependency.
 | 
					 | 
				
			||||||
	ErrBlockDependency = errors.New("lz4: block dependency not supported")
 | 
					 | 
				
			||||||
	// ErrUnsupportedSeek is returned when attempting to Seek any way but forward from the current position.
 | 
					 | 
				
			||||||
	ErrUnsupportedSeek = errors.New("lz4: can only seek forward from io.SeekCurrent")
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func recoverBlock(e *error) {
 | 
					 | 
				
			||||||
	if r := recover(); r != nil && *e == nil {
 | 
					 | 
				
			||||||
		if debugFlag {
 | 
					 | 
				
			||||||
			fmt.Fprintln(os.Stderr, r)
 | 
					 | 
				
			||||||
			rdebug.PrintStack()
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		*e = ErrInvalidSourceShortBuffer
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										12
									
								
								vendor/github.com/pierrec/lz4/v3/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/pierrec/lz4/v3/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,12 +0,0 @@
 | 
				
			|||||||
module github.com/pierrec/lz4/v3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
go 1.12
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
require (
 | 
					 | 
				
			||||||
	code.cloudfoundry.org/bytefmt v0.0.0-20190710193110-1eb035ffe2b6
 | 
					 | 
				
			||||||
	github.com/frankban/quicktest v1.4.0
 | 
					 | 
				
			||||||
	github.com/onsi/ginkgo v1.8.0 // indirect
 | 
					 | 
				
			||||||
	github.com/onsi/gomega v1.5.0 // indirect
 | 
					 | 
				
			||||||
	github.com/pierrec/cmdflag v0.0.2
 | 
					 | 
				
			||||||
	github.com/schollz/progressbar/v2 v2.13.2
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
							
								
								
									
										52
									
								
								vendor/github.com/pierrec/lz4/v3/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/github.com/pierrec/lz4/v3/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,52 +0,0 @@
 | 
				
			|||||||
code.cloudfoundry.org/bytefmt v0.0.0-20190710193110-1eb035ffe2b6 h1:tW+ztA4A9UT9xnco5wUjW1oNi35k22eUEn9tNpPYVwE=
 | 
					 | 
				
			||||||
code.cloudfoundry.org/bytefmt v0.0.0-20190710193110-1eb035ffe2b6/go.mod h1:wN/zk7mhREp/oviagqUXY3EwuHhWyOvAdsn5Y4CzOrc=
 | 
					 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					 | 
				
			||||||
github.com/frankban/quicktest v1.4.0 h1:rCSCih1FnSWJEel/eub9wclBSqpF2F/PuvxUWGWnbO8=
 | 
					 | 
				
			||||||
github.com/frankban/quicktest v1.4.0/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ=
 | 
					 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
					 | 
				
			||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
 | 
					 | 
				
			||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					 | 
				
			||||||
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 | 
					 | 
				
			||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
					 | 
				
			||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
					 | 
				
			||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
					 | 
				
			||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
					 | 
				
			||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 | 
					 | 
				
			||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
					 | 
				
			||||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
 | 
					 | 
				
			||||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
 | 
					 | 
				
			||||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					 | 
				
			||||||
github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=
 | 
					 | 
				
			||||||
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
					 | 
				
			||||||
github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
 | 
					 | 
				
			||||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
					 | 
				
			||||||
github.com/pierrec/cmdflag v0.0.2 h1:ybjGJnPr/aURn2IKWjO49znx9N0DL6YfGsIxN0PYuVY=
 | 
					 | 
				
			||||||
github.com/pierrec/cmdflag v0.0.2/go.mod h1:a3zKGZ3cdQUfxjd0RGMLZr8xI3nvpJOB+m6o/1X5BmU=
 | 
					 | 
				
			||||||
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/schollz/progressbar/v2 v2.13.2 h1:3L9bP5KQOGEnFP8P5V8dz+U0yo5I29iY5Oa9s9EAwn0=
 | 
					 | 
				
			||||||
github.com/schollz/progressbar/v2 v2.13.2/go.mod h1:6YZjqdthH6SCZKv2rqGryrxPtfmRB/DWZxSMfCXPyD8=
 | 
					 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					 | 
				
			||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 | 
					 | 
				
			||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
					 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					 | 
				
			||||||
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 | 
					 | 
				
			||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 | 
					 | 
				
			||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 | 
					 | 
				
			||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					 | 
				
			||||||
							
								
								
									
										113
									
								
								vendor/github.com/pierrec/lz4/v3/lz4.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										113
									
								
								vendor/github.com/pierrec/lz4/v3/lz4.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,113 +0,0 @@
 | 
				
			|||||||
// Package lz4 implements reading and writing lz4 compressed data (a frame),
 | 
					 | 
				
			||||||
// as specified in http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Although the block level compression and decompression functions are exposed and are fully compatible
 | 
					 | 
				
			||||||
// with the lz4 block format definition, they are low level and should not be used directly.
 | 
					 | 
				
			||||||
// For a complete description of an lz4 compressed block, see:
 | 
					 | 
				
			||||||
// http://fastcompression.blogspot.fr/2011/05/lz4-explained.html
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// See https://github.com/Cyan4973/lz4 for the reference C implementation.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
package lz4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "math/bits"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import "sync"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	// Extension is the LZ4 frame file name extension
 | 
					 | 
				
			||||||
	Extension = ".lz4"
 | 
					 | 
				
			||||||
	// Version is the LZ4 frame format version
 | 
					 | 
				
			||||||
	Version = 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	frameMagic     uint32 = 0x184D2204
 | 
					 | 
				
			||||||
	frameSkipMagic uint32 = 0x184D2A50
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// The following constants are used to setup the compression algorithm.
 | 
					 | 
				
			||||||
	minMatch            = 4  // the minimum size of the match sequence size (4 bytes)
 | 
					 | 
				
			||||||
	winSizeLog          = 16 // LZ4 64Kb window size limit
 | 
					 | 
				
			||||||
	winSize             = 1 << winSizeLog
 | 
					 | 
				
			||||||
	winMask             = winSize - 1 // 64Kb window of previous data for dependent blocks
 | 
					 | 
				
			||||||
	compressedBlockFlag = 1 << 31
 | 
					 | 
				
			||||||
	compressedBlockMask = compressedBlockFlag - 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// hashLog determines the size of the hash table used to quickly find a previous match position.
 | 
					 | 
				
			||||||
	// Its value influences the compression speed and memory usage, the lower the faster,
 | 
					 | 
				
			||||||
	// but at the expense of the compression ratio.
 | 
					 | 
				
			||||||
	// 16 seems to be the best compromise for fast compression.
 | 
					 | 
				
			||||||
	hashLog = 16
 | 
					 | 
				
			||||||
	htSize  = 1 << hashLog
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mfLimit = 10 + minMatch // The last match cannot start within the last 14 bytes.
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// map the block max size id with its value in bytes: 64Kb, 256Kb, 1Mb and 4Mb.
 | 
					 | 
				
			||||||
const (
 | 
					 | 
				
			||||||
	blockSize64K = 1 << (16 + 2*iota)
 | 
					 | 
				
			||||||
	blockSize256K
 | 
					 | 
				
			||||||
	blockSize1M
 | 
					 | 
				
			||||||
	blockSize4M
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
var (
 | 
					 | 
				
			||||||
	// Keep a pool of buffers for each valid block sizes.
 | 
					 | 
				
			||||||
	bsMapValue = [...]*sync.Pool{
 | 
					 | 
				
			||||||
		newBufferPool(2 * blockSize64K),
 | 
					 | 
				
			||||||
		newBufferPool(2 * blockSize256K),
 | 
					 | 
				
			||||||
		newBufferPool(2 * blockSize1M),
 | 
					 | 
				
			||||||
		newBufferPool(2 * blockSize4M),
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// newBufferPool returns a pool for buffers of the given size.
 | 
					 | 
				
			||||||
func newBufferPool(size int) *sync.Pool {
 | 
					 | 
				
			||||||
	return &sync.Pool{
 | 
					 | 
				
			||||||
		New: func() interface{} {
 | 
					 | 
				
			||||||
			return make([]byte, size)
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// getBuffer returns a buffer to its pool.
 | 
					 | 
				
			||||||
func getBuffer(size int) []byte {
 | 
					 | 
				
			||||||
	idx := blockSizeValueToIndex(size) - 4
 | 
					 | 
				
			||||||
	return bsMapValue[idx].Get().([]byte)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// putBuffer returns a buffer to its pool.
 | 
					 | 
				
			||||||
func putBuffer(size int, buf []byte) {
 | 
					 | 
				
			||||||
	if cap(buf) > 0 {
 | 
					 | 
				
			||||||
		idx := blockSizeValueToIndex(size) - 4
 | 
					 | 
				
			||||||
		bsMapValue[idx].Put(buf[:cap(buf)])
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func blockSizeIndexToValue(i byte) int {
 | 
					 | 
				
			||||||
	return 1 << (16 + 2*uint(i))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func isValidBlockSize(size int) bool {
 | 
					 | 
				
			||||||
	const blockSizeMask = blockSize64K | blockSize256K | blockSize1M | blockSize4M
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return size&blockSizeMask > 0 && bits.OnesCount(uint(size)) == 1
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
func blockSizeValueToIndex(size int) byte {
 | 
					 | 
				
			||||||
	return 4 + byte(bits.TrailingZeros(uint(size)>>16)/2)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Header describes the various flags that can be set on a Writer or obtained from a Reader.
 | 
					 | 
				
			||||||
// The default values match those of the LZ4 frame format definition
 | 
					 | 
				
			||||||
// (http://fastcompression.blogspot.com/2013/04/lz4-streaming-format-final.html).
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// NB. in a Reader, in case of concatenated frames, the Header values may change between Read() calls.
 | 
					 | 
				
			||||||
// It is the caller's responsibility to check them if necessary.
 | 
					 | 
				
			||||||
type Header struct {
 | 
					 | 
				
			||||||
	BlockChecksum    bool   // Compressed blocks checksum flag.
 | 
					 | 
				
			||||||
	NoChecksum       bool   // Frame checksum flag.
 | 
					 | 
				
			||||||
	BlockMaxSize     int    // Size of the uncompressed data block (one of [64KB, 256KB, 1MB, 4MB]). Default=4MB.
 | 
					 | 
				
			||||||
	Size             uint64 // Frame total size. It is _not_ computed by the Writer.
 | 
					 | 
				
			||||||
	CompressionLevel int    // Compression level (higher is better, use 0 for fastest compression).
 | 
					 | 
				
			||||||
	done             bool   // Header processed flag (Read or Write and checked).
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (h *Header) Reset() {
 | 
					 | 
				
			||||||
	h.done = false
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										29
									
								
								vendor/github.com/pierrec/lz4/v3/lz4_go1.10.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/pierrec/lz4/v3/lz4_go1.10.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,29 +0,0 @@
 | 
				
			|||||||
//+build go1.10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package lz4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (h Header) String() string {
 | 
					 | 
				
			||||||
	var s strings.Builder
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s.WriteString(fmt.Sprintf("%T{", h))
 | 
					 | 
				
			||||||
	if h.BlockChecksum {
 | 
					 | 
				
			||||||
		s.WriteString("BlockChecksum: true ")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if h.NoChecksum {
 | 
					 | 
				
			||||||
		s.WriteString("NoChecksum: true ")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if bs := h.BlockMaxSize; bs != 0 && bs != 4<<20 {
 | 
					 | 
				
			||||||
		s.WriteString(fmt.Sprintf("BlockMaxSize: %d ", bs))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if l := h.CompressionLevel; l != 0 {
 | 
					 | 
				
			||||||
		s.WriteString(fmt.Sprintf("CompressionLevel: %d ", l))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	s.WriteByte('}')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return s.String()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										29
									
								
								vendor/github.com/pierrec/lz4/v3/lz4_notgo1.10.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/pierrec/lz4/v3/lz4_notgo1.10.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,29 +0,0 @@
 | 
				
			|||||||
//+build !go1.10
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
package lz4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"bytes"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (h Header) String() string {
 | 
					 | 
				
			||||||
	var s bytes.Buffer
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	s.WriteString(fmt.Sprintf("%T{", h))
 | 
					 | 
				
			||||||
	if h.BlockChecksum {
 | 
					 | 
				
			||||||
		s.WriteString("BlockChecksum: true ")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if h.NoChecksum {
 | 
					 | 
				
			||||||
		s.WriteString("NoChecksum: true ")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if bs := h.BlockMaxSize; bs != 0 && bs != 4<<20 {
 | 
					 | 
				
			||||||
		s.WriteString(fmt.Sprintf("BlockMaxSize: %d ", bs))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if l := h.CompressionLevel; l != 0 {
 | 
					 | 
				
			||||||
		s.WriteString(fmt.Sprintf("CompressionLevel: %d ", l))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	s.WriteByte('}')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return s.String()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										335
									
								
								vendor/github.com/pierrec/lz4/v3/reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										335
									
								
								vendor/github.com/pierrec/lz4/v3/reader.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,335 +0,0 @@
 | 
				
			|||||||
package lz4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"encoding/binary"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"io/ioutil"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/pierrec/lz4/v3/internal/xxh32"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reader implements the LZ4 frame decoder.
 | 
					 | 
				
			||||||
// The Header is set after the first call to Read().
 | 
					 | 
				
			||||||
// The Header may change between Read() calls in case of concatenated frames.
 | 
					 | 
				
			||||||
type Reader struct {
 | 
					 | 
				
			||||||
	Header
 | 
					 | 
				
			||||||
	// Handler called when a block has been successfully read.
 | 
					 | 
				
			||||||
	// It provides the number of bytes read.
 | 
					 | 
				
			||||||
	OnBlockDone func(size int)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	buf      [8]byte       // Scrap buffer.
 | 
					 | 
				
			||||||
	pos      int64         // Current position in src.
 | 
					 | 
				
			||||||
	src      io.Reader     // Source.
 | 
					 | 
				
			||||||
	zdata    []byte        // Compressed data.
 | 
					 | 
				
			||||||
	data     []byte        // Uncompressed data.
 | 
					 | 
				
			||||||
	idx      int           // Index of unread bytes into data.
 | 
					 | 
				
			||||||
	checksum xxh32.XXHZero // Frame hash.
 | 
					 | 
				
			||||||
	skip     int64         // Bytes to skip before next read.
 | 
					 | 
				
			||||||
	dpos     int64         // Position in dest
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewReader returns a new LZ4 frame decoder.
 | 
					 | 
				
			||||||
// No access to the underlying io.Reader is performed.
 | 
					 | 
				
			||||||
func NewReader(src io.Reader) *Reader {
 | 
					 | 
				
			||||||
	r := &Reader{src: src}
 | 
					 | 
				
			||||||
	return r
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// readHeader checks the frame magic number and parses the frame descriptoz.
 | 
					 | 
				
			||||||
// Skippable frames are supported even as a first frame although the LZ4
 | 
					 | 
				
			||||||
// specifications recommends skippable frames not to be used as first frames.
 | 
					 | 
				
			||||||
func (z *Reader) readHeader(first bool) error {
 | 
					 | 
				
			||||||
	defer z.checksum.Reset()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	buf := z.buf[:]
 | 
					 | 
				
			||||||
	for {
 | 
					 | 
				
			||||||
		magic, err := z.readUint32()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			z.pos += 4
 | 
					 | 
				
			||||||
			if !first && err == io.ErrUnexpectedEOF {
 | 
					 | 
				
			||||||
				return io.EOF
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if magic == frameMagic {
 | 
					 | 
				
			||||||
			break
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if magic>>8 != frameSkipMagic>>8 {
 | 
					 | 
				
			||||||
			return ErrInvalid
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		skipSize, err := z.readUint32()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		z.pos += 4
 | 
					 | 
				
			||||||
		m, err := io.CopyN(ioutil.Discard, z.src, int64(skipSize))
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		z.pos += m
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Header.
 | 
					 | 
				
			||||||
	if _, err := io.ReadFull(z.src, buf[:2]); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	z.pos += 8
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	b := buf[0]
 | 
					 | 
				
			||||||
	if v := b >> 6; v != Version {
 | 
					 | 
				
			||||||
		return fmt.Errorf("lz4: invalid version: got %d; expected %d", v, Version)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if b>>5&1 == 0 {
 | 
					 | 
				
			||||||
		return ErrBlockDependency
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	z.BlockChecksum = b>>4&1 > 0
 | 
					 | 
				
			||||||
	frameSize := b>>3&1 > 0
 | 
					 | 
				
			||||||
	z.NoChecksum = b>>2&1 == 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	bmsID := buf[1] >> 4 & 0x7
 | 
					 | 
				
			||||||
	if bmsID < 4 || bmsID > 7 {
 | 
					 | 
				
			||||||
		return fmt.Errorf("lz4: invalid block max size ID: %d", bmsID)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	bSize := blockSizeIndexToValue(bmsID - 4)
 | 
					 | 
				
			||||||
	z.BlockMaxSize = bSize
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Allocate the compressed/uncompressed buffers.
 | 
					 | 
				
			||||||
	// The compressed buffer cannot exceed the uncompressed one.
 | 
					 | 
				
			||||||
	if n := 2 * bSize; cap(z.zdata) < n {
 | 
					 | 
				
			||||||
		z.zdata = make([]byte, n, n)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("header block max size id=%d size=%d", bmsID, bSize)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	z.zdata = z.zdata[:bSize]
 | 
					 | 
				
			||||||
	z.data = z.zdata[:cap(z.zdata)][bSize:]
 | 
					 | 
				
			||||||
	z.idx = len(z.data)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	_, _ = z.checksum.Write(buf[0:2])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if frameSize {
 | 
					 | 
				
			||||||
		buf := buf[:8]
 | 
					 | 
				
			||||||
		if _, err := io.ReadFull(z.src, buf); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		z.Size = binary.LittleEndian.Uint64(buf)
 | 
					 | 
				
			||||||
		z.pos += 8
 | 
					 | 
				
			||||||
		_, _ = z.checksum.Write(buf)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Header checksum.
 | 
					 | 
				
			||||||
	if _, err := io.ReadFull(z.src, buf[:1]); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	z.pos++
 | 
					 | 
				
			||||||
	if h := byte(z.checksum.Sum32() >> 8 & 0xFF); h != buf[0] {
 | 
					 | 
				
			||||||
		return fmt.Errorf("lz4: invalid header checksum: got %x; expected %x", buf[0], h)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	z.Header.done = true
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("header read: %v", z.Header)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Read decompresses data from the underlying source into the supplied buffer.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// Since there can be multiple streams concatenated, Header values may
 | 
					 | 
				
			||||||
// change between calls to Read(). If that is the case, no data is actually read from
 | 
					 | 
				
			||||||
// the underlying io.Reader, to allow for potential input buffer resizing.
 | 
					 | 
				
			||||||
func (z *Reader) Read(buf []byte) (int, error) {
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("Read buf len=%d", len(buf))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if !z.Header.done {
 | 
					 | 
				
			||||||
		if err := z.readHeader(true); err != nil {
 | 
					 | 
				
			||||||
			return 0, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if debugFlag {
 | 
					 | 
				
			||||||
			debug("header read OK compressed buffer %d / %d uncompressed buffer %d : %d index=%d",
 | 
					 | 
				
			||||||
				len(z.zdata), cap(z.zdata), len(z.data), cap(z.data), z.idx)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(buf) == 0 {
 | 
					 | 
				
			||||||
		return 0, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if z.idx == len(z.data) {
 | 
					 | 
				
			||||||
		// No data ready for reading, process the next block.
 | 
					 | 
				
			||||||
		if debugFlag {
 | 
					 | 
				
			||||||
			debug("reading block from writer")
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// Reset uncompressed buffer
 | 
					 | 
				
			||||||
		z.data = z.zdata[:cap(z.zdata)][len(z.zdata):]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Block length: 0 = end of frame, highest bit set: uncompressed.
 | 
					 | 
				
			||||||
		bLen, err := z.readUint32()
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return 0, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		z.pos += 4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if bLen == 0 {
 | 
					 | 
				
			||||||
			// End of frame reached.
 | 
					 | 
				
			||||||
			if !z.NoChecksum {
 | 
					 | 
				
			||||||
				// Validate the frame checksum.
 | 
					 | 
				
			||||||
				checksum, err := z.readUint32()
 | 
					 | 
				
			||||||
				if err != nil {
 | 
					 | 
				
			||||||
					return 0, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				if debugFlag {
 | 
					 | 
				
			||||||
					debug("frame checksum got=%x / want=%x", z.checksum.Sum32(), checksum)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				z.pos += 4
 | 
					 | 
				
			||||||
				if h := z.checksum.Sum32(); checksum != h {
 | 
					 | 
				
			||||||
					return 0, fmt.Errorf("lz4: invalid frame checksum: got %x; expected %x", h, checksum)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Get ready for the next concatenated frame and keep the position.
 | 
					 | 
				
			||||||
			pos := z.pos
 | 
					 | 
				
			||||||
			z.Reset(z.src)
 | 
					 | 
				
			||||||
			z.pos = pos
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			// Since multiple frames can be concatenated, check for more.
 | 
					 | 
				
			||||||
			return 0, z.readHeader(false)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if debugFlag {
 | 
					 | 
				
			||||||
			debug("raw block size %d", bLen)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if bLen&compressedBlockFlag > 0 {
 | 
					 | 
				
			||||||
			// Uncompressed block.
 | 
					 | 
				
			||||||
			bLen &= compressedBlockMask
 | 
					 | 
				
			||||||
			if debugFlag {
 | 
					 | 
				
			||||||
				debug("uncompressed block size %d", bLen)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if int(bLen) > cap(z.data) {
 | 
					 | 
				
			||||||
				return 0, fmt.Errorf("lz4: invalid block size: %d", bLen)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			z.data = z.data[:bLen]
 | 
					 | 
				
			||||||
			if _, err := io.ReadFull(z.src, z.data); err != nil {
 | 
					 | 
				
			||||||
				return 0, err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			z.pos += int64(bLen)
 | 
					 | 
				
			||||||
			if z.OnBlockDone != nil {
 | 
					 | 
				
			||||||
				z.OnBlockDone(int(bLen))
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if z.BlockChecksum {
 | 
					 | 
				
			||||||
				checksum, err := z.readUint32()
 | 
					 | 
				
			||||||
				if err != nil {
 | 
					 | 
				
			||||||
					return 0, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				z.pos += 4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if h := xxh32.ChecksumZero(z.data); h != checksum {
 | 
					 | 
				
			||||||
					return 0, fmt.Errorf("lz4: invalid block checksum: got %x; expected %x", h, checksum)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			// Compressed block.
 | 
					 | 
				
			||||||
			if debugFlag {
 | 
					 | 
				
			||||||
				debug("compressed block size %d", bLen)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if int(bLen) > cap(z.data) {
 | 
					 | 
				
			||||||
				return 0, fmt.Errorf("lz4: invalid block size: %d", bLen)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			zdata := z.zdata[:bLen]
 | 
					 | 
				
			||||||
			if _, err := io.ReadFull(z.src, zdata); err != nil {
 | 
					 | 
				
			||||||
				return 0, err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			z.pos += int64(bLen)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if z.BlockChecksum {
 | 
					 | 
				
			||||||
				checksum, err := z.readUint32()
 | 
					 | 
				
			||||||
				if err != nil {
 | 
					 | 
				
			||||||
					return 0, err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				z.pos += 4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				if h := xxh32.ChecksumZero(zdata); h != checksum {
 | 
					 | 
				
			||||||
					return 0, fmt.Errorf("lz4: invalid block checksum: got %x; expected %x", h, checksum)
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			n, err := UncompressBlock(zdata, z.data)
 | 
					 | 
				
			||||||
			if err != nil {
 | 
					 | 
				
			||||||
				return 0, err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			z.data = z.data[:n]
 | 
					 | 
				
			||||||
			if z.OnBlockDone != nil {
 | 
					 | 
				
			||||||
				z.OnBlockDone(n)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if !z.NoChecksum {
 | 
					 | 
				
			||||||
			_, _ = z.checksum.Write(z.data)
 | 
					 | 
				
			||||||
			if debugFlag {
 | 
					 | 
				
			||||||
				debug("current frame checksum %x", z.checksum.Sum32())
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		z.idx = 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if z.skip > int64(len(z.data[z.idx:])) {
 | 
					 | 
				
			||||||
		z.skip -= int64(len(z.data[z.idx:]))
 | 
					 | 
				
			||||||
		z.dpos += int64(len(z.data[z.idx:]))
 | 
					 | 
				
			||||||
		z.idx = len(z.data)
 | 
					 | 
				
			||||||
		return 0, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	z.idx += int(z.skip)
 | 
					 | 
				
			||||||
	z.dpos += z.skip
 | 
					 | 
				
			||||||
	z.skip = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	n := copy(buf, z.data[z.idx:])
 | 
					 | 
				
			||||||
	z.idx += n
 | 
					 | 
				
			||||||
	z.dpos += int64(n)
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("copied %d bytes to input", n)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return n, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Seek implements io.Seeker, but supports seeking forward from the current
 | 
					 | 
				
			||||||
// position only. Any other seek will return an error. Allows skipping output
 | 
					 | 
				
			||||||
// bytes which aren't needed, which in some scenarios is faster than reading
 | 
					 | 
				
			||||||
// and discarding them.
 | 
					 | 
				
			||||||
// Note this may cause future calls to Read() to read 0 bytes if all of the
 | 
					 | 
				
			||||||
// data they would have returned is skipped.
 | 
					 | 
				
			||||||
func (z *Reader) Seek(offset int64, whence int) (int64, error) {
 | 
					 | 
				
			||||||
	if offset < 0 || whence != io.SeekCurrent {
 | 
					 | 
				
			||||||
		return z.dpos + z.skip, ErrUnsupportedSeek
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	z.skip += offset
 | 
					 | 
				
			||||||
	return z.dpos + z.skip, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reset discards the Reader's state and makes it equivalent to the
 | 
					 | 
				
			||||||
// result of its original state from NewReader, but reading from r instead.
 | 
					 | 
				
			||||||
// This permits reusing a Reader rather than allocating a new one.
 | 
					 | 
				
			||||||
func (z *Reader) Reset(r io.Reader) {
 | 
					 | 
				
			||||||
	z.Header = Header{}
 | 
					 | 
				
			||||||
	z.pos = 0
 | 
					 | 
				
			||||||
	z.src = r
 | 
					 | 
				
			||||||
	z.zdata = z.zdata[:0]
 | 
					 | 
				
			||||||
	z.data = z.data[:0]
 | 
					 | 
				
			||||||
	z.idx = 0
 | 
					 | 
				
			||||||
	z.checksum.Reset()
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// readUint32 reads an uint32 into the supplied buffer.
 | 
					 | 
				
			||||||
// The idea is to make use of the already allocated buffers avoiding additional allocations.
 | 
					 | 
				
			||||||
func (z *Reader) readUint32() (uint32, error) {
 | 
					 | 
				
			||||||
	buf := z.buf[:4]
 | 
					 | 
				
			||||||
	_, err := io.ReadFull(z.src, buf)
 | 
					 | 
				
			||||||
	x := binary.LittleEndian.Uint32(buf)
 | 
					 | 
				
			||||||
	return x, err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										409
									
								
								vendor/github.com/pierrec/lz4/v3/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										409
									
								
								vendor/github.com/pierrec/lz4/v3/writer.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,409 +0,0 @@
 | 
				
			|||||||
package lz4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import (
 | 
					 | 
				
			||||||
	"encoding/binary"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"io"
 | 
					 | 
				
			||||||
	"runtime"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/pierrec/lz4/v3/internal/xxh32"
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// zResult contains the results of compressing a block.
 | 
					 | 
				
			||||||
type zResult struct {
 | 
					 | 
				
			||||||
	size     uint32 // Block header
 | 
					 | 
				
			||||||
	data     []byte // Compressed data
 | 
					 | 
				
			||||||
	checksum uint32 // Data checksum
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Writer implements the LZ4 frame encoder.
 | 
					 | 
				
			||||||
type Writer struct {
 | 
					 | 
				
			||||||
	Header
 | 
					 | 
				
			||||||
	// Handler called when a block has been successfully written out.
 | 
					 | 
				
			||||||
	// It provides the number of bytes written.
 | 
					 | 
				
			||||||
	OnBlockDone func(size int)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	buf       [19]byte      // magic number(4) + header(flags(2)+[Size(8)+DictID(4)]+checksum(1)) does not exceed 19 bytes
 | 
					 | 
				
			||||||
	dst       io.Writer     // Destination.
 | 
					 | 
				
			||||||
	checksum  xxh32.XXHZero // Frame checksum.
 | 
					 | 
				
			||||||
	data      []byte        // Data to be compressed + buffer for compressed data.
 | 
					 | 
				
			||||||
	idx       int           // Index into data.
 | 
					 | 
				
			||||||
	hashtable [winSize]int  // Hash table used in CompressBlock().
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// For concurrency.
 | 
					 | 
				
			||||||
	c   chan chan zResult // Channel for block compression goroutines and writer goroutine.
 | 
					 | 
				
			||||||
	err error             // Any error encountered while writing to the underlying destination.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// NewWriter returns a new LZ4 frame encoder.
 | 
					 | 
				
			||||||
// No access to the underlying io.Writer is performed.
 | 
					 | 
				
			||||||
// The supplied Header is checked at the first Write.
 | 
					 | 
				
			||||||
// It is ok to change it before the first Write but then not until a Reset() is performed.
 | 
					 | 
				
			||||||
func NewWriter(dst io.Writer) *Writer {
 | 
					 | 
				
			||||||
	z := new(Writer)
 | 
					 | 
				
			||||||
	z.Reset(dst)
 | 
					 | 
				
			||||||
	return z
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// WithConcurrency sets the number of concurrent go routines used for compression.
 | 
					 | 
				
			||||||
// A negative value sets the concurrency to GOMAXPROCS.
 | 
					 | 
				
			||||||
func (z *Writer) WithConcurrency(n int) *Writer {
 | 
					 | 
				
			||||||
	switch {
 | 
					 | 
				
			||||||
	case n == 0 || n == 1:
 | 
					 | 
				
			||||||
		z.c = nil
 | 
					 | 
				
			||||||
		return z
 | 
					 | 
				
			||||||
	case n < 0:
 | 
					 | 
				
			||||||
		n = runtime.GOMAXPROCS(0)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	z.c = make(chan chan zResult, n)
 | 
					 | 
				
			||||||
	// Writer goroutine managing concurrent block compression goroutines.
 | 
					 | 
				
			||||||
	go func() {
 | 
					 | 
				
			||||||
		// Process next block compression item.
 | 
					 | 
				
			||||||
		for c := range z.c {
 | 
					 | 
				
			||||||
			// Read the next compressed block result.
 | 
					 | 
				
			||||||
			// Waiting here ensures that the blocks are output in the order they were sent.
 | 
					 | 
				
			||||||
			// The incoming channel is always closed as it indicates to the caller that
 | 
					 | 
				
			||||||
			// the block has been processed.
 | 
					 | 
				
			||||||
			res := <-c
 | 
					 | 
				
			||||||
			n := len(res.data)
 | 
					 | 
				
			||||||
			if n == 0 {
 | 
					 | 
				
			||||||
				// Notify the block compression routine that we are done with its result.
 | 
					 | 
				
			||||||
				// This is used when a sentinel block is sent to terminate the compression.
 | 
					 | 
				
			||||||
				close(c)
 | 
					 | 
				
			||||||
				return
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			// Write the block.
 | 
					 | 
				
			||||||
			if err := z.writeUint32(res.size); err != nil && z.err == nil {
 | 
					 | 
				
			||||||
				z.err = err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if _, err := z.dst.Write(res.data); err != nil && z.err == nil {
 | 
					 | 
				
			||||||
				z.err = err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if z.BlockChecksum {
 | 
					 | 
				
			||||||
				if err := z.writeUint32(res.checksum); err != nil && z.err == nil {
 | 
					 | 
				
			||||||
					z.err = err
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if isCompressed := res.size&compressedBlockFlag == 0; isCompressed {
 | 
					 | 
				
			||||||
				// It is now safe to release the buffer as no longer in use by any goroutine.
 | 
					 | 
				
			||||||
				putBuffer(cap(res.data), res.data)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if h := z.OnBlockDone; h != nil {
 | 
					 | 
				
			||||||
				h(n)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			close(c)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}()
 | 
					 | 
				
			||||||
	return z
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// newBuffers instantiates new buffers which size matches the one in Header.
 | 
					 | 
				
			||||||
// The returned buffers are for decompression and compression respectively.
 | 
					 | 
				
			||||||
func (z *Writer) newBuffers() {
 | 
					 | 
				
			||||||
	bSize := z.Header.BlockMaxSize
 | 
					 | 
				
			||||||
	buf := getBuffer(bSize)
 | 
					 | 
				
			||||||
	z.data = buf[:bSize] // Uncompressed buffer is the first half.
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// freeBuffers puts the writer's buffers back to the pool.
 | 
					 | 
				
			||||||
func (z *Writer) freeBuffers() {
 | 
					 | 
				
			||||||
	// Put the buffer back into the pool, if any.
 | 
					 | 
				
			||||||
	putBuffer(z.Header.BlockMaxSize, z.data)
 | 
					 | 
				
			||||||
	z.data = nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// writeHeader builds and writes the header (magic+header) to the underlying io.Writer.
 | 
					 | 
				
			||||||
func (z *Writer) writeHeader() error {
 | 
					 | 
				
			||||||
	// Default to 4Mb if BlockMaxSize is not set.
 | 
					 | 
				
			||||||
	if z.Header.BlockMaxSize == 0 {
 | 
					 | 
				
			||||||
		z.Header.BlockMaxSize = blockSize4M
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// The only option that needs to be validated.
 | 
					 | 
				
			||||||
	bSize := z.Header.BlockMaxSize
 | 
					 | 
				
			||||||
	if !isValidBlockSize(z.Header.BlockMaxSize) {
 | 
					 | 
				
			||||||
		return fmt.Errorf("lz4: invalid block max size: %d", bSize)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Allocate the compressed/uncompressed buffers.
 | 
					 | 
				
			||||||
	// The compressed buffer cannot exceed the uncompressed one.
 | 
					 | 
				
			||||||
	z.newBuffers()
 | 
					 | 
				
			||||||
	z.idx = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Size is optional.
 | 
					 | 
				
			||||||
	buf := z.buf[:]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Set the fixed size data: magic number, block max size and flags.
 | 
					 | 
				
			||||||
	binary.LittleEndian.PutUint32(buf[0:], frameMagic)
 | 
					 | 
				
			||||||
	flg := byte(Version << 6)
 | 
					 | 
				
			||||||
	flg |= 1 << 5 // No block dependency.
 | 
					 | 
				
			||||||
	if z.Header.BlockChecksum {
 | 
					 | 
				
			||||||
		flg |= 1 << 4
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if z.Header.Size > 0 {
 | 
					 | 
				
			||||||
		flg |= 1 << 3
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if !z.Header.NoChecksum {
 | 
					 | 
				
			||||||
		flg |= 1 << 2
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	buf[4] = flg
 | 
					 | 
				
			||||||
	buf[5] = blockSizeValueToIndex(z.Header.BlockMaxSize) << 4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Current buffer size: magic(4) + flags(1) + block max size (1).
 | 
					 | 
				
			||||||
	n := 6
 | 
					 | 
				
			||||||
	// Optional items.
 | 
					 | 
				
			||||||
	if z.Header.Size > 0 {
 | 
					 | 
				
			||||||
		binary.LittleEndian.PutUint64(buf[n:], z.Header.Size)
 | 
					 | 
				
			||||||
		n += 8
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// The header checksum includes the flags, block max size and optional Size.
 | 
					 | 
				
			||||||
	buf[n] = byte(xxh32.ChecksumZero(buf[4:n]) >> 8 & 0xFF)
 | 
					 | 
				
			||||||
	z.checksum.Reset()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Header ready, write it out.
 | 
					 | 
				
			||||||
	if _, err := z.dst.Write(buf[0 : n+1]); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	z.Header.done = true
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("wrote header %v", z.Header)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Write compresses data from the supplied buffer into the underlying io.Writer.
 | 
					 | 
				
			||||||
// Write does not return until the data has been written.
 | 
					 | 
				
			||||||
func (z *Writer) Write(buf []byte) (int, error) {
 | 
					 | 
				
			||||||
	if !z.Header.done {
 | 
					 | 
				
			||||||
		if err := z.writeHeader(); err != nil {
 | 
					 | 
				
			||||||
			return 0, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("input buffer len=%d index=%d", len(buf), z.idx)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	zn := len(z.data)
 | 
					 | 
				
			||||||
	var n int
 | 
					 | 
				
			||||||
	for len(buf) > 0 {
 | 
					 | 
				
			||||||
		if z.idx == 0 && len(buf) >= zn {
 | 
					 | 
				
			||||||
			// Avoid a copy as there is enough data for a block.
 | 
					 | 
				
			||||||
			if err := z.compressBlock(buf[:zn]); err != nil {
 | 
					 | 
				
			||||||
				return n, err
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			n += zn
 | 
					 | 
				
			||||||
			buf = buf[zn:]
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		// Accumulate the data to be compressed.
 | 
					 | 
				
			||||||
		m := copy(z.data[z.idx:], buf)
 | 
					 | 
				
			||||||
		n += m
 | 
					 | 
				
			||||||
		z.idx += m
 | 
					 | 
				
			||||||
		buf = buf[m:]
 | 
					 | 
				
			||||||
		if debugFlag {
 | 
					 | 
				
			||||||
			debug("%d bytes copied to buf, current index %d", n, z.idx)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if z.idx < len(z.data) {
 | 
					 | 
				
			||||||
			// Buffer not filled.
 | 
					 | 
				
			||||||
			if debugFlag {
 | 
					 | 
				
			||||||
				debug("need more data for compression")
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			return n, nil
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		// Buffer full.
 | 
					 | 
				
			||||||
		if err := z.compressBlock(z.data); err != nil {
 | 
					 | 
				
			||||||
			return n, err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		z.idx = 0
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return n, nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// compressBlock compresses a block.
 | 
					 | 
				
			||||||
func (z *Writer) compressBlock(data []byte) error {
 | 
					 | 
				
			||||||
	if !z.NoChecksum {
 | 
					 | 
				
			||||||
		_, _ = z.checksum.Write(data)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if z.c != nil {
 | 
					 | 
				
			||||||
		c := make(chan zResult)
 | 
					 | 
				
			||||||
		z.c <- c // Send now to guarantee order
 | 
					 | 
				
			||||||
		go writerCompressBlock(c, z.Header, data)
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	zdata := z.data[z.Header.BlockMaxSize:cap(z.data)]
 | 
					 | 
				
			||||||
	// The compressed block size cannot exceed the input's.
 | 
					 | 
				
			||||||
	var zn int
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if level := z.Header.CompressionLevel; level != 0 {
 | 
					 | 
				
			||||||
		zn, _ = CompressBlockHC(data, zdata, level)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		zn, _ = CompressBlock(data, zdata, z.hashtable[:])
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	var bLen uint32
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("block compression %d => %d", len(data), zn)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if zn > 0 && zn < len(data) {
 | 
					 | 
				
			||||||
		// Compressible and compressed size smaller than uncompressed: ok!
 | 
					 | 
				
			||||||
		bLen = uint32(zn)
 | 
					 | 
				
			||||||
		zdata = zdata[:zn]
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		// Uncompressed block.
 | 
					 | 
				
			||||||
		bLen = uint32(len(data)) | compressedBlockFlag
 | 
					 | 
				
			||||||
		zdata = data
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("block compression to be written len=%d data len=%d", bLen, len(zdata))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Write the block.
 | 
					 | 
				
			||||||
	if err := z.writeUint32(bLen); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	written, err := z.dst.Write(zdata)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if h := z.OnBlockDone; h != nil {
 | 
					 | 
				
			||||||
		h(written)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if !z.BlockChecksum {
 | 
					 | 
				
			||||||
		if debugFlag {
 | 
					 | 
				
			||||||
			debug("current frame checksum %x", z.checksum.Sum32())
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	checksum := xxh32.ChecksumZero(zdata)
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("block checksum %x", checksum)
 | 
					 | 
				
			||||||
		defer func() { debug("current frame checksum %x", z.checksum.Sum32()) }()
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return z.writeUint32(checksum)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Flush flushes any pending compressed data to the underlying writer.
 | 
					 | 
				
			||||||
// Flush does not return until the data has been written.
 | 
					 | 
				
			||||||
// If the underlying writer returns an error, Flush returns that error.
 | 
					 | 
				
			||||||
func (z *Writer) Flush() error {
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("flush with index %d", z.idx)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if z.idx == 0 {
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	data := z.data[:z.idx]
 | 
					 | 
				
			||||||
	z.idx = 0
 | 
					 | 
				
			||||||
	if z.c == nil {
 | 
					 | 
				
			||||||
		return z.compressBlock(data)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if !z.NoChecksum {
 | 
					 | 
				
			||||||
		_, _ = z.checksum.Write(data)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	c := make(chan zResult)
 | 
					 | 
				
			||||||
	z.c <- c
 | 
					 | 
				
			||||||
	writerCompressBlock(c, z.Header, data)
 | 
					 | 
				
			||||||
	return nil
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func (z *Writer) close() error {
 | 
					 | 
				
			||||||
	if z.c == nil {
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Send a sentinel block (no data to compress) to terminate the writer main goroutine.
 | 
					 | 
				
			||||||
	c := make(chan zResult)
 | 
					 | 
				
			||||||
	z.c <- c
 | 
					 | 
				
			||||||
	c <- zResult{}
 | 
					 | 
				
			||||||
	// Wait for the main goroutine to complete.
 | 
					 | 
				
			||||||
	<-c
 | 
					 | 
				
			||||||
	// At this point the main goroutine has shut down or is about to return.
 | 
					 | 
				
			||||||
	z.c = nil
 | 
					 | 
				
			||||||
	return z.err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Close closes the Writer, flushing any unwritten data to the underlying io.Writer, but does not close the underlying io.Writer.
 | 
					 | 
				
			||||||
func (z *Writer) Close() error {
 | 
					 | 
				
			||||||
	if !z.Header.done {
 | 
					 | 
				
			||||||
		if err := z.writeHeader(); err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := z.Flush(); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := z.close(); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	z.freeBuffers()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("writing last empty block")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if err := z.writeUint32(0); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if z.NoChecksum {
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	checksum := z.checksum.Sum32()
 | 
					 | 
				
			||||||
	if debugFlag {
 | 
					 | 
				
			||||||
		debug("stream checksum %x", checksum)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return z.writeUint32(checksum)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Reset clears the state of the Writer z such that it is equivalent to its
 | 
					 | 
				
			||||||
// initial state from NewWriter, but instead writing to w.
 | 
					 | 
				
			||||||
// No access to the underlying io.Writer is performed.
 | 
					 | 
				
			||||||
func (z *Writer) Reset(w io.Writer) {
 | 
					 | 
				
			||||||
	n := cap(z.c)
 | 
					 | 
				
			||||||
	_ = z.close()
 | 
					 | 
				
			||||||
	z.freeBuffers()
 | 
					 | 
				
			||||||
	z.Header.Reset()
 | 
					 | 
				
			||||||
	z.dst = w
 | 
					 | 
				
			||||||
	z.checksum.Reset()
 | 
					 | 
				
			||||||
	z.idx = 0
 | 
					 | 
				
			||||||
	z.err = nil
 | 
					 | 
				
			||||||
	z.WithConcurrency(n)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// writeUint32 writes a uint32 to the underlying writer.
 | 
					 | 
				
			||||||
func (z *Writer) writeUint32(x uint32) error {
 | 
					 | 
				
			||||||
	buf := z.buf[:4]
 | 
					 | 
				
			||||||
	binary.LittleEndian.PutUint32(buf, x)
 | 
					 | 
				
			||||||
	_, err := z.dst.Write(buf)
 | 
					 | 
				
			||||||
	return err
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// writerCompressBlock compresses data into a pooled buffer and writes its result
 | 
					 | 
				
			||||||
// out to the input channel.
 | 
					 | 
				
			||||||
func writerCompressBlock(c chan zResult, header Header, data []byte) {
 | 
					 | 
				
			||||||
	zdata := getBuffer(header.BlockMaxSize)
 | 
					 | 
				
			||||||
	// The compressed block size cannot exceed the input's.
 | 
					 | 
				
			||||||
	var zn int
 | 
					 | 
				
			||||||
	if level := header.CompressionLevel; level != 0 {
 | 
					 | 
				
			||||||
		zn, _ = CompressBlockHC(data, zdata, level)
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		var hashTable [winSize]int
 | 
					 | 
				
			||||||
		zn, _ = CompressBlock(data, zdata, hashTable[:])
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	var res zResult
 | 
					 | 
				
			||||||
	if zn > 0 && zn < len(data) {
 | 
					 | 
				
			||||||
		res.size = uint32(zn)
 | 
					 | 
				
			||||||
		res.data = zdata[:zn]
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		res.size = uint32(len(data)) | compressedBlockFlag
 | 
					 | 
				
			||||||
		res.data = data
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if header.BlockChecksum {
 | 
					 | 
				
			||||||
		res.checksum = xxh32.ChecksumZero(res.data)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	c <- res
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@@ -1,19 +1,14 @@
 | 
				
			|||||||
language: go
 | 
					language: go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
env:
 | 
					env:
 | 
				
			||||||
  - GO111MODULE=on
 | 
					  - GO111MODULE=off
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
  - 1.9.x
 | 
					  - 1.13.x
 | 
				
			||||||
  - 1.10.x
 | 
					  - 1.14.x
 | 
				
			||||||
  - 1.11.x
 | 
					 | 
				
			||||||
  - 1.12.x
 | 
					 | 
				
			||||||
  - master
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
matrix:
 | 
					matrix:
 | 
				
			||||||
 fast_finish: true
 | 
					 fast_finish: true
 | 
				
			||||||
 allow_failures:
 | 
					 | 
				
			||||||
   - go: master
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
sudo: false
 | 
					sudo: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										0
									
								
								vendor/github.com/pierrec/lz4/v3/LICENSE → vendor/github.com/pierrec/lz4/v4/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								vendor/github.com/pierrec/lz4/v3/LICENSE → vendor/github.com/pierrec/lz4/v4/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -15,7 +15,7 @@ The implementation is based on the reference C [one](https://github.com/lz4/lz4)
 | 
				
			|||||||
Assuming you have the go toolchain installed:
 | 
					Assuming you have the go toolchain installed:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
go get github.com/pierrec/lz4/v3
 | 
					go get github.com/pierrec/lz4
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
There is a command line interface tool to compress and decompress LZ4 files.
 | 
					There is a command line interface tool to compress and decompress LZ4 files.
 | 
				
			||||||
							
								
								
									
										3
									
								
								vendor/github.com/pierrec/lz4/v4/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/pierrec/lz4/v4/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					module github.com/pierrec/lz4/v4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.14
 | 
				
			||||||
							
								
								
									
										3
									
								
								vendor/github.com/pierrec/lz4/v4/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/pierrec/lz4/v4/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					github.com/pierrec/lz4 v1.0.1 h1:w6GMGWSsCI04fTM8wQRdnW74MuJISakuUU0onU0TYB4=
 | 
				
			||||||
 | 
					github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A=
 | 
				
			||||||
 | 
					github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 | 
				
			||||||
@@ -1,28 +1,46 @@
 | 
				
			|||||||
package lz4
 | 
					package lz4block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/binary"
 | 
						"encoding/binary"
 | 
				
			||||||
	"math/bits"
 | 
						"math/bits"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4errors"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// The following constants are used to setup the compression algorithm.
 | 
				
			||||||
 | 
						minMatch   = 4  // the minimum size of the match sequence size (4 bytes)
 | 
				
			||||||
 | 
						winSizeLog = 16 // LZ4 64Kb window size limit
 | 
				
			||||||
 | 
						winSize    = 1 << winSizeLog
 | 
				
			||||||
 | 
						winMask    = winSize - 1 // 64Kb window of previous data for dependent blocks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// hashLog determines the size of the hash table used to quickly find a previous match position.
 | 
				
			||||||
 | 
						// Its value influences the compression speed and memory usage, the lower the faster,
 | 
				
			||||||
 | 
						// but at the expense of the compression ratio.
 | 
				
			||||||
 | 
						// 16 seems to be the best compromise for fast compression.
 | 
				
			||||||
 | 
						hashLog = 16
 | 
				
			||||||
 | 
						htSize  = 1 << hashLog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mfLimit = 10 + minMatch // The last match cannot start within the last 14 bytes.
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func recoverBlock(e *error) {
 | 
				
			||||||
 | 
						if r := recover(); r != nil && *e == nil {
 | 
				
			||||||
 | 
							*e = lz4errors.ErrInvalidSourceShortBuffer
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// blockHash hashes the lower 6 bytes into a value < htSize.
 | 
					// blockHash hashes the lower 6 bytes into a value < htSize.
 | 
				
			||||||
func blockHash(x uint64) uint32 {
 | 
					func blockHash(x uint64) uint32 {
 | 
				
			||||||
	const prime6bytes = 227718039650203
 | 
						const prime6bytes = 227718039650203
 | 
				
			||||||
	return uint32(((x << (64 - 48)) * prime6bytes) >> (64 - hashLog))
 | 
						return uint32(((x << (64 - 48)) * prime6bytes) >> (64 - hashLog))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CompressBlockBound returns the maximum size of a given buffer of size n, when not compressible.
 | 
					 | 
				
			||||||
func CompressBlockBound(n int) int {
 | 
					func CompressBlockBound(n int) int {
 | 
				
			||||||
	return n + n/255 + 16
 | 
						return n + n/255 + 16
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UncompressBlock uncompresses the source buffer into the destination one,
 | 
					 | 
				
			||||||
// and returns the uncompressed size.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// The destination buffer must be sized appropriately.
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
// An error is returned if the source data is invalid or the destination buffer is too small.
 | 
					 | 
				
			||||||
func UncompressBlock(src, dst []byte) (int, error) {
 | 
					func UncompressBlock(src, dst []byte) (int, error) {
 | 
				
			||||||
	if len(src) == 0 {
 | 
						if len(src) == 0 {
 | 
				
			||||||
		return 0, nil
 | 
							return 0, nil
 | 
				
			||||||
@@ -30,24 +48,57 @@ func UncompressBlock(src, dst []byte) (int, error) {
 | 
				
			|||||||
	if di := decodeBlock(dst, src); di >= 0 {
 | 
						if di := decodeBlock(dst, src); di >= 0 {
 | 
				
			||||||
		return di, nil
 | 
							return di, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return 0, ErrInvalidSourceShortBuffer
 | 
						return 0, lz4errors.ErrInvalidSourceShortBuffer
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CompressBlock compresses the source buffer into the destination one.
 | 
					type Compressor struct {
 | 
				
			||||||
// This is the fast version of LZ4 compression and also the default one.
 | 
						// Offsets are at most 64kiB, so we can store only the lower 16 bits of
 | 
				
			||||||
//
 | 
						// match positions: effectively, an offset from some 64kiB block boundary.
 | 
				
			||||||
// The argument hashTable is scratch space for a hash table used by the
 | 
						//
 | 
				
			||||||
// compressor. If provided, it should have length at least 1<<16. If it is
 | 
						// When we retrieve such an offset, we interpret it as relative to the last
 | 
				
			||||||
// shorter (or nil), CompressBlock allocates its own hash table.
 | 
						// block boundary si &^ 0xffff, or the one before, (si &^ 0xffff) - 0x10000,
 | 
				
			||||||
//
 | 
						// depending on which of these is inside the current window. If a table
 | 
				
			||||||
// The size of the compressed data is returned.
 | 
						// entry was generated more than 64kiB back in the input, we find out by
 | 
				
			||||||
//
 | 
						// inspecting the input stream.
 | 
				
			||||||
// If the destination buffer size is lower than CompressBlockBound and
 | 
						table [htSize]uint16
 | 
				
			||||||
// the compressed size is 0 and no error, then the data is incompressible.
 | 
					
 | 
				
			||||||
//
 | 
						needsReset bool
 | 
				
			||||||
// An error is returned if the destination buffer is too small.
 | 
					}
 | 
				
			||||||
func CompressBlock(src, dst []byte, hashTable []int) (_ int, err error) {
 | 
					
 | 
				
			||||||
	defer recoverBlock(&err)
 | 
					// Get returns the position of a presumptive match for the hash h.
 | 
				
			||||||
 | 
					// The match may be a false positive due to a hash collision or an old entry.
 | 
				
			||||||
 | 
					// If si < winSize, the return value may be negative.
 | 
				
			||||||
 | 
					func (c *Compressor) get(h uint32, si int) int {
 | 
				
			||||||
 | 
						h &= htSize - 1
 | 
				
			||||||
 | 
						i := int(c.table[h])
 | 
				
			||||||
 | 
						i += si &^ winMask
 | 
				
			||||||
 | 
						if i >= si {
 | 
				
			||||||
 | 
							// Try previous 64kiB block (negative when in first block).
 | 
				
			||||||
 | 
							i -= winSize
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return i
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *Compressor) put(h uint32, si int) {
 | 
				
			||||||
 | 
						h &= htSize - 1
 | 
				
			||||||
 | 
						c.table[h] = uint16(si)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var compressorPool = sync.Pool{New: func() interface{} { return new(Compressor) }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func CompressBlock(src, dst []byte) (int, error) {
 | 
				
			||||||
 | 
						c := compressorPool.Get().(*Compressor)
 | 
				
			||||||
 | 
						n, err := c.CompressBlock(src, dst)
 | 
				
			||||||
 | 
						compressorPool.Put(c)
 | 
				
			||||||
 | 
						return n, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *Compressor) CompressBlock(src, dst []byte) (int, error) {
 | 
				
			||||||
 | 
						if c.needsReset {
 | 
				
			||||||
 | 
							// Zero out reused table to avoid non-deterministic output (issue #65).
 | 
				
			||||||
 | 
							c.table = [htSize]uint16{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						c.needsReset = true // Only false on first call.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Return 0, nil only if the destination buffer size is < CompressBlockBound.
 | 
						// Return 0, nil only if the destination buffer size is < CompressBlockBound.
 | 
				
			||||||
	isNotCompressible := len(dst) < CompressBlockBound(len(src))
 | 
						isNotCompressible := len(dst) < CompressBlockBound(len(src))
 | 
				
			||||||
@@ -56,14 +107,6 @@ func CompressBlock(src, dst []byte, hashTable []int) (_ int, err error) {
 | 
				
			|||||||
	// This significantly speeds up incompressible data and usually has very small impact on compression.
 | 
						// This significantly speeds up incompressible data and usually has very small impact on compression.
 | 
				
			||||||
	// bytes to skip =  1 + (bytes since last match >> adaptSkipLog)
 | 
						// bytes to skip =  1 + (bytes since last match >> adaptSkipLog)
 | 
				
			||||||
	const adaptSkipLog = 7
 | 
						const adaptSkipLog = 7
 | 
				
			||||||
	if len(hashTable) < htSize {
 | 
					 | 
				
			||||||
		htIface := htPool.Get()
 | 
					 | 
				
			||||||
		defer htPool.Put(htIface)
 | 
					 | 
				
			||||||
		hashTable = (*(htIface).(*[htSize]int))[:]
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	// Prove to the compiler the table has at least htSize elements.
 | 
					 | 
				
			||||||
	// The compiler can see that "uint32() >> hashShift" cannot be out of bounds.
 | 
					 | 
				
			||||||
	hashTable = hashTable[:htSize]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// si: Current position of the search.
 | 
						// si: Current position of the search.
 | 
				
			||||||
	// anchor: Position of the current literals.
 | 
						// anchor: Position of the current literals.
 | 
				
			||||||
@@ -82,33 +125,30 @@ func CompressBlock(src, dst []byte, hashTable []int) (_ int, err error) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		// We check a match at s, s+1 and s+2 and pick the first one we get.
 | 
							// We check a match at s, s+1 and s+2 and pick the first one we get.
 | 
				
			||||||
		// Checking 3 only requires us to load the source one.
 | 
							// Checking 3 only requires us to load the source one.
 | 
				
			||||||
		ref := hashTable[h]
 | 
							ref := c.get(h, si)
 | 
				
			||||||
		ref2 := hashTable[h2]
 | 
							ref2 := c.get(h2, si)
 | 
				
			||||||
		hashTable[h] = si
 | 
							c.put(h, si)
 | 
				
			||||||
		hashTable[h2] = si + 1
 | 
							c.put(h2, si+1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		offset := si - ref
 | 
							offset := si - ref
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// If offset <= 0 we got an old entry in the hash table.
 | 
							if offset <= 0 || offset >= winSize || uint32(match) != binary.LittleEndian.Uint32(src[ref:]) {
 | 
				
			||||||
		if offset <= 0 || offset >= winSize || // Out of window.
 | 
					 | 
				
			||||||
			uint32(match) != binary.LittleEndian.Uint32(src[ref:]) { // Hash collision on different matches.
 | 
					 | 
				
			||||||
			// No match. Start calculating another hash.
 | 
								// No match. Start calculating another hash.
 | 
				
			||||||
			// The processor can usually do this out-of-order.
 | 
								// The processor can usually do this out-of-order.
 | 
				
			||||||
			h = blockHash(match >> 16)
 | 
								h = blockHash(match >> 16)
 | 
				
			||||||
			ref = hashTable[h]
 | 
								ref3 := c.get(h, si+2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Check the second match at si+1
 | 
								// Check the second match at si+1
 | 
				
			||||||
			si += 1
 | 
								si += 1
 | 
				
			||||||
			offset = si - ref2
 | 
								offset = si - ref2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if offset <= 0 || offset >= winSize ||
 | 
								if offset <= 0 || offset >= winSize || uint32(match>>8) != binary.LittleEndian.Uint32(src[ref2:]) {
 | 
				
			||||||
				uint32(match>>8) != binary.LittleEndian.Uint32(src[ref2:]) {
 | 
					 | 
				
			||||||
				// No match. Check the third match at si+2
 | 
									// No match. Check the third match at si+2
 | 
				
			||||||
				si += 1
 | 
									si += 1
 | 
				
			||||||
				offset = si - ref
 | 
									offset = si - ref3
 | 
				
			||||||
				hashTable[h] = si
 | 
									c.put(h, si)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if offset <= 0 || offset >= winSize ||
 | 
									if offset <= 0 || offset >= winSize || uint32(match>>16) != binary.LittleEndian.Uint32(src[ref3:]) {
 | 
				
			||||||
					uint32(match>>16) != binary.LittleEndian.Uint32(src[ref:]) {
 | 
					 | 
				
			||||||
					// Skip one extra byte (at si+3) before we check 3 matches again.
 | 
										// Skip one extra byte (at si+3) before we check 3 matches again.
 | 
				
			||||||
					si += 2 + (si-anchor)>>adaptSkipLog
 | 
										si += 2 + (si-anchor)>>adaptSkipLog
 | 
				
			||||||
					continue
 | 
										continue
 | 
				
			||||||
@@ -169,20 +209,28 @@ func CompressBlock(src, dst []byte, hashTable []int) (_ int, err error) {
 | 
				
			|||||||
		di++
 | 
							di++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Literals.
 | 
							// Literals.
 | 
				
			||||||
 | 
							if di+lLen > len(dst) {
 | 
				
			||||||
 | 
								return 0, lz4errors.ErrInvalidSourceShortBuffer
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		copy(dst[di:di+lLen], src[anchor:anchor+lLen])
 | 
							copy(dst[di:di+lLen], src[anchor:anchor+lLen])
 | 
				
			||||||
		di += lLen + 2
 | 
							di += lLen + 2
 | 
				
			||||||
		anchor = si
 | 
							anchor = si
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Encode offset.
 | 
							// Encode offset.
 | 
				
			||||||
		_ = dst[di] // Bound check elimination.
 | 
							if di > len(dst) {
 | 
				
			||||||
 | 
								return 0, lz4errors.ErrInvalidSourceShortBuffer
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		dst[di-2], dst[di-1] = byte(offset), byte(offset>>8)
 | 
							dst[di-2], dst[di-1] = byte(offset), byte(offset>>8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Encode match length part 2.
 | 
							// Encode match length part 2.
 | 
				
			||||||
		if mLen >= 0xF {
 | 
							if mLen >= 0xF {
 | 
				
			||||||
			for mLen -= 0xF; mLen >= 0xFF; mLen -= 0xFF {
 | 
								for mLen -= 0xF; mLen >= 0xFF && di < len(dst); mLen -= 0xFF {
 | 
				
			||||||
				dst[di] = 0xFF
 | 
									dst[di] = 0xFF
 | 
				
			||||||
				di++
 | 
									di++
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								if di >= len(dst) {
 | 
				
			||||||
 | 
									return 0, lz4errors.ErrInvalidSourceShortBuffer
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			dst[di] = byte(mLen)
 | 
								dst[di] = byte(mLen)
 | 
				
			||||||
			di++
 | 
								di++
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -192,7 +240,7 @@ func CompressBlock(src, dst []byte, hashTable []int) (_ int, err error) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		// Hash match end-2
 | 
							// Hash match end-2
 | 
				
			||||||
		h = blockHash(binary.LittleEndian.Uint64(src[si-2:]))
 | 
							h = blockHash(binary.LittleEndian.Uint64(src[si-2:]))
 | 
				
			||||||
		hashTable[h] = si - 2
 | 
							c.put(h, si-2)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lastLiterals:
 | 
					lastLiterals:
 | 
				
			||||||
@@ -202,16 +250,22 @@ lastLiterals:
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Last literals.
 | 
						// Last literals.
 | 
				
			||||||
 | 
						if di >= len(dst) {
 | 
				
			||||||
 | 
							return 0, lz4errors.ErrInvalidSourceShortBuffer
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	lLen := len(src) - anchor
 | 
						lLen := len(src) - anchor
 | 
				
			||||||
	if lLen < 0xF {
 | 
						if lLen < 0xF {
 | 
				
			||||||
		dst[di] = byte(lLen << 4)
 | 
							dst[di] = byte(lLen << 4)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		dst[di] = 0xF0
 | 
							dst[di] = 0xF0
 | 
				
			||||||
		di++
 | 
							di++
 | 
				
			||||||
		for lLen -= 0xF; lLen >= 0xFF; lLen -= 0xFF {
 | 
							for lLen -= 0xF; lLen >= 0xFF && di < len(dst); lLen -= 0xFF {
 | 
				
			||||||
			dst[di] = 0xFF
 | 
								dst[di] = 0xFF
 | 
				
			||||||
			di++
 | 
								di++
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if di >= len(dst) {
 | 
				
			||||||
 | 
								return 0, lz4errors.ErrInvalidSourceShortBuffer
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		dst[di] = byte(lLen)
 | 
							dst[di] = byte(lLen)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	di++
 | 
						di++
 | 
				
			||||||
@@ -221,35 +275,43 @@ lastLiterals:
 | 
				
			|||||||
		// Incompressible.
 | 
							// Incompressible.
 | 
				
			||||||
		return 0, nil
 | 
							return 0, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if di+len(src)-anchor > len(dst) {
 | 
				
			||||||
 | 
							return 0, lz4errors.ErrInvalidSourceShortBuffer
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	di += copy(dst[di:di+len(src)-anchor], src[anchor:])
 | 
						di += copy(dst[di:di+len(src)-anchor], src[anchor:])
 | 
				
			||||||
	return di, nil
 | 
						return di, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Pool of hash tables for CompressBlock.
 | 
					 | 
				
			||||||
var htPool = sync.Pool{
 | 
					 | 
				
			||||||
	New: func() interface{} {
 | 
					 | 
				
			||||||
		return new([htSize]int)
 | 
					 | 
				
			||||||
	},
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// blockHash hashes 4 bytes into a value < winSize.
 | 
					// blockHash hashes 4 bytes into a value < winSize.
 | 
				
			||||||
func blockHashHC(x uint32) uint32 {
 | 
					func blockHashHC(x uint32) uint32 {
 | 
				
			||||||
	const hasher uint32 = 2654435761 // Knuth multiplicative hash.
 | 
						const hasher uint32 = 2654435761 // Knuth multiplicative hash.
 | 
				
			||||||
	return x * hasher >> (32 - winSizeLog)
 | 
						return x * hasher >> (32 - winSizeLog)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// CompressBlockHC compresses the source buffer src into the destination dst
 | 
					type CompressorHC struct {
 | 
				
			||||||
// with max search depth (use 0 or negative value for no max).
 | 
						// hashTable: stores the last position found for a given hash
 | 
				
			||||||
//
 | 
						// chainTable: stores previous positions for a given hash
 | 
				
			||||||
// CompressBlockHC compression ratio is better than CompressBlock but it is also slower.
 | 
						hashTable, chainTable [htSize]int
 | 
				
			||||||
//
 | 
						needsReset            bool
 | 
				
			||||||
// The size of the compressed data is returned.
 | 
					}
 | 
				
			||||||
//
 | 
					
 | 
				
			||||||
// If the destination buffer size is lower than CompressBlockBound and
 | 
					var compressorHCPool = sync.Pool{New: func() interface{} { return new(CompressorHC) }}
 | 
				
			||||||
// the compressed size is 0 and no error, then the data is incompressible.
 | 
					
 | 
				
			||||||
//
 | 
					func CompressBlockHC(src, dst []byte, depth CompressionLevel) (int, error) {
 | 
				
			||||||
// An error is returned if the destination buffer is too small.
 | 
						c := compressorHCPool.Get().(*CompressorHC)
 | 
				
			||||||
func CompressBlockHC(src, dst []byte, depth int) (_ int, err error) {
 | 
						n, err := c.CompressBlock(src, dst, depth)
 | 
				
			||||||
 | 
						compressorHCPool.Put(c)
 | 
				
			||||||
 | 
						return n, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *CompressorHC) CompressBlock(src, dst []byte, depth CompressionLevel) (_ int, err error) {
 | 
				
			||||||
 | 
						if c.needsReset {
 | 
				
			||||||
 | 
							// Zero out reused table to avoid non-deterministic output (issue #65).
 | 
				
			||||||
 | 
							c.hashTable = [htSize]int{}
 | 
				
			||||||
 | 
							c.chainTable = [htSize]int{}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						c.needsReset = true // Only false on first call.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	defer recoverBlock(&err)
 | 
						defer recoverBlock(&err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Return 0, nil only if the destination buffer size is < CompressBlockBound.
 | 
						// Return 0, nil only if the destination buffer size is < CompressBlockBound.
 | 
				
			||||||
@@ -261,20 +323,15 @@ func CompressBlockHC(src, dst []byte, depth int) (_ int, err error) {
 | 
				
			|||||||
	const adaptSkipLog = 7
 | 
						const adaptSkipLog = 7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var si, di, anchor int
 | 
						var si, di, anchor int
 | 
				
			||||||
 | 
					 | 
				
			||||||
	// hashTable: stores the last position found for a given hash
 | 
					 | 
				
			||||||
	// chainTable: stores previous positions for a given hash
 | 
					 | 
				
			||||||
	var hashTable, chainTable [winSize]int
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if depth <= 0 {
 | 
					 | 
				
			||||||
		depth = winSize
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	sn := len(src) - mfLimit
 | 
						sn := len(src) - mfLimit
 | 
				
			||||||
	if sn <= 0 {
 | 
						if sn <= 0 {
 | 
				
			||||||
		goto lastLiterals
 | 
							goto lastLiterals
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if depth == 0 {
 | 
				
			||||||
 | 
							depth = winSize
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for si < sn {
 | 
						for si < sn {
 | 
				
			||||||
		// Hash the next 4 bytes (sequence).
 | 
							// Hash the next 4 bytes (sequence).
 | 
				
			||||||
		match := binary.LittleEndian.Uint32(src[si:])
 | 
							match := binary.LittleEndian.Uint32(src[si:])
 | 
				
			||||||
@@ -283,7 +340,7 @@ func CompressBlockHC(src, dst []byte, depth int) (_ int, err error) {
 | 
				
			|||||||
		// Follow the chain until out of window and give the longest match.
 | 
							// Follow the chain until out of window and give the longest match.
 | 
				
			||||||
		mLen := 0
 | 
							mLen := 0
 | 
				
			||||||
		offset := 0
 | 
							offset := 0
 | 
				
			||||||
		for next, try := hashTable[h], depth; try > 0 && next > 0 && si-next < winSize; next = chainTable[next&winMask] {
 | 
							for next, try := c.hashTable[h], depth; try > 0 && next > 0 && si-next < winSize; next, try = c.chainTable[next&winMask], try-1 {
 | 
				
			||||||
			// The first (mLen==0) or next byte (mLen>=minMatch) at current match length
 | 
								// The first (mLen==0) or next byte (mLen>=minMatch) at current match length
 | 
				
			||||||
			// must match to improve on the match length.
 | 
								// must match to improve on the match length.
 | 
				
			||||||
			if src[next+mLen] != src[si+mLen] {
 | 
								if src[next+mLen] != src[si+mLen] {
 | 
				
			||||||
@@ -309,10 +366,9 @@ func CompressBlockHC(src, dst []byte, depth int) (_ int, err error) {
 | 
				
			|||||||
			mLen = ml
 | 
								mLen = ml
 | 
				
			||||||
			offset = si - next
 | 
								offset = si - next
 | 
				
			||||||
			// Try another previous position with the same hash.
 | 
								// Try another previous position with the same hash.
 | 
				
			||||||
			try--
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		chainTable[si&winMask] = hashTable[h]
 | 
							c.chainTable[si&winMask] = c.hashTable[h]
 | 
				
			||||||
		hashTable[h] = si
 | 
							c.hashTable[h] = si
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// No match found.
 | 
							// No match found.
 | 
				
			||||||
		if mLen == 0 {
 | 
							if mLen == 0 {
 | 
				
			||||||
@@ -331,8 +387,8 @@ func CompressBlockHC(src, dst []byte, depth int) (_ int, err error) {
 | 
				
			|||||||
			match >>= 8
 | 
								match >>= 8
 | 
				
			||||||
			match |= uint32(src[si+3]) << 24
 | 
								match |= uint32(src[si+3]) << 24
 | 
				
			||||||
			h := blockHashHC(match)
 | 
								h := blockHashHC(match)
 | 
				
			||||||
			chainTable[si&winMask] = hashTable[h]
 | 
								c.chainTable[si&winMask] = c.hashTable[h]
 | 
				
			||||||
			hashTable[h] = si
 | 
								c.hashTable[h] = si
 | 
				
			||||||
			si++
 | 
								si++
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										88
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4block/blocks.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4block/blocks.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,88 @@
 | 
				
			|||||||
 | 
					// Package lz4block provides LZ4 BlockSize types and pools of buffers.
 | 
				
			||||||
 | 
					package lz4block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						Block64Kb uint32 = 1 << (16 + iota*2)
 | 
				
			||||||
 | 
						Block256Kb
 | 
				
			||||||
 | 
						Block1Mb
 | 
				
			||||||
 | 
						Block4Mb
 | 
				
			||||||
 | 
						Block8Mb        = 2 * Block4Mb
 | 
				
			||||||
 | 
						legacyBlockSize = Block8Mb + Block8Mb/255 + 16 // CompressBound(Block8Mb)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						BlockPool64K  = sync.Pool{New: func() interface{} { return make([]byte, Block64Kb) }}
 | 
				
			||||||
 | 
						BlockPool256K = sync.Pool{New: func() interface{} { return make([]byte, Block256Kb) }}
 | 
				
			||||||
 | 
						BlockPool1M   = sync.Pool{New: func() interface{} { return make([]byte, Block1Mb) }}
 | 
				
			||||||
 | 
						BlockPool4M   = sync.Pool{New: func() interface{} { return make([]byte, Block4Mb) }}
 | 
				
			||||||
 | 
						BlockPool8M   = sync.Pool{New: func() interface{} { return make([]byte, legacyBlockSize) }}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Index(b uint32) BlockSizeIndex {
 | 
				
			||||||
 | 
						switch b {
 | 
				
			||||||
 | 
						case Block64Kb:
 | 
				
			||||||
 | 
							return 4
 | 
				
			||||||
 | 
						case Block256Kb:
 | 
				
			||||||
 | 
							return 5
 | 
				
			||||||
 | 
						case Block1Mb:
 | 
				
			||||||
 | 
							return 6
 | 
				
			||||||
 | 
						case Block4Mb:
 | 
				
			||||||
 | 
							return 7
 | 
				
			||||||
 | 
						case Block8Mb: // only valid in legacy mode
 | 
				
			||||||
 | 
							return 3
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IsValid(b uint32) bool {
 | 
				
			||||||
 | 
						return Index(b) > 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BlockSizeIndex uint8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (b BlockSizeIndex) IsValid() bool {
 | 
				
			||||||
 | 
						switch b {
 | 
				
			||||||
 | 
						case 4, 5, 6, 7:
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (b BlockSizeIndex) Get() []byte {
 | 
				
			||||||
 | 
						var buf interface{}
 | 
				
			||||||
 | 
						switch b {
 | 
				
			||||||
 | 
						case 4:
 | 
				
			||||||
 | 
							buf = BlockPool64K.Get()
 | 
				
			||||||
 | 
						case 5:
 | 
				
			||||||
 | 
							buf = BlockPool256K.Get()
 | 
				
			||||||
 | 
						case 6:
 | 
				
			||||||
 | 
							buf = BlockPool1M.Get()
 | 
				
			||||||
 | 
						case 7:
 | 
				
			||||||
 | 
							buf = BlockPool4M.Get()
 | 
				
			||||||
 | 
						case 3:
 | 
				
			||||||
 | 
							buf = BlockPool8M.Get()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return buf.([]byte)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Put(buf []byte) {
 | 
				
			||||||
 | 
						// Safeguard: do not allow invalid buffers.
 | 
				
			||||||
 | 
						switch c := cap(buf); uint32(c) {
 | 
				
			||||||
 | 
						case Block64Kb:
 | 
				
			||||||
 | 
							BlockPool64K.Put(buf[:c])
 | 
				
			||||||
 | 
						case Block256Kb:
 | 
				
			||||||
 | 
							BlockPool256K.Put(buf[:c])
 | 
				
			||||||
 | 
						case Block1Mb:
 | 
				
			||||||
 | 
							BlockPool1M.Put(buf[:c])
 | 
				
			||||||
 | 
						case Block4Mb:
 | 
				
			||||||
 | 
							BlockPool4M.Put(buf[:c])
 | 
				
			||||||
 | 
						case legacyBlockSize:
 | 
				
			||||||
 | 
							BlockPool8M.Put(buf[:c])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type CompressionLevel uint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Fast CompressionLevel = 0
 | 
				
			||||||
@@ -26,6 +26,8 @@ TEXT ·decodeBlock(SB), NOSPLIT, $64-56
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	MOVQ src_base+24(FP), SI
 | 
						MOVQ src_base+24(FP), SI
 | 
				
			||||||
	MOVQ src_len+32(FP), R9
 | 
						MOVQ src_len+32(FP), R9
 | 
				
			||||||
 | 
						CMPQ R9, $0
 | 
				
			||||||
 | 
						JE   err_corrupt
 | 
				
			||||||
	ADDQ SI, R9
 | 
						ADDQ SI, R9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// shortcut ends
 | 
						// shortcut ends
 | 
				
			||||||
@@ -109,8 +111,7 @@ loop:
 | 
				
			|||||||
	MOVW 16(AX), BX
 | 
						MOVW 16(AX), BX
 | 
				
			||||||
	MOVW BX, 16(DI)
 | 
						MOVW BX, 16(DI)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ADDQ $4, DI // minmatch
 | 
						LEAQ 4(DI)(CX*1), DI // minmatch
 | 
				
			||||||
	ADDQ CX, DI
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// shortcut complete, load next token
 | 
						// shortcut complete, load next token
 | 
				
			||||||
	JMP loop
 | 
						JMP loop
 | 
				
			||||||
@@ -128,8 +129,7 @@ lit_len_loop:
 | 
				
			|||||||
	JNE lit_len_finalise
 | 
						JNE lit_len_finalise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// bounds check src[si+1]
 | 
						// bounds check src[si+1]
 | 
				
			||||||
	MOVQ SI, AX
 | 
						LEAQ 1(SI), AX
 | 
				
			||||||
	ADDQ $1, AX
 | 
					 | 
				
			||||||
	CMPQ AX, R9
 | 
						CMPQ AX, R9
 | 
				
			||||||
	JGT err_short_buf
 | 
						JGT err_short_buf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -147,13 +147,11 @@ lit_len_finalise:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
copy_literal:
 | 
					copy_literal:
 | 
				
			||||||
	// bounds check src and dst
 | 
						// bounds check src and dst
 | 
				
			||||||
	MOVQ SI, AX
 | 
						LEAQ (SI)(CX*1), AX
 | 
				
			||||||
	ADDQ CX, AX
 | 
					 | 
				
			||||||
	CMPQ AX, R9
 | 
						CMPQ AX, R9
 | 
				
			||||||
	JGT err_short_buf
 | 
						JGT err_short_buf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MOVQ DI, AX
 | 
						LEAQ (DI)(CX*1), AX
 | 
				
			||||||
	ADDQ CX, AX
 | 
					 | 
				
			||||||
	CMPQ AX, R8
 | 
						CMPQ AX, R8
 | 
				
			||||||
	JGT err_short_buf
 | 
						JGT err_short_buf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -219,8 +217,7 @@ offset:
 | 
				
			|||||||
	// free up DX to use for offset
 | 
						// free up DX to use for offset
 | 
				
			||||||
	MOVQ DX, CX
 | 
						MOVQ DX, CX
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MOVQ SI, AX
 | 
						LEAQ 2(SI), AX
 | 
				
			||||||
	ADDQ $2, AX
 | 
					 | 
				
			||||||
	CMPQ AX, R9
 | 
						CMPQ AX, R9
 | 
				
			||||||
	JGT err_short_buf
 | 
						JGT err_short_buf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -247,8 +244,7 @@ match_len_loop:
 | 
				
			|||||||
	JNE match_len_finalise
 | 
						JNE match_len_finalise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// bounds check src[si+1]
 | 
						// bounds check src[si+1]
 | 
				
			||||||
	MOVQ SI, AX
 | 
						LEAQ 1(SI), AX
 | 
				
			||||||
	ADDQ $1, AX
 | 
					 | 
				
			||||||
	CMPQ AX, R9
 | 
						CMPQ AX, R9
 | 
				
			||||||
	JGT err_short_buf
 | 
						JGT err_short_buf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -269,8 +265,7 @@ copy_match:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// check we have match_len bytes left in dst
 | 
						// check we have match_len bytes left in dst
 | 
				
			||||||
	// di+match_len < len(dst)
 | 
						// di+match_len < len(dst)
 | 
				
			||||||
	MOVQ DI, AX
 | 
						LEAQ (DI)(CX*1), AX
 | 
				
			||||||
	ADDQ CX, AX
 | 
					 | 
				
			||||||
	CMPQ AX, R8
 | 
						CMPQ AX, R8
 | 
				
			||||||
	JGT err_short_buf
 | 
						JGT err_short_buf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -286,8 +281,7 @@ copy_match:
 | 
				
			|||||||
	JLT err_short_buf
 | 
						JLT err_short_buf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// if offset + match_len < di
 | 
						// if offset + match_len < di
 | 
				
			||||||
	MOVQ BX, AX
 | 
						LEAQ (BX)(CX*1), AX
 | 
				
			||||||
	ADDQ CX, AX
 | 
					 | 
				
			||||||
	CMPQ DI, AX
 | 
						CMPQ DI, AX
 | 
				
			||||||
	JGT copy_interior_match
 | 
						JGT copy_interior_match
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										201
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4block/decode_arm.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4block/decode_arm.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,201 @@
 | 
				
			|||||||
 | 
					// +build gc
 | 
				
			||||||
 | 
					// +build !noasm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Register allocation.
 | 
				
			||||||
 | 
					#define dst	R0
 | 
				
			||||||
 | 
					#define dstorig	R1
 | 
				
			||||||
 | 
					#define src	R2
 | 
				
			||||||
 | 
					#define dstend	R3
 | 
				
			||||||
 | 
					#define srcend	R4
 | 
				
			||||||
 | 
					#define match	R5	// Match address.
 | 
				
			||||||
 | 
					#define token	R6
 | 
				
			||||||
 | 
					#define len	R7	// Literal and match lengths.
 | 
				
			||||||
 | 
					#define offset	R6	// Match offset; overlaps with token.
 | 
				
			||||||
 | 
					#define tmp1	R8
 | 
				
			||||||
 | 
					#define tmp2	R9
 | 
				
			||||||
 | 
					#define tmp3	R12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define minMatch	$4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// func decodeBlock(dst, src []byte) int
 | 
				
			||||||
 | 
					TEXT ·decodeBlock(SB), NOFRAME|NOSPLIT, $-4-28
 | 
				
			||||||
 | 
						MOVW dst_base +0(FP), dst
 | 
				
			||||||
 | 
						MOVW dst_len  +4(FP), dstend
 | 
				
			||||||
 | 
						MOVW src_base+12(FP), src
 | 
				
			||||||
 | 
						MOVW src_len +16(FP), srcend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CMP $0, srcend
 | 
				
			||||||
 | 
						BEQ shortSrc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ADD dst, dstend
 | 
				
			||||||
 | 
						ADD src, srcend
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVW dst, dstorig
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop:
 | 
				
			||||||
 | 
						// Read token. Extract literal length.
 | 
				
			||||||
 | 
						MOVBU.P 1(src), token
 | 
				
			||||||
 | 
						MOVW    token >> 4, len
 | 
				
			||||||
 | 
						CMP     $15, len
 | 
				
			||||||
 | 
						BNE     readLitlenDone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					readLitlenLoop:
 | 
				
			||||||
 | 
						CMP     src, srcend
 | 
				
			||||||
 | 
						BEQ     shortSrc
 | 
				
			||||||
 | 
						MOVBU.P 1(src), tmp1
 | 
				
			||||||
 | 
						ADD     tmp1, len
 | 
				
			||||||
 | 
						CMP     $255, tmp1
 | 
				
			||||||
 | 
						BEQ     readLitlenLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					readLitlenDone:
 | 
				
			||||||
 | 
						CMP $0, len
 | 
				
			||||||
 | 
						BEQ copyLiteralDone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Bounds check dst+len and src+len.
 | 
				
			||||||
 | 
						ADD    dst, len, tmp1
 | 
				
			||||||
 | 
						CMP    dstend, tmp1
 | 
				
			||||||
 | 
						//BHI  shortDst	// Uncomment for distinct error codes.
 | 
				
			||||||
 | 
						ADD    src, len, tmp2
 | 
				
			||||||
 | 
						CMP.LS srcend, tmp2
 | 
				
			||||||
 | 
						BHI    shortSrc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Copy literal.
 | 
				
			||||||
 | 
						CMP $4, len
 | 
				
			||||||
 | 
						BLO copyLiteralFinish
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Copy 0-3 bytes until src is aligned.
 | 
				
			||||||
 | 
						TST        $1, src
 | 
				
			||||||
 | 
						MOVBU.NE.P 1(src), tmp1
 | 
				
			||||||
 | 
						MOVB.NE.P  tmp1, 1(dst)
 | 
				
			||||||
 | 
						SUB.NE     $1, len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						TST        $2, src
 | 
				
			||||||
 | 
						MOVHU.NE.P 2(src), tmp2
 | 
				
			||||||
 | 
						MOVB.NE.P  tmp2, 1(dst)
 | 
				
			||||||
 | 
						MOVW.NE    tmp2 >> 8, tmp1
 | 
				
			||||||
 | 
						MOVB.NE.P  tmp1, 1(dst)
 | 
				
			||||||
 | 
						SUB.NE     $2, len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						B copyLiteralLoopCond
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					copyLiteralLoop:
 | 
				
			||||||
 | 
						// Aligned load, unaligned write.
 | 
				
			||||||
 | 
						MOVW.P 4(src), tmp1
 | 
				
			||||||
 | 
						MOVW   tmp1 >>  8, tmp2
 | 
				
			||||||
 | 
						MOVB   tmp2, 1(dst)
 | 
				
			||||||
 | 
						MOVW   tmp1 >> 16, tmp3
 | 
				
			||||||
 | 
						MOVB   tmp3, 2(dst)
 | 
				
			||||||
 | 
						MOVW   tmp1 >> 24, tmp2
 | 
				
			||||||
 | 
						MOVB   tmp2, 3(dst)
 | 
				
			||||||
 | 
						MOVB.P tmp1, 4(dst)
 | 
				
			||||||
 | 
					copyLiteralLoopCond:
 | 
				
			||||||
 | 
						// Loop until len-4 < 0.
 | 
				
			||||||
 | 
						SUB.S  $4, len
 | 
				
			||||||
 | 
						BPL    copyLiteralLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Restore len, which is now negative.
 | 
				
			||||||
 | 
						ADD $4, len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					copyLiteralFinish:
 | 
				
			||||||
 | 
						// Copy remaining 0-3 bytes.
 | 
				
			||||||
 | 
						TST        $2, len
 | 
				
			||||||
 | 
						MOVHU.NE.P 2(src), tmp2
 | 
				
			||||||
 | 
						MOVB.NE.P  tmp2, 1(dst)
 | 
				
			||||||
 | 
						MOVW.NE    tmp2 >> 8, tmp1
 | 
				
			||||||
 | 
						MOVB.NE.P  tmp1, 1(dst)
 | 
				
			||||||
 | 
						TST        $1, len
 | 
				
			||||||
 | 
						MOVBU.NE.P 1(src), tmp1
 | 
				
			||||||
 | 
						MOVB.NE.P  tmp1, 1(dst)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					copyLiteralDone:
 | 
				
			||||||
 | 
						CMP src, srcend
 | 
				
			||||||
 | 
						BEQ end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Initial part of match length.
 | 
				
			||||||
 | 
						// This frees up the token register for reuse as offset.
 | 
				
			||||||
 | 
						AND $15, token, len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Read offset.
 | 
				
			||||||
 | 
						ADD   $2, src
 | 
				
			||||||
 | 
						CMP   srcend, src
 | 
				
			||||||
 | 
						BHI   shortSrc
 | 
				
			||||||
 | 
						MOVBU -2(src), offset
 | 
				
			||||||
 | 
						MOVBU -1(src), tmp1
 | 
				
			||||||
 | 
						ORR   tmp1 << 8, offset
 | 
				
			||||||
 | 
						CMP   $0, offset
 | 
				
			||||||
 | 
						BEQ   corrupt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Read rest of match length.
 | 
				
			||||||
 | 
						CMP $15, len
 | 
				
			||||||
 | 
						BNE readMatchlenDone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					readMatchlenLoop:
 | 
				
			||||||
 | 
						CMP     src, srcend
 | 
				
			||||||
 | 
						BEQ     shortSrc
 | 
				
			||||||
 | 
						MOVBU.P 1(src), tmp1
 | 
				
			||||||
 | 
						ADD     tmp1, len
 | 
				
			||||||
 | 
						CMP     $255, tmp1
 | 
				
			||||||
 | 
						BEQ     readMatchlenLoop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					readMatchlenDone:
 | 
				
			||||||
 | 
						ADD minMatch, len
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Bounds check dst+len and match = dst-offset.
 | 
				
			||||||
 | 
						ADD    dst, len, tmp1
 | 
				
			||||||
 | 
						CMP    dstend, tmp1
 | 
				
			||||||
 | 
						//BHI  shortDst	// Uncomment for distinct error codes.
 | 
				
			||||||
 | 
						SUB    offset, dst, match
 | 
				
			||||||
 | 
						CMP.LS match, dstorig
 | 
				
			||||||
 | 
						BHI    corrupt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If the offset is at least four (len is, because of minMatch),
 | 
				
			||||||
 | 
						// do a four-way unrolled byte copy loop. Using MOVD instead of four
 | 
				
			||||||
 | 
						// byte loads is much faster, but to remain portable we'd have to
 | 
				
			||||||
 | 
						// align match first, which in turn is too expensive.
 | 
				
			||||||
 | 
						CMP $4, offset
 | 
				
			||||||
 | 
						BLO copyMatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SUB $4, len
 | 
				
			||||||
 | 
					copyMatch4:
 | 
				
			||||||
 | 
						MOVBU.P 4(match), tmp1
 | 
				
			||||||
 | 
						MOVB.P  tmp1, 4(dst)
 | 
				
			||||||
 | 
						MOVBU   -3(match), tmp2
 | 
				
			||||||
 | 
						MOVB    tmp2, -3(dst)
 | 
				
			||||||
 | 
						MOVBU   -2(match), tmp3
 | 
				
			||||||
 | 
						MOVB    tmp3, -2(dst)
 | 
				
			||||||
 | 
						MOVBU   -1(match), tmp1
 | 
				
			||||||
 | 
						MOVB    tmp1, -1(dst)
 | 
				
			||||||
 | 
						SUB.S   $4, len
 | 
				
			||||||
 | 
						BPL     copyMatch4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Restore len, which is now negative.
 | 
				
			||||||
 | 
						ADD.S $4, len
 | 
				
			||||||
 | 
						BEQ   copyMatchDone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					copyMatch:
 | 
				
			||||||
 | 
						// Simple byte-at-a-time copy.
 | 
				
			||||||
 | 
						SUB.S   $1, len
 | 
				
			||||||
 | 
						MOVBU.P 1(match), tmp2
 | 
				
			||||||
 | 
						MOVB.P  tmp2, 1(dst)
 | 
				
			||||||
 | 
						BNE     copyMatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					copyMatchDone:
 | 
				
			||||||
 | 
						CMP src, srcend
 | 
				
			||||||
 | 
						BNE loop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					end:
 | 
				
			||||||
 | 
						SUB  dstorig, dst, tmp1
 | 
				
			||||||
 | 
						MOVW tmp1, ret+24(FP)
 | 
				
			||||||
 | 
						RET
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// The three error cases have distinct labels so we can put different
 | 
				
			||||||
 | 
						// return codes here when debugging, or if the error returns need to
 | 
				
			||||||
 | 
						// be changed.
 | 
				
			||||||
 | 
					shortDst:
 | 
				
			||||||
 | 
					shortSrc:
 | 
				
			||||||
 | 
					corrupt:
 | 
				
			||||||
 | 
						MOVW $-1, tmp1
 | 
				
			||||||
 | 
						MOVW tmp1, ret+24(FP)
 | 
				
			||||||
 | 
						RET
 | 
				
			||||||
@@ -1,8 +1,9 @@
 | 
				
			|||||||
 | 
					// +build amd64 arm
 | 
				
			||||||
// +build !appengine
 | 
					// +build !appengine
 | 
				
			||||||
// +build gc
 | 
					// +build gc
 | 
				
			||||||
// +build !noasm
 | 
					// +build !noasm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package lz4
 | 
					package lz4block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//go:noescape
 | 
					//go:noescape
 | 
				
			||||||
func decodeBlock(dst, src []byte) int
 | 
					func decodeBlock(dst, src []byte) int
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
// +build !amd64 appengine !gc noasm
 | 
					// +build !amd64,!arm appengine !gc noasm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package lz4
 | 
					package lz4block
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func decodeBlock(dst, src []byte) (ret int) {
 | 
					func decodeBlock(dst, src []byte) (ret int) {
 | 
				
			||||||
	const hasError = -2
 | 
						const hasError = -2
 | 
				
			||||||
@@ -10,16 +10,16 @@ func decodeBlock(dst, src []byte) (ret int) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}()
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var si, di int
 | 
						var si, di uint
 | 
				
			||||||
	for {
 | 
						for {
 | 
				
			||||||
		// Literals and match lengths (token).
 | 
							// Literals and match lengths (token).
 | 
				
			||||||
		b := int(src[si])
 | 
							b := uint(src[si])
 | 
				
			||||||
		si++
 | 
							si++
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Literals.
 | 
							// Literals.
 | 
				
			||||||
		if lLen := b >> 4; lLen > 0 {
 | 
							if lLen := b >> 4; lLen > 0 {
 | 
				
			||||||
			switch {
 | 
								switch {
 | 
				
			||||||
			case lLen < 0xF && si+16 < len(src):
 | 
								case lLen < 0xF && si+16 < uint(len(src)):
 | 
				
			||||||
				// Shortcut 1
 | 
									// Shortcut 1
 | 
				
			||||||
				// if we have enough room in src and dst, and the literals length
 | 
									// if we have enough room in src and dst, and the literals length
 | 
				
			||||||
				// is small enough (0..14) then copy all 16 bytes, even if not all
 | 
									// is small enough (0..14) then copy all 16 bytes, even if not all
 | 
				
			||||||
@@ -32,13 +32,13 @@ func decodeBlock(dst, src []byte) (ret int) {
 | 
				
			|||||||
					// if the match length (4..18) fits within the literals, then copy
 | 
										// if the match length (4..18) fits within the literals, then copy
 | 
				
			||||||
					// all 18 bytes, even if not all are part of the literals.
 | 
										// all 18 bytes, even if not all are part of the literals.
 | 
				
			||||||
					mLen += 4
 | 
										mLen += 4
 | 
				
			||||||
					if offset := int(src[si]) | int(src[si+1])<<8; mLen <= offset {
 | 
										if offset := uint(src[si]) | uint(src[si+1])<<8; mLen <= offset {
 | 
				
			||||||
						i := di - offset
 | 
											i := di - offset
 | 
				
			||||||
						end := i + 18
 | 
											end := i + 18
 | 
				
			||||||
						if end > len(dst) {
 | 
											if end > uint(len(dst)) {
 | 
				
			||||||
							// The remaining buffer may not hold 18 bytes.
 | 
												// The remaining buffer may not hold 18 bytes.
 | 
				
			||||||
							// See https://github.com/pierrec/lz4/issues/51.
 | 
												// See https://github.com/pierrec/lz4/issues/51.
 | 
				
			||||||
							end = len(dst)
 | 
												end = uint(len(dst))
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						copy(dst[di:], dst[i:end])
 | 
											copy(dst[di:], dst[i:end])
 | 
				
			||||||
						si += 2
 | 
											si += 2
 | 
				
			||||||
@@ -51,7 +51,7 @@ func decodeBlock(dst, src []byte) (ret int) {
 | 
				
			|||||||
					lLen += 0xFF
 | 
										lLen += 0xFF
 | 
				
			||||||
					si++
 | 
										si++
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				lLen += int(src[si])
 | 
									lLen += uint(src[si])
 | 
				
			||||||
				si++
 | 
									si++
 | 
				
			||||||
				fallthrough
 | 
									fallthrough
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
@@ -60,11 +60,13 @@ func decodeBlock(dst, src []byte) (ret int) {
 | 
				
			|||||||
				di += lLen
 | 
									di += lLen
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if si >= len(src) {
 | 
							if si == uint(len(src)) {
 | 
				
			||||||
			return di
 | 
								return int(di)
 | 
				
			||||||
 | 
							} else if si > uint(len(src)) {
 | 
				
			||||||
 | 
								return hasError
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		offset := int(src[si]) | int(src[si+1])<<8
 | 
							offset := uint(src[si]) | uint(src[si+1])<<8
 | 
				
			||||||
		if offset == 0 {
 | 
							if offset == 0 {
 | 
				
			||||||
			return hasError
 | 
								return hasError
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -77,7 +79,7 @@ func decodeBlock(dst, src []byte) (ret int) {
 | 
				
			|||||||
				mLen += 0xFF
 | 
									mLen += 0xFF
 | 
				
			||||||
				si++
 | 
									si++
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			mLen += int(src[si])
 | 
								mLen += uint(src[si])
 | 
				
			||||||
			si++
 | 
								si++
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		mLen += minMatch
 | 
							mLen += minMatch
 | 
				
			||||||
@@ -93,6 +95,6 @@ func decodeBlock(dst, src []byte) (ret int) {
 | 
				
			|||||||
			di += bytesToCopy
 | 
								di += bytesToCopy
 | 
				
			||||||
			mLen -= bytesToCopy
 | 
								mLen -= bytesToCopy
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		di += copy(dst[di:di+mLen], expanded[:mLen])
 | 
							di += uint(copy(dst[di:di+mLen], expanded[:mLen]))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										19
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4errors/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4errors/errors.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					package lz4errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Error string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e Error) Error() string { return string(e) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						ErrInvalidSourceShortBuffer      Error = "lz4: invalid source or destination buffer too short"
 | 
				
			||||||
 | 
						ErrInvalidFrame                  Error = "lz4: bad magic number"
 | 
				
			||||||
 | 
						ErrInternalUnhandledState        Error = "lz4: unhandled state"
 | 
				
			||||||
 | 
						ErrInvalidHeaderChecksum         Error = "lz4: invalid header checksum"
 | 
				
			||||||
 | 
						ErrInvalidBlockChecksum          Error = "lz4: invalid block checksum"
 | 
				
			||||||
 | 
						ErrInvalidFrameChecksum          Error = "lz4: invalid frame checksum"
 | 
				
			||||||
 | 
						ErrOptionInvalidCompressionLevel Error = "lz4: invalid compression level"
 | 
				
			||||||
 | 
						ErrOptionClosedOrError           Error = "lz4: cannot apply options on closed or in error object"
 | 
				
			||||||
 | 
						ErrOptionInvalidBlockSize        Error = "lz4: invalid block size"
 | 
				
			||||||
 | 
						ErrOptionNotApplicable           Error = "lz4: option not applicable"
 | 
				
			||||||
 | 
						ErrWriterNotClosed               Error = "lz4: writer not closed"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										331
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4stream/block.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4stream/block.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,331 @@
 | 
				
			|||||||
 | 
					package lz4stream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/binary"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4block"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4errors"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/xxh32"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Blocks struct {
 | 
				
			||||||
 | 
						Block  *FrameDataBlock
 | 
				
			||||||
 | 
						Blocks chan chan *FrameDataBlock
 | 
				
			||||||
 | 
						mu     sync.Mutex
 | 
				
			||||||
 | 
						err    error
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (b *Blocks) initW(f *Frame, dst io.Writer, num int) {
 | 
				
			||||||
 | 
						if num == 1 {
 | 
				
			||||||
 | 
							b.Blocks = nil
 | 
				
			||||||
 | 
							b.Block = NewFrameDataBlock(f)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b.Block = nil
 | 
				
			||||||
 | 
						if cap(b.Blocks) != num {
 | 
				
			||||||
 | 
							b.Blocks = make(chan chan *FrameDataBlock, num)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// goroutine managing concurrent block compression goroutines.
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							// Process next block compression item.
 | 
				
			||||||
 | 
							for c := range b.Blocks {
 | 
				
			||||||
 | 
								// Read the next compressed block result.
 | 
				
			||||||
 | 
								// Waiting here ensures that the blocks are output in the order they were sent.
 | 
				
			||||||
 | 
								// The incoming channel is always closed as it indicates to the caller that
 | 
				
			||||||
 | 
								// the block has been processed.
 | 
				
			||||||
 | 
								block := <-c
 | 
				
			||||||
 | 
								if block == nil {
 | 
				
			||||||
 | 
									// Notify the block compression routine that we are done with its result.
 | 
				
			||||||
 | 
									// This is used when a sentinel block is sent to terminate the compression.
 | 
				
			||||||
 | 
									close(c)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// Do not attempt to write the block upon any previous failure.
 | 
				
			||||||
 | 
								if b.err == nil {
 | 
				
			||||||
 | 
									// Write the block.
 | 
				
			||||||
 | 
									if err := block.Write(f, dst); err != nil {
 | 
				
			||||||
 | 
										// Keep the first error.
 | 
				
			||||||
 | 
										b.err = err
 | 
				
			||||||
 | 
										// All pending compression goroutines need to shut down, so we need to keep going.
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								close(c)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (b *Blocks) close(f *Frame, num int) error {
 | 
				
			||||||
 | 
						if num == 1 {
 | 
				
			||||||
 | 
							if b.Block != nil {
 | 
				
			||||||
 | 
								b.Block.Close(f)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							err := b.err
 | 
				
			||||||
 | 
							b.err = nil
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if b.Blocks == nil {
 | 
				
			||||||
 | 
							// Not initialized yet.
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						c := make(chan *FrameDataBlock)
 | 
				
			||||||
 | 
						b.Blocks <- c
 | 
				
			||||||
 | 
						c <- nil
 | 
				
			||||||
 | 
						<-c
 | 
				
			||||||
 | 
						err := b.err
 | 
				
			||||||
 | 
						b.err = nil
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ErrorR returns any error set while uncompressing a stream.
 | 
				
			||||||
 | 
					func (b *Blocks) ErrorR() error {
 | 
				
			||||||
 | 
						b.mu.Lock()
 | 
				
			||||||
 | 
						defer b.mu.Unlock()
 | 
				
			||||||
 | 
						return b.err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// initR returns a channel that streams the uncompressed blocks if in concurrent
 | 
				
			||||||
 | 
					// mode and no error. When the channel is closed, check for any error with b.ErrorR.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If not in concurrent mode, the uncompressed block is b.Block and the returned error
 | 
				
			||||||
 | 
					// needs to be checked.
 | 
				
			||||||
 | 
					func (b *Blocks) initR(f *Frame, num int, src io.Reader) (chan []byte, error) {
 | 
				
			||||||
 | 
						size := f.Descriptor.Flags.BlockSizeIndex()
 | 
				
			||||||
 | 
						if num == 1 {
 | 
				
			||||||
 | 
							b.Blocks = nil
 | 
				
			||||||
 | 
							b.Block = NewFrameDataBlock(f)
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b.Block = nil
 | 
				
			||||||
 | 
						blocks := make(chan chan []byte, num)
 | 
				
			||||||
 | 
						// data receives the uncompressed blocks.
 | 
				
			||||||
 | 
						data := make(chan []byte)
 | 
				
			||||||
 | 
						// Read blocks from the source sequentially
 | 
				
			||||||
 | 
						// and uncompress them concurrently.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// In legacy mode, accrue the uncompress sizes in cum.
 | 
				
			||||||
 | 
						var cum uint32
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							var cumx uint32
 | 
				
			||||||
 | 
							var err error
 | 
				
			||||||
 | 
							for b.ErrorR() == nil {
 | 
				
			||||||
 | 
								block := NewFrameDataBlock(f)
 | 
				
			||||||
 | 
								cumx, err = block.Read(f, src, 0)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// Recheck for an error as reading may be slow and uncompressing is expensive.
 | 
				
			||||||
 | 
								if b.ErrorR() != nil {
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								c := make(chan []byte)
 | 
				
			||||||
 | 
								blocks <- c
 | 
				
			||||||
 | 
								go func() {
 | 
				
			||||||
 | 
									data, err := block.Uncompress(f, size.Get(), false)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										b.closeR(err)
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										c <- data
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// End the collection loop and the data channel.
 | 
				
			||||||
 | 
							c := make(chan []byte)
 | 
				
			||||||
 | 
							blocks <- c
 | 
				
			||||||
 | 
							c <- nil // signal the collection loop that we are done
 | 
				
			||||||
 | 
							<-c      // wait for the collect loop to complete
 | 
				
			||||||
 | 
							if f.isLegacy() && cum == cumx {
 | 
				
			||||||
 | 
								err = io.EOF
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							b.closeR(err)
 | 
				
			||||||
 | 
							close(data)
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
						// Collect the uncompressed blocks and make them available
 | 
				
			||||||
 | 
						// on the returned channel.
 | 
				
			||||||
 | 
						go func(leg bool) {
 | 
				
			||||||
 | 
							defer close(blocks)
 | 
				
			||||||
 | 
							for c := range blocks {
 | 
				
			||||||
 | 
								buf := <-c
 | 
				
			||||||
 | 
								if buf == nil {
 | 
				
			||||||
 | 
									// Signal to end the loop.
 | 
				
			||||||
 | 
									close(c)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// Perform checksum now as the blocks are received in order.
 | 
				
			||||||
 | 
								if f.Descriptor.Flags.ContentChecksum() {
 | 
				
			||||||
 | 
									_, _ = f.checksum.Write(buf)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if leg {
 | 
				
			||||||
 | 
									cum += uint32(len(buf))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								data <- buf
 | 
				
			||||||
 | 
								close(c)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}(f.isLegacy())
 | 
				
			||||||
 | 
						return data, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// closeR safely sets the error on b if not already set.
 | 
				
			||||||
 | 
					func (b *Blocks) closeR(err error) {
 | 
				
			||||||
 | 
						b.mu.Lock()
 | 
				
			||||||
 | 
						if b.err == nil {
 | 
				
			||||||
 | 
							b.err = err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b.mu.Unlock()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewFrameDataBlock(f *Frame) *FrameDataBlock {
 | 
				
			||||||
 | 
						buf := f.Descriptor.Flags.BlockSizeIndex().Get()
 | 
				
			||||||
 | 
						return &FrameDataBlock{Data: buf, data: buf}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type FrameDataBlock struct {
 | 
				
			||||||
 | 
						Size     DataBlockSize
 | 
				
			||||||
 | 
						Data     []byte // compressed or uncompressed data (.data or .src)
 | 
				
			||||||
 | 
						Checksum uint32
 | 
				
			||||||
 | 
						data     []byte // buffer for compressed data
 | 
				
			||||||
 | 
						src      []byte // uncompressed data
 | 
				
			||||||
 | 
						err      error  // used in concurrent mode
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (b *FrameDataBlock) Close(f *Frame) {
 | 
				
			||||||
 | 
						b.Size = 0
 | 
				
			||||||
 | 
						b.Checksum = 0
 | 
				
			||||||
 | 
						b.err = nil
 | 
				
			||||||
 | 
						if b.data != nil {
 | 
				
			||||||
 | 
							// Block was not already closed.
 | 
				
			||||||
 | 
							lz4block.Put(b.data)
 | 
				
			||||||
 | 
							b.Data = nil
 | 
				
			||||||
 | 
							b.data = nil
 | 
				
			||||||
 | 
							b.src = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Block compression errors are ignored since the buffer is sized appropriately.
 | 
				
			||||||
 | 
					func (b *FrameDataBlock) Compress(f *Frame, src []byte, level lz4block.CompressionLevel) *FrameDataBlock {
 | 
				
			||||||
 | 
						data := b.data
 | 
				
			||||||
 | 
						if f.isLegacy() {
 | 
				
			||||||
 | 
							data = data[:cap(data)]
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							data = data[:len(src)] // trigger the incompressible flag in CompressBlock
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var n int
 | 
				
			||||||
 | 
						switch level {
 | 
				
			||||||
 | 
						case lz4block.Fast:
 | 
				
			||||||
 | 
							n, _ = lz4block.CompressBlock(src, data)
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							n, _ = lz4block.CompressBlockHC(src, data, level)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if n == 0 {
 | 
				
			||||||
 | 
							b.Size.UncompressedSet(true)
 | 
				
			||||||
 | 
							b.Data = src
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							b.Size.UncompressedSet(false)
 | 
				
			||||||
 | 
							b.Data = data[:n]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b.Size.sizeSet(len(b.Data))
 | 
				
			||||||
 | 
						b.src = src // keep track of the source for content checksum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if f.Descriptor.Flags.BlockChecksum() {
 | 
				
			||||||
 | 
							b.Checksum = xxh32.ChecksumZero(src)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return b
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (b *FrameDataBlock) Write(f *Frame, dst io.Writer) error {
 | 
				
			||||||
 | 
						// Write is called in the same order as blocks are compressed,
 | 
				
			||||||
 | 
						// so content checksum must be done here.
 | 
				
			||||||
 | 
						if f.Descriptor.Flags.ContentChecksum() {
 | 
				
			||||||
 | 
							_, _ = f.checksum.Write(b.src)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buf := f.buf[:]
 | 
				
			||||||
 | 
						binary.LittleEndian.PutUint32(buf, uint32(b.Size))
 | 
				
			||||||
 | 
						if _, err := dst.Write(buf[:4]); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err := dst.Write(b.Data); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if b.Checksum == 0 {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						binary.LittleEndian.PutUint32(buf, b.Checksum)
 | 
				
			||||||
 | 
						_, err := dst.Write(buf[:4])
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Read updates b with the next block data, size and checksum if available.
 | 
				
			||||||
 | 
					func (b *FrameDataBlock) Read(f *Frame, src io.Reader, cum uint32) (uint32, error) {
 | 
				
			||||||
 | 
						x, err := f.readUint32(src)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if f.isLegacy() {
 | 
				
			||||||
 | 
							switch x {
 | 
				
			||||||
 | 
							case frameMagicLegacy:
 | 
				
			||||||
 | 
								// Concatenated legacy frame.
 | 
				
			||||||
 | 
								return b.Read(f, src, cum)
 | 
				
			||||||
 | 
							case cum:
 | 
				
			||||||
 | 
								// Only works in non concurrent mode, for concurrent mode
 | 
				
			||||||
 | 
								// it is handled separately.
 | 
				
			||||||
 | 
								// Linux kernel format appends the total uncompressed size at the end.
 | 
				
			||||||
 | 
								return 0, io.EOF
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else if x == 0 {
 | 
				
			||||||
 | 
							// Marker for end of stream.
 | 
				
			||||||
 | 
							return 0, io.EOF
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b.Size = DataBlockSize(x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						size := b.Size.size()
 | 
				
			||||||
 | 
						if size > cap(b.data) {
 | 
				
			||||||
 | 
							return x, lz4errors.ErrOptionInvalidBlockSize
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b.data = b.data[:size]
 | 
				
			||||||
 | 
						if _, err := io.ReadFull(src, b.data); err != nil {
 | 
				
			||||||
 | 
							return x, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if f.Descriptor.Flags.BlockChecksum() {
 | 
				
			||||||
 | 
							sum, err := f.readUint32(src)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return 0, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							b.Checksum = sum
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return x, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (b *FrameDataBlock) Uncompress(f *Frame, dst []byte, sum bool) ([]byte, error) {
 | 
				
			||||||
 | 
						if b.Size.Uncompressed() {
 | 
				
			||||||
 | 
							n := copy(dst, b.data)
 | 
				
			||||||
 | 
							dst = dst[:n]
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							n, err := lz4block.UncompressBlock(b.data, dst)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							dst = dst[:n]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if f.Descriptor.Flags.BlockChecksum() {
 | 
				
			||||||
 | 
							if c := xxh32.ChecksumZero(dst); c != b.Checksum {
 | 
				
			||||||
 | 
								err := fmt.Errorf("%w: got %x; expected %x", lz4errors.ErrInvalidBlockChecksum, c, b.Checksum)
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if sum && f.Descriptor.Flags.ContentChecksum() {
 | 
				
			||||||
 | 
							_, _ = f.checksum.Write(dst)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return dst, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (f *Frame) readUint32(r io.Reader) (x uint32, err error) {
 | 
				
			||||||
 | 
						if _, err = io.ReadFull(r, f.buf[:4]); err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						x = binary.LittleEndian.Uint32(f.buf[:4])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										200
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4stream/frame.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4stream/frame.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,200 @@
 | 
				
			|||||||
 | 
					// Package lz4stream provides the types that support reading and writing LZ4 data streams.
 | 
				
			||||||
 | 
					package lz4stream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/binary"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4block"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4errors"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/xxh32"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:generate go run gen.go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						frameMagic       uint32 = 0x184D2204
 | 
				
			||||||
 | 
						frameSkipMagic   uint32 = 0x184D2A50
 | 
				
			||||||
 | 
						frameMagicLegacy uint32 = 0x184C2102
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NewFrame() *Frame {
 | 
				
			||||||
 | 
						return &Frame{}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Frame struct {
 | 
				
			||||||
 | 
						buf        [15]byte // frame descriptor needs at most 4(magic)+4+8+1=11 bytes
 | 
				
			||||||
 | 
						Magic      uint32
 | 
				
			||||||
 | 
						Descriptor FrameDescriptor
 | 
				
			||||||
 | 
						Blocks     Blocks
 | 
				
			||||||
 | 
						Checksum   uint32
 | 
				
			||||||
 | 
						checksum   xxh32.XXHZero
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Reset allows reusing the Frame.
 | 
				
			||||||
 | 
					// The Descriptor configuration is not modified.
 | 
				
			||||||
 | 
					func (f *Frame) Reset(num int) {
 | 
				
			||||||
 | 
						f.Magic = 0
 | 
				
			||||||
 | 
						f.Descriptor.Checksum = 0
 | 
				
			||||||
 | 
						f.Descriptor.ContentSize = 0
 | 
				
			||||||
 | 
						_ = f.Blocks.close(f, num)
 | 
				
			||||||
 | 
						f.Checksum = 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (f *Frame) InitW(dst io.Writer, num int, legacy bool) {
 | 
				
			||||||
 | 
						if legacy {
 | 
				
			||||||
 | 
							f.Magic = frameMagicLegacy
 | 
				
			||||||
 | 
							idx := lz4block.Index(lz4block.Block8Mb)
 | 
				
			||||||
 | 
							f.Descriptor.Flags.BlockSizeIndexSet(idx)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							f.Magic = frameMagic
 | 
				
			||||||
 | 
							f.Descriptor.initW()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						f.Blocks.initW(f, dst, num)
 | 
				
			||||||
 | 
						f.checksum.Reset()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (f *Frame) CloseW(dst io.Writer, num int) error {
 | 
				
			||||||
 | 
						if err := f.Blocks.close(f, num); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if f.isLegacy() {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buf := f.buf[:0]
 | 
				
			||||||
 | 
						// End mark (data block size of uint32(0)).
 | 
				
			||||||
 | 
						buf = append(buf, 0, 0, 0, 0)
 | 
				
			||||||
 | 
						if f.Descriptor.Flags.ContentChecksum() {
 | 
				
			||||||
 | 
							buf = f.checksum.Sum(buf)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err := dst.Write(buf)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (f *Frame) isLegacy() bool {
 | 
				
			||||||
 | 
						return f.Magic == frameMagicLegacy
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (f *Frame) InitR(src io.Reader, num int) (chan []byte, error) {
 | 
				
			||||||
 | 
						if f.Magic > 0 {
 | 
				
			||||||
 | 
							// Header already read.
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					newFrame:
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						if f.Magic, err = f.readUint32(src); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						switch m := f.Magic; {
 | 
				
			||||||
 | 
						case m == frameMagic || m == frameMagicLegacy:
 | 
				
			||||||
 | 
						// All 16 values of frameSkipMagic are valid.
 | 
				
			||||||
 | 
						case m>>8 == frameSkipMagic>>8:
 | 
				
			||||||
 | 
							skip, err := f.readUint32(src)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if _, err := io.CopyN(ioutil.Discard, src, int64(skip)); err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							goto newFrame
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return nil, lz4errors.ErrInvalidFrame
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := f.Descriptor.initR(f, src); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						f.checksum.Reset()
 | 
				
			||||||
 | 
						return f.Blocks.initR(f, num, src)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (f *Frame) CloseR(src io.Reader) (err error) {
 | 
				
			||||||
 | 
						if f.isLegacy() {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !f.Descriptor.Flags.ContentChecksum() {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if f.Checksum, err = f.readUint32(src); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if c := f.checksum.Sum32(); c != f.Checksum {
 | 
				
			||||||
 | 
							return fmt.Errorf("%w: got %x; expected %x", lz4errors.ErrInvalidFrameChecksum, c, f.Checksum)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type FrameDescriptor struct {
 | 
				
			||||||
 | 
						Flags       DescriptorFlags
 | 
				
			||||||
 | 
						ContentSize uint64
 | 
				
			||||||
 | 
						Checksum    uint8
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (fd *FrameDescriptor) initW() {
 | 
				
			||||||
 | 
						fd.Flags.VersionSet(1)
 | 
				
			||||||
 | 
						fd.Flags.BlockIndependenceSet(true)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (fd *FrameDescriptor) Write(f *Frame, dst io.Writer) error {
 | 
				
			||||||
 | 
						if fd.Checksum > 0 {
 | 
				
			||||||
 | 
							// Header already written.
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf := f.buf[:4]
 | 
				
			||||||
 | 
						// Write the magic number here even though it belongs to the Frame.
 | 
				
			||||||
 | 
						binary.LittleEndian.PutUint32(buf, f.Magic)
 | 
				
			||||||
 | 
						if !f.isLegacy() {
 | 
				
			||||||
 | 
							buf = buf[:4+2]
 | 
				
			||||||
 | 
							binary.LittleEndian.PutUint16(buf[4:], uint16(fd.Flags))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if fd.Flags.Size() {
 | 
				
			||||||
 | 
								buf = buf[:4+2+8]
 | 
				
			||||||
 | 
								binary.LittleEndian.PutUint64(buf[4+2:], fd.ContentSize)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							fd.Checksum = descriptorChecksum(buf[4:])
 | 
				
			||||||
 | 
							buf = append(buf, fd.Checksum)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err := dst.Write(buf)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (fd *FrameDescriptor) initR(f *Frame, src io.Reader) error {
 | 
				
			||||||
 | 
						if f.isLegacy() {
 | 
				
			||||||
 | 
							idx := lz4block.Index(lz4block.Block8Mb)
 | 
				
			||||||
 | 
							f.Descriptor.Flags.BlockSizeIndexSet(idx)
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Read the flags and the checksum, hoping that there is not content size.
 | 
				
			||||||
 | 
						buf := f.buf[:3]
 | 
				
			||||||
 | 
						if _, err := io.ReadFull(src, buf); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						descr := binary.LittleEndian.Uint16(buf)
 | 
				
			||||||
 | 
						fd.Flags = DescriptorFlags(descr)
 | 
				
			||||||
 | 
						if fd.Flags.Size() {
 | 
				
			||||||
 | 
							// Append the 8 missing bytes.
 | 
				
			||||||
 | 
							buf = buf[:3+8]
 | 
				
			||||||
 | 
							if _, err := io.ReadFull(src, buf[3:]); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							fd.ContentSize = binary.LittleEndian.Uint64(buf[2:])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fd.Checksum = buf[len(buf)-1] // the checksum is the last byte
 | 
				
			||||||
 | 
						buf = buf[:len(buf)-1]        // all descriptor fields except checksum
 | 
				
			||||||
 | 
						if c := descriptorChecksum(buf); fd.Checksum != c {
 | 
				
			||||||
 | 
							return fmt.Errorf("%w: got %x; expected %x", lz4errors.ErrInvalidHeaderChecksum, c, fd.Checksum)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Validate the elements that can be.
 | 
				
			||||||
 | 
						if idx := fd.Flags.BlockSizeIndex(); !idx.IsValid() {
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionInvalidBlockSize
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func descriptorChecksum(buf []byte) byte {
 | 
				
			||||||
 | 
						return byte(xxh32.ChecksumZero(buf) >> 8)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										103
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4stream/frame_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								vendor/github.com/pierrec/lz4/v4/internal/lz4stream/frame_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
				
			|||||||
 | 
					// Code generated by `gen.exe`. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package lz4stream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "github.com/pierrec/lz4/v4/internal/lz4block"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DescriptorFlags is defined as follow:
 | 
				
			||||||
 | 
					//   field              bits
 | 
				
			||||||
 | 
					//   -----              ----
 | 
				
			||||||
 | 
					//   _                  2
 | 
				
			||||||
 | 
					//   ContentChecksum    1
 | 
				
			||||||
 | 
					//   Size               1
 | 
				
			||||||
 | 
					//   BlockChecksum      1
 | 
				
			||||||
 | 
					//   BlockIndependence  1
 | 
				
			||||||
 | 
					//   Version            2
 | 
				
			||||||
 | 
					//   _                  4
 | 
				
			||||||
 | 
					//   BlockSizeIndex     3
 | 
				
			||||||
 | 
					//   _                  1
 | 
				
			||||||
 | 
					type DescriptorFlags uint16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Getters.
 | 
				
			||||||
 | 
					func (x DescriptorFlags) ContentChecksum() bool   { return x>>2&1 != 0 }
 | 
				
			||||||
 | 
					func (x DescriptorFlags) Size() bool              { return x>>3&1 != 0 }
 | 
				
			||||||
 | 
					func (x DescriptorFlags) BlockChecksum() bool     { return x>>4&1 != 0 }
 | 
				
			||||||
 | 
					func (x DescriptorFlags) BlockIndependence() bool { return x>>5&1 != 0 }
 | 
				
			||||||
 | 
					func (x DescriptorFlags) Version() uint16         { return uint16(x >> 6 & 0x3) }
 | 
				
			||||||
 | 
					func (x DescriptorFlags) BlockSizeIndex() lz4block.BlockSizeIndex {
 | 
				
			||||||
 | 
						return lz4block.BlockSizeIndex(x >> 12 & 0x7)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Setters.
 | 
				
			||||||
 | 
					func (x *DescriptorFlags) ContentChecksumSet(v bool) *DescriptorFlags {
 | 
				
			||||||
 | 
						const b = 1 << 2
 | 
				
			||||||
 | 
						if v {
 | 
				
			||||||
 | 
							*x = *x&^b | b
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							*x &^= b
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return x
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (x *DescriptorFlags) SizeSet(v bool) *DescriptorFlags {
 | 
				
			||||||
 | 
						const b = 1 << 3
 | 
				
			||||||
 | 
						if v {
 | 
				
			||||||
 | 
							*x = *x&^b | b
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							*x &^= b
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return x
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (x *DescriptorFlags) BlockChecksumSet(v bool) *DescriptorFlags {
 | 
				
			||||||
 | 
						const b = 1 << 4
 | 
				
			||||||
 | 
						if v {
 | 
				
			||||||
 | 
							*x = *x&^b | b
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							*x &^= b
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return x
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (x *DescriptorFlags) BlockIndependenceSet(v bool) *DescriptorFlags {
 | 
				
			||||||
 | 
						const b = 1 << 5
 | 
				
			||||||
 | 
						if v {
 | 
				
			||||||
 | 
							*x = *x&^b | b
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							*x &^= b
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return x
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (x *DescriptorFlags) VersionSet(v uint16) *DescriptorFlags {
 | 
				
			||||||
 | 
						*x = *x&^(0x3<<6) | (DescriptorFlags(v) & 0x3 << 6)
 | 
				
			||||||
 | 
						return x
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (x *DescriptorFlags) BlockSizeIndexSet(v lz4block.BlockSizeIndex) *DescriptorFlags {
 | 
				
			||||||
 | 
						*x = *x&^(0x7<<12) | (DescriptorFlags(v) & 0x7 << 12)
 | 
				
			||||||
 | 
						return x
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Code generated by `gen.exe`. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DataBlockSize is defined as follow:
 | 
				
			||||||
 | 
					//   field         bits
 | 
				
			||||||
 | 
					//   -----         ----
 | 
				
			||||||
 | 
					//   size          31
 | 
				
			||||||
 | 
					//   Uncompressed  1
 | 
				
			||||||
 | 
					type DataBlockSize uint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Getters.
 | 
				
			||||||
 | 
					func (x DataBlockSize) size() int          { return int(x & 0x7FFFFFFF) }
 | 
				
			||||||
 | 
					func (x DataBlockSize) Uncompressed() bool { return x>>31&1 != 0 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Setters.
 | 
				
			||||||
 | 
					func (x *DataBlockSize) sizeSet(v int) *DataBlockSize {
 | 
				
			||||||
 | 
						*x = *x&^0x7FFFFFFF | DataBlockSize(v)&0x7FFFFFFF
 | 
				
			||||||
 | 
						return x
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func (x *DataBlockSize) UncompressedSet(v bool) *DataBlockSize {
 | 
				
			||||||
 | 
						const b = 1 << 31
 | 
				
			||||||
 | 
						if v {
 | 
				
			||||||
 | 
							*x = *x&^b | b
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							*x &^= b
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return x
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -20,10 +20,7 @@ const (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// XXHZero represents an xxhash32 object with seed 0.
 | 
					// XXHZero represents an xxhash32 object with seed 0.
 | 
				
			||||||
type XXHZero struct {
 | 
					type XXHZero struct {
 | 
				
			||||||
	v1       uint32
 | 
						v        [4]uint32
 | 
				
			||||||
	v2       uint32
 | 
					 | 
				
			||||||
	v3       uint32
 | 
					 | 
				
			||||||
	v4       uint32
 | 
					 | 
				
			||||||
	totalLen uint64
 | 
						totalLen uint64
 | 
				
			||||||
	buf      [16]byte
 | 
						buf      [16]byte
 | 
				
			||||||
	bufused  int
 | 
						bufused  int
 | 
				
			||||||
@@ -38,10 +35,10 @@ func (xxh XXHZero) Sum(b []byte) []byte {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Reset resets the Hash to its initial state.
 | 
					// Reset resets the Hash to its initial state.
 | 
				
			||||||
func (xxh *XXHZero) Reset() {
 | 
					func (xxh *XXHZero) Reset() {
 | 
				
			||||||
	xxh.v1 = prime1plus2
 | 
						xxh.v[0] = prime1plus2
 | 
				
			||||||
	xxh.v2 = prime2
 | 
						xxh.v[1] = prime2
 | 
				
			||||||
	xxh.v3 = 0
 | 
						xxh.v[2] = 0
 | 
				
			||||||
	xxh.v4 = prime1minus
 | 
						xxh.v[3] = prime1minus
 | 
				
			||||||
	xxh.totalLen = 0
 | 
						xxh.totalLen = 0
 | 
				
			||||||
	xxh.bufused = 0
 | 
						xxh.bufused = 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -51,7 +48,7 @@ func (xxh *XXHZero) Size() int {
 | 
				
			|||||||
	return 4
 | 
						return 4
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// BlockSize gives the minimum number of bytes accepted by Write().
 | 
					// BlockSizeIndex gives the minimum number of bytes accepted by Write().
 | 
				
			||||||
func (xxh *XXHZero) BlockSize() int {
 | 
					func (xxh *XXHZero) BlockSize() int {
 | 
				
			||||||
	return 1
 | 
						return 1
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -74,44 +71,48 @@ func (xxh *XXHZero) Write(input []byte) (int, error) {
 | 
				
			|||||||
		return n, nil
 | 
							return n, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	p := 0
 | 
						var buf *[16]byte
 | 
				
			||||||
	// Causes compiler to work directly from registers instead of stack:
 | 
						if m != 0 {
 | 
				
			||||||
	v1, v2, v3, v4 := xxh.v1, xxh.v2, xxh.v3, xxh.v4
 | 
					 | 
				
			||||||
	if m > 0 {
 | 
					 | 
				
			||||||
		// some data left from previous update
 | 
							// some data left from previous update
 | 
				
			||||||
		copy(xxh.buf[xxh.bufused:], input[:r])
 | 
							buf = &xxh.buf
 | 
				
			||||||
		xxh.bufused += len(input) - r
 | 
							c := copy(buf[m:], input)
 | 
				
			||||||
 | 
							n -= c
 | 
				
			||||||
 | 
							input = input[c:]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						update(&xxh.v, buf, input)
 | 
				
			||||||
 | 
						xxh.bufused = copy(xxh.buf[:], input[n-n%16:])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// fast rotl(13)
 | 
						return n, nil
 | 
				
			||||||
		buf := xxh.buf[:16] // BCE hint.
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Portable version of update. This updates v by processing all of buf
 | 
				
			||||||
 | 
					// (if not nil) and all full 16-byte blocks of input.
 | 
				
			||||||
 | 
					func updateGo(v *[4]uint32, buf *[16]byte, input []byte) {
 | 
				
			||||||
 | 
						// Causes compiler to work directly from registers instead of stack:
 | 
				
			||||||
 | 
						v1, v2, v3, v4 := v[0], v[1], v[2], v[3]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if buf != nil {
 | 
				
			||||||
		v1 = rol13(v1+binary.LittleEndian.Uint32(buf[:])*prime2) * prime1
 | 
							v1 = rol13(v1+binary.LittleEndian.Uint32(buf[:])*prime2) * prime1
 | 
				
			||||||
		v2 = rol13(v2+binary.LittleEndian.Uint32(buf[4:])*prime2) * prime1
 | 
							v2 = rol13(v2+binary.LittleEndian.Uint32(buf[4:])*prime2) * prime1
 | 
				
			||||||
		v3 = rol13(v3+binary.LittleEndian.Uint32(buf[8:])*prime2) * prime1
 | 
							v3 = rol13(v3+binary.LittleEndian.Uint32(buf[8:])*prime2) * prime1
 | 
				
			||||||
		v4 = rol13(v4+binary.LittleEndian.Uint32(buf[12:])*prime2) * prime1
 | 
							v4 = rol13(v4+binary.LittleEndian.Uint32(buf[12:])*prime2) * prime1
 | 
				
			||||||
		p = r
 | 
					 | 
				
			||||||
		xxh.bufused = 0
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for n := n - 16; p <= n; p += 16 {
 | 
						for ; len(input) >= 16; input = input[16:] {
 | 
				
			||||||
		sub := input[p:][:16] //BCE hint for compiler
 | 
							sub := input[:16] //BCE hint for compiler
 | 
				
			||||||
		v1 = rol13(v1+binary.LittleEndian.Uint32(sub[:])*prime2) * prime1
 | 
							v1 = rol13(v1+binary.LittleEndian.Uint32(sub[:])*prime2) * prime1
 | 
				
			||||||
		v2 = rol13(v2+binary.LittleEndian.Uint32(sub[4:])*prime2) * prime1
 | 
							v2 = rol13(v2+binary.LittleEndian.Uint32(sub[4:])*prime2) * prime1
 | 
				
			||||||
		v3 = rol13(v3+binary.LittleEndian.Uint32(sub[8:])*prime2) * prime1
 | 
							v3 = rol13(v3+binary.LittleEndian.Uint32(sub[8:])*prime2) * prime1
 | 
				
			||||||
		v4 = rol13(v4+binary.LittleEndian.Uint32(sub[12:])*prime2) * prime1
 | 
							v4 = rol13(v4+binary.LittleEndian.Uint32(sub[12:])*prime2) * prime1
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	xxh.v1, xxh.v2, xxh.v3, xxh.v4 = v1, v2, v3, v4
 | 
						v[0], v[1], v[2], v[3] = v1, v2, v3, v4
 | 
				
			||||||
 | 
					 | 
				
			||||||
	copy(xxh.buf[xxh.bufused:], input[p:])
 | 
					 | 
				
			||||||
	xxh.bufused += len(input) - p
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return n, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Sum32 returns the 32 bits Hash value.
 | 
					// Sum32 returns the 32 bits Hash value.
 | 
				
			||||||
func (xxh *XXHZero) Sum32() uint32 {
 | 
					func (xxh *XXHZero) Sum32() uint32 {
 | 
				
			||||||
	h32 := uint32(xxh.totalLen)
 | 
						h32 := uint32(xxh.totalLen)
 | 
				
			||||||
	if h32 >= 16 {
 | 
						if h32 >= 16 {
 | 
				
			||||||
		h32 += rol1(xxh.v1) + rol7(xxh.v2) + rol12(xxh.v3) + rol18(xxh.v4)
 | 
							h32 += rol1(xxh.v[0]) + rol7(xxh.v[1]) + rol12(xxh.v[2]) + rol18(xxh.v[3])
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		h32 += prime5
 | 
							h32 += prime5
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -137,8 +138,8 @@ func (xxh *XXHZero) Sum32() uint32 {
 | 
				
			|||||||
	return h32
 | 
						return h32
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ChecksumZero returns the 32bits Hash value.
 | 
					// Portable version of ChecksumZero.
 | 
				
			||||||
func ChecksumZero(input []byte) uint32 {
 | 
					func checksumZeroGo(input []byte) uint32 {
 | 
				
			||||||
	n := len(input)
 | 
						n := len(input)
 | 
				
			||||||
	h32 := uint32(n)
 | 
						h32 := uint32(n)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -182,18 +183,6 @@ func ChecksumZero(input []byte) uint32 {
 | 
				
			|||||||
	return h32
 | 
						return h32
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint32Zero hashes x with seed 0.
 | 
					 | 
				
			||||||
func Uint32Zero(x uint32) uint32 {
 | 
					 | 
				
			||||||
	h := prime5 + 4 + x*prime3
 | 
					 | 
				
			||||||
	h = rol17(h) * prime4
 | 
					 | 
				
			||||||
	h ^= h >> 15
 | 
					 | 
				
			||||||
	h *= prime2
 | 
					 | 
				
			||||||
	h ^= h >> 13
 | 
					 | 
				
			||||||
	h *= prime3
 | 
					 | 
				
			||||||
	h ^= h >> 16
 | 
					 | 
				
			||||||
	return h
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func rol1(u uint32) uint32 {
 | 
					func rol1(u uint32) uint32 {
 | 
				
			||||||
	return u<<1 | u>>31
 | 
						return u<<1 | u>>31
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										11
									
								
								vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero_arm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero_arm.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					// +build !noasm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package xxh32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ChecksumZero returns the 32-bit hash of input.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//go:noescape
 | 
				
			||||||
 | 
					func ChecksumZero(input []byte) uint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:noescape
 | 
				
			||||||
 | 
					func update(v *[4]uint32, buf *[16]byte, input []byte)
 | 
				
			||||||
							
								
								
									
										259
									
								
								vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero_arm.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										259
									
								
								vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero_arm.s
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,259 @@
 | 
				
			|||||||
 | 
					// +build !noasm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define prime1		$2654435761
 | 
				
			||||||
 | 
					#define prime2		$2246822519
 | 
				
			||||||
 | 
					#define prime3		$3266489917
 | 
				
			||||||
 | 
					#define prime4		$668265263
 | 
				
			||||||
 | 
					#define prime5		$374761393
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define prime1plus2	$606290984
 | 
				
			||||||
 | 
					#define prime1minus	$1640531535
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Register allocation.
 | 
				
			||||||
 | 
					#define p	R0
 | 
				
			||||||
 | 
					#define n	R1
 | 
				
			||||||
 | 
					#define h	R2
 | 
				
			||||||
 | 
					#define v1	R2	// Alias for h.
 | 
				
			||||||
 | 
					#define v2	R3
 | 
				
			||||||
 | 
					#define v3	R4
 | 
				
			||||||
 | 
					#define v4	R5
 | 
				
			||||||
 | 
					#define x1	R6
 | 
				
			||||||
 | 
					#define x2	R7
 | 
				
			||||||
 | 
					#define x3	R8
 | 
				
			||||||
 | 
					#define x4	R9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// We need the primes in registers. The 16-byte loop only uses prime{1,2}.
 | 
				
			||||||
 | 
					#define prime1r	R11
 | 
				
			||||||
 | 
					#define prime2r	R12
 | 
				
			||||||
 | 
					#define prime3r	R3	// The rest can alias v{2-4}.
 | 
				
			||||||
 | 
					#define prime4r	R4
 | 
				
			||||||
 | 
					#define prime5r	R5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Update round macros. These read from and increment p.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define round16aligned			\
 | 
				
			||||||
 | 
						MOVM.IA.W (p), [x1, x2, x3, x4]	\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MULA x1, prime2r, v1, v1	\
 | 
				
			||||||
 | 
						MULA x2, prime2r, v2, v2	\
 | 
				
			||||||
 | 
						MULA x3, prime2r, v3, v3	\
 | 
				
			||||||
 | 
						MULA x4, prime2r, v4, v4	\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MOVW v1 @> 19, v1		\
 | 
				
			||||||
 | 
						MOVW v2 @> 19, v2		\
 | 
				
			||||||
 | 
						MOVW v3 @> 19, v3		\
 | 
				
			||||||
 | 
						MOVW v4 @> 19, v4		\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MUL prime1r, v1			\
 | 
				
			||||||
 | 
						MUL prime1r, v2			\
 | 
				
			||||||
 | 
						MUL prime1r, v3			\
 | 
				
			||||||
 | 
						MUL prime1r, v4			\
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define round16unaligned 		\
 | 
				
			||||||
 | 
						MOVBU.P  16(p), x1		\
 | 
				
			||||||
 | 
						MOVBU   -15(p), x2		\
 | 
				
			||||||
 | 
						ORR     x2 <<  8, x1		\
 | 
				
			||||||
 | 
						MOVBU   -14(p), x3		\
 | 
				
			||||||
 | 
						MOVBU   -13(p), x4		\
 | 
				
			||||||
 | 
						ORR     x4 <<  8, x3		\
 | 
				
			||||||
 | 
						ORR     x3 << 16, x1		\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MULA x1, prime2r, v1, v1	\
 | 
				
			||||||
 | 
						MOVW v1 @> 19, v1		\
 | 
				
			||||||
 | 
						MUL prime1r, v1			\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MOVBU -12(p), x1		\
 | 
				
			||||||
 | 
						MOVBU -11(p), x2		\
 | 
				
			||||||
 | 
						ORR   x2 <<  8, x1		\
 | 
				
			||||||
 | 
						MOVBU -10(p), x3		\
 | 
				
			||||||
 | 
						MOVBU  -9(p), x4		\
 | 
				
			||||||
 | 
						ORR   x4 <<  8, x3		\
 | 
				
			||||||
 | 
						ORR   x3 << 16, x1		\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MULA x1, prime2r, v2, v2	\
 | 
				
			||||||
 | 
						MOVW v2 @> 19, v2		\
 | 
				
			||||||
 | 
						MUL prime1r, v2			\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MOVBU -8(p), x1			\
 | 
				
			||||||
 | 
						MOVBU -7(p), x2			\
 | 
				
			||||||
 | 
						ORR   x2 <<  8, x1		\
 | 
				
			||||||
 | 
						MOVBU -6(p), x3			\
 | 
				
			||||||
 | 
						MOVBU -5(p), x4			\
 | 
				
			||||||
 | 
						ORR   x4 <<  8, x3		\
 | 
				
			||||||
 | 
						ORR   x3 << 16, x1		\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MULA x1, prime2r, v3, v3	\
 | 
				
			||||||
 | 
						MOVW v3 @> 19, v3		\
 | 
				
			||||||
 | 
						MUL prime1r, v3			\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MOVBU -4(p), x1			\
 | 
				
			||||||
 | 
						MOVBU -3(p), x2			\
 | 
				
			||||||
 | 
						ORR   x2 <<  8, x1		\
 | 
				
			||||||
 | 
						MOVBU -2(p), x3			\
 | 
				
			||||||
 | 
						MOVBU -1(p), x4			\
 | 
				
			||||||
 | 
						ORR   x4 <<  8, x3		\
 | 
				
			||||||
 | 
						ORR   x3 << 16, x1		\
 | 
				
			||||||
 | 
										\
 | 
				
			||||||
 | 
						MULA x1, prime2r, v4, v4	\
 | 
				
			||||||
 | 
						MOVW v4 @> 19, v4		\
 | 
				
			||||||
 | 
						MUL prime1r, v4			\
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// func ChecksumZero([]byte) uint32
 | 
				
			||||||
 | 
					TEXT ·ChecksumZero(SB), NOFRAME|NOSPLIT, $-4-16
 | 
				
			||||||
 | 
						MOVW input_base+0(FP), p
 | 
				
			||||||
 | 
						MOVW input_len+4(FP),  n
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVW prime1, prime1r
 | 
				
			||||||
 | 
						MOVW prime2, prime2r
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Set up h for n < 16. It's tempting to say {ADD prime5, n, h}
 | 
				
			||||||
 | 
						// here, but that's a pseudo-op that generates a load through R11.
 | 
				
			||||||
 | 
						MOVW prime5, prime5r
 | 
				
			||||||
 | 
						ADD  prime5r, n, h
 | 
				
			||||||
 | 
						CMP  $0, n
 | 
				
			||||||
 | 
						BEQ  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// We let n go negative so we can do comparisons with SUB.S
 | 
				
			||||||
 | 
						// instead of separate CMP.
 | 
				
			||||||
 | 
						SUB.S $16, n
 | 
				
			||||||
 | 
						BMI   loop16done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVW prime1plus2, v1
 | 
				
			||||||
 | 
						MOVW prime2,      v2
 | 
				
			||||||
 | 
						MOVW $0,          v3
 | 
				
			||||||
 | 
						MOVW prime1minus, v4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						TST $3, p
 | 
				
			||||||
 | 
						BNE loop16unaligned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop16aligned:
 | 
				
			||||||
 | 
						SUB.S $16, n
 | 
				
			||||||
 | 
						round16aligned
 | 
				
			||||||
 | 
						BPL loop16aligned
 | 
				
			||||||
 | 
						B   loop16finish
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop16unaligned:
 | 
				
			||||||
 | 
						SUB.S $16, n
 | 
				
			||||||
 | 
						round16unaligned
 | 
				
			||||||
 | 
						BPL loop16unaligned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop16finish:
 | 
				
			||||||
 | 
						MOVW v1 @> 31, h
 | 
				
			||||||
 | 
						ADD  v2 @> 25, h
 | 
				
			||||||
 | 
						ADD  v3 @> 20, h
 | 
				
			||||||
 | 
						ADD  v4 @> 14, h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// h += len(input) with v2 as temporary.
 | 
				
			||||||
 | 
						MOVW input_len+4(FP), v2
 | 
				
			||||||
 | 
						ADD  v2, h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop16done:
 | 
				
			||||||
 | 
						ADD $16, n	// Restore number of bytes left.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SUB.S $4, n
 | 
				
			||||||
 | 
						MOVW  prime3, prime3r
 | 
				
			||||||
 | 
						BMI   loop4done
 | 
				
			||||||
 | 
						MOVW  prime4, prime4r
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						TST $3, p
 | 
				
			||||||
 | 
						BNE loop4unaligned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop4aligned:
 | 
				
			||||||
 | 
						SUB.S $4, n
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVW.P 4(p), x1
 | 
				
			||||||
 | 
						MULA   prime3r, x1, h, h
 | 
				
			||||||
 | 
						MOVW   h @> 15, h
 | 
				
			||||||
 | 
						MUL    prime4r, h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						BPL loop4aligned
 | 
				
			||||||
 | 
						B   loop4done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop4unaligned:
 | 
				
			||||||
 | 
						SUB.S $4, n
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVBU.P  4(p), x1
 | 
				
			||||||
 | 
						MOVBU   -3(p), x2
 | 
				
			||||||
 | 
						ORR     x2 <<  8, x1
 | 
				
			||||||
 | 
						MOVBU   -2(p), x3
 | 
				
			||||||
 | 
						ORR     x3 << 16, x1
 | 
				
			||||||
 | 
						MOVBU   -1(p), x4
 | 
				
			||||||
 | 
						ORR     x4 << 24, x1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MULA prime3r, x1, h, h
 | 
				
			||||||
 | 
						MOVW h @> 15, h
 | 
				
			||||||
 | 
						MUL  prime4r, h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						BPL loop4unaligned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop4done:
 | 
				
			||||||
 | 
						ADD.S $4, n	// Restore number of bytes left.
 | 
				
			||||||
 | 
						BEQ   end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVW prime5, prime5r
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop1:
 | 
				
			||||||
 | 
						SUB.S $1, n
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVBU.P 1(p), x1
 | 
				
			||||||
 | 
						MULA    prime5r, x1, h, h
 | 
				
			||||||
 | 
						MOVW    h @> 21, h
 | 
				
			||||||
 | 
						MUL     prime1r, h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						BNE loop1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					end:
 | 
				
			||||||
 | 
						MOVW prime3, prime3r
 | 
				
			||||||
 | 
						EOR  h >> 15, h
 | 
				
			||||||
 | 
						MUL  prime2r, h
 | 
				
			||||||
 | 
						EOR  h >> 13, h
 | 
				
			||||||
 | 
						MUL  prime3r, h
 | 
				
			||||||
 | 
						EOR  h >> 16, h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVW h, ret+12(FP)
 | 
				
			||||||
 | 
						RET
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// func update(v *[4]uint64, buf *[16]byte, p []byte)
 | 
				
			||||||
 | 
					TEXT ·update(SB), NOFRAME|NOSPLIT, $-4-20
 | 
				
			||||||
 | 
						MOVW    v+0(FP), p
 | 
				
			||||||
 | 
						MOVM.IA (p), [v1, v2, v3, v4]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						MOVW prime1, prime1r
 | 
				
			||||||
 | 
						MOVW prime2, prime2r
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Process buf, if not nil.
 | 
				
			||||||
 | 
						MOVW buf+4(FP), p
 | 
				
			||||||
 | 
						CMP  $0, p
 | 
				
			||||||
 | 
						BEQ  noBuffered
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						round16aligned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					noBuffered:
 | 
				
			||||||
 | 
						MOVW input_base +8(FP), p
 | 
				
			||||||
 | 
						MOVW input_len +12(FP), n
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SUB.S $16, n
 | 
				
			||||||
 | 
						BMI   end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						TST $3, p
 | 
				
			||||||
 | 
						BNE loop16unaligned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop16aligned:
 | 
				
			||||||
 | 
						SUB.S $16, n
 | 
				
			||||||
 | 
						round16aligned
 | 
				
			||||||
 | 
						BPL loop16aligned
 | 
				
			||||||
 | 
						B   end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					loop16unaligned:
 | 
				
			||||||
 | 
						SUB.S $16, n
 | 
				
			||||||
 | 
						round16unaligned
 | 
				
			||||||
 | 
						BPL loop16unaligned
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					end:
 | 
				
			||||||
 | 
						MOVW    v+0(FP), p
 | 
				
			||||||
 | 
						MOVM.IA [v1, v2, v3, v4], (p)
 | 
				
			||||||
 | 
						RET
 | 
				
			||||||
							
								
								
									
										10
									
								
								vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero_other.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/pierrec/lz4/v4/internal/xxh32/xxh32zero_other.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					// +build !arm noasm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package xxh32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ChecksumZero returns the 32-bit hash of input.
 | 
				
			||||||
 | 
					func ChecksumZero(input []byte) uint32 { return checksumZeroGo(input) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func update(v *[4]uint32, buf *[16]byte, input []byte) {
 | 
				
			||||||
 | 
						updateGo(v, buf, input)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										147
									
								
								vendor/github.com/pierrec/lz4/v4/lz4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								vendor/github.com/pierrec/lz4/v4/lz4.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,147 @@
 | 
				
			|||||||
 | 
					// Package lz4 implements reading and writing lz4 compressed data.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The package supports both the LZ4 stream format,
 | 
				
			||||||
 | 
					// as specified in http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html,
 | 
				
			||||||
 | 
					// and the LZ4 block format, defined at
 | 
				
			||||||
 | 
					// http://fastcompression.blogspot.fr/2011/05/lz4-explained.html.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// See https://github.com/lz4/lz4 for the reference C implementation.
 | 
				
			||||||
 | 
					package lz4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4block"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4errors"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _() {
 | 
				
			||||||
 | 
						// Safety checks for duplicated elements.
 | 
				
			||||||
 | 
						var x [1]struct{}
 | 
				
			||||||
 | 
						_ = x[lz4block.CompressionLevel(Fast)-lz4block.Fast]
 | 
				
			||||||
 | 
						_ = x[Block64Kb-BlockSize(lz4block.Block64Kb)]
 | 
				
			||||||
 | 
						_ = x[Block256Kb-BlockSize(lz4block.Block256Kb)]
 | 
				
			||||||
 | 
						_ = x[Block1Mb-BlockSize(lz4block.Block1Mb)]
 | 
				
			||||||
 | 
						_ = x[Block4Mb-BlockSize(lz4block.Block4Mb)]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CompressBlockBound returns the maximum size of a given buffer of size n, when not compressible.
 | 
				
			||||||
 | 
					func CompressBlockBound(n int) int {
 | 
				
			||||||
 | 
						return lz4block.CompressBlockBound(n)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UncompressBlock uncompresses the source buffer into the destination one,
 | 
				
			||||||
 | 
					// and returns the uncompressed size.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The destination buffer must be sized appropriately.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// An error is returned if the source data is invalid or the destination buffer is too small.
 | 
				
			||||||
 | 
					func UncompressBlock(src, dst []byte) (int, error) {
 | 
				
			||||||
 | 
						return lz4block.UncompressBlock(src, dst)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// A Compressor compresses data into the LZ4 block format.
 | 
				
			||||||
 | 
					// It uses a fast compression algorithm.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// A Compressor is not safe for concurrent use by multiple goroutines.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Use a Writer to compress into the LZ4 stream format.
 | 
				
			||||||
 | 
					type Compressor struct{ c lz4block.Compressor }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CompressBlock compresses the source buffer src into the destination dst.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If compression is successful, the first return value is the size of the
 | 
				
			||||||
 | 
					// compressed data, which is always >0.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If dst has length at least CompressBlockBound(len(src)), compression always
 | 
				
			||||||
 | 
					// succeeds. Otherwise, the first return value is zero. The error return is
 | 
				
			||||||
 | 
					// non-nil if the compressed data does not fit in dst, but it might fit in a
 | 
				
			||||||
 | 
					// larger buffer that is still smaller than CompressBlockBound(len(src)). The
 | 
				
			||||||
 | 
					// return value (0, nil) means the data is likely incompressible and a buffer
 | 
				
			||||||
 | 
					// of length CompressBlockBound(len(src)) should be passed in.
 | 
				
			||||||
 | 
					func (c *Compressor) CompressBlock(src, dst []byte) (int, error) {
 | 
				
			||||||
 | 
						return c.c.CompressBlock(src, dst)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CompressBlock compresses the source buffer into the destination one.
 | 
				
			||||||
 | 
					// This is the fast version of LZ4 compression and also the default one.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The argument hashTable is scratch space for a hash table used by the
 | 
				
			||||||
 | 
					// compressor. If provided, it should have length at least 1<<16. If it is
 | 
				
			||||||
 | 
					// shorter (or nil), CompressBlock allocates its own hash table.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The size of the compressed data is returned.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If the destination buffer size is lower than CompressBlockBound and
 | 
				
			||||||
 | 
					// the compressed size is 0 and no error, then the data is incompressible.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// An error is returned if the destination buffer is too small.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CompressBlock is equivalent to Compressor.CompressBlock.
 | 
				
			||||||
 | 
					// The final argument is ignored and should be set to nil.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This function is deprecated. Use a Compressor instead.
 | 
				
			||||||
 | 
					func CompressBlock(src, dst []byte, _ []int) (int, error) {
 | 
				
			||||||
 | 
						return lz4block.CompressBlock(src, dst)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// A CompressorHC compresses data into the LZ4 block format.
 | 
				
			||||||
 | 
					// Its compression ratio is potentially better than that of a Compressor,
 | 
				
			||||||
 | 
					// but it is also slower and requires more memory.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// A Compressor is not safe for concurrent use by multiple goroutines.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Use a Writer to compress into the LZ4 stream format.
 | 
				
			||||||
 | 
					type CompressorHC struct {
 | 
				
			||||||
 | 
						// Level is the maximum search depth for compression.
 | 
				
			||||||
 | 
						// Values <= 0 mean no maximum.
 | 
				
			||||||
 | 
						Level CompressionLevel
 | 
				
			||||||
 | 
						c     lz4block.CompressorHC
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CompressBlock compresses the source buffer src into the destination dst.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If compression is successful, the first return value is the size of the
 | 
				
			||||||
 | 
					// compressed data, which is always >0.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// If dst has length at least CompressBlockBound(len(src)), compression always
 | 
				
			||||||
 | 
					// succeeds. Otherwise, the first return value is zero. The error return is
 | 
				
			||||||
 | 
					// non-nil if the compressed data does not fit in dst, but it might fit in a
 | 
				
			||||||
 | 
					// larger buffer that is still smaller than CompressBlockBound(len(src)). The
 | 
				
			||||||
 | 
					// return value (0, nil) means the data is likely incompressible and a buffer
 | 
				
			||||||
 | 
					// of length CompressBlockBound(len(src)) should be passed in.
 | 
				
			||||||
 | 
					func (c *CompressorHC) CompressBlock(src, dst []byte) (int, error) {
 | 
				
			||||||
 | 
						return c.c.CompressBlock(src, dst, lz4block.CompressionLevel(c.Level))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CompressBlockHC is equivalent to CompressorHC.CompressBlock.
 | 
				
			||||||
 | 
					// The final two arguments are ignored and should be set to nil.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This function is deprecated. Use a CompressorHC instead.
 | 
				
			||||||
 | 
					func CompressBlockHC(src, dst []byte, depth CompressionLevel, _, _ []int) (int, error) {
 | 
				
			||||||
 | 
						return lz4block.CompressBlockHC(src, dst, lz4block.CompressionLevel(depth))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// ErrInvalidSourceShortBuffer is returned by UncompressBlock or CompressBLock when a compressed
 | 
				
			||||||
 | 
						// block is corrupted or the destination buffer is not large enough for the uncompressed data.
 | 
				
			||||||
 | 
						ErrInvalidSourceShortBuffer = lz4errors.ErrInvalidSourceShortBuffer
 | 
				
			||||||
 | 
						// ErrInvalidFrame is returned when reading an invalid LZ4 archive.
 | 
				
			||||||
 | 
						ErrInvalidFrame = lz4errors.ErrInvalidFrame
 | 
				
			||||||
 | 
						// ErrInternalUnhandledState is an internal error.
 | 
				
			||||||
 | 
						ErrInternalUnhandledState = lz4errors.ErrInternalUnhandledState
 | 
				
			||||||
 | 
						// ErrInvalidHeaderChecksum is returned when reading a frame.
 | 
				
			||||||
 | 
						ErrInvalidHeaderChecksum = lz4errors.ErrInvalidHeaderChecksum
 | 
				
			||||||
 | 
						// ErrInvalidBlockChecksum is returned when reading a frame.
 | 
				
			||||||
 | 
						ErrInvalidBlockChecksum = lz4errors.ErrInvalidBlockChecksum
 | 
				
			||||||
 | 
						// ErrInvalidFrameChecksum is returned when reading a frame.
 | 
				
			||||||
 | 
						ErrInvalidFrameChecksum = lz4errors.ErrInvalidFrameChecksum
 | 
				
			||||||
 | 
						// ErrOptionInvalidCompressionLevel is returned when the supplied compression level is invalid.
 | 
				
			||||||
 | 
						ErrOptionInvalidCompressionLevel = lz4errors.ErrOptionInvalidCompressionLevel
 | 
				
			||||||
 | 
						// ErrOptionClosedOrError is returned when an option is applied to a closed or in error object.
 | 
				
			||||||
 | 
						ErrOptionClosedOrError = lz4errors.ErrOptionClosedOrError
 | 
				
			||||||
 | 
						// ErrOptionInvalidBlockSize is returned when
 | 
				
			||||||
 | 
						ErrOptionInvalidBlockSize = lz4errors.ErrOptionInvalidBlockSize
 | 
				
			||||||
 | 
						// ErrOptionNotApplicable is returned when trying to apply an option to an object not supporting it.
 | 
				
			||||||
 | 
						ErrOptionNotApplicable = lz4errors.ErrOptionNotApplicable
 | 
				
			||||||
 | 
						// ErrWriterNotClosed is returned when attempting to reset an unclosed writer.
 | 
				
			||||||
 | 
						ErrWriterNotClosed = lz4errors.ErrWriterNotClosed
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										213
									
								
								vendor/github.com/pierrec/lz4/v4/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										213
									
								
								vendor/github.com/pierrec/lz4/v4/options.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,213 @@
 | 
				
			|||||||
 | 
					package lz4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4block"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4errors"
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
 | 
						"runtime"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:generate go run golang.org/x/tools/cmd/stringer -type=BlockSize,CompressionLevel -output options_gen.go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type (
 | 
				
			||||||
 | 
						applier interface {
 | 
				
			||||||
 | 
							Apply(...Option) error
 | 
				
			||||||
 | 
							private()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Option defines the parameters to setup an LZ4 Writer or Reader.
 | 
				
			||||||
 | 
						Option func(applier) error
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// String returns a string representation of the option with its parameter(s).
 | 
				
			||||||
 | 
					func (o Option) String() string {
 | 
				
			||||||
 | 
						return o(nil).Error()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Default options.
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						DefaultBlockSizeOption = BlockSizeOption(Block4Mb)
 | 
				
			||||||
 | 
						DefaultChecksumOption  = ChecksumOption(true)
 | 
				
			||||||
 | 
						DefaultConcurrency     = ConcurrencyOption(1)
 | 
				
			||||||
 | 
						defaultOnBlockDone     = OnBlockDoneOption(nil)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						Block64Kb BlockSize = 1 << (16 + iota*2)
 | 
				
			||||||
 | 
						Block256Kb
 | 
				
			||||||
 | 
						Block1Mb
 | 
				
			||||||
 | 
						Block4Mb
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// BlockSizeIndex defines the size of the blocks to be compressed.
 | 
				
			||||||
 | 
					type BlockSize uint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// BlockSizeOption defines the maximum size of compressed blocks (default=Block4Mb).
 | 
				
			||||||
 | 
					func BlockSizeOption(size BlockSize) Option {
 | 
				
			||||||
 | 
						return func(a applier) error {
 | 
				
			||||||
 | 
							switch w := a.(type) {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
								s := fmt.Sprintf("BlockSizeOption(%s)", size)
 | 
				
			||||||
 | 
								return lz4errors.Error(s)
 | 
				
			||||||
 | 
							case *Writer:
 | 
				
			||||||
 | 
								size := uint32(size)
 | 
				
			||||||
 | 
								if !lz4block.IsValid(size) {
 | 
				
			||||||
 | 
									return fmt.Errorf("%w: %d", lz4errors.ErrOptionInvalidBlockSize, size)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								w.frame.Descriptor.Flags.BlockSizeIndexSet(lz4block.Index(size))
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionNotApplicable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// BlockChecksumOption enables or disables block checksum (default=false).
 | 
				
			||||||
 | 
					func BlockChecksumOption(flag bool) Option {
 | 
				
			||||||
 | 
						return func(a applier) error {
 | 
				
			||||||
 | 
							switch w := a.(type) {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
								s := fmt.Sprintf("BlockChecksumOption(%v)", flag)
 | 
				
			||||||
 | 
								return lz4errors.Error(s)
 | 
				
			||||||
 | 
							case *Writer:
 | 
				
			||||||
 | 
								w.frame.Descriptor.Flags.BlockChecksumSet(flag)
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionNotApplicable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ChecksumOption enables/disables all blocks or content checksum (default=true).
 | 
				
			||||||
 | 
					func ChecksumOption(flag bool) Option {
 | 
				
			||||||
 | 
						return func(a applier) error {
 | 
				
			||||||
 | 
							switch w := a.(type) {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
								s := fmt.Sprintf("ChecksumOption(%v)", flag)
 | 
				
			||||||
 | 
								return lz4errors.Error(s)
 | 
				
			||||||
 | 
							case *Writer:
 | 
				
			||||||
 | 
								w.frame.Descriptor.Flags.ContentChecksumSet(flag)
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionNotApplicable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SizeOption sets the size of the original uncompressed data (default=0). It is useful to know the size of the
 | 
				
			||||||
 | 
					// whole uncompressed data stream.
 | 
				
			||||||
 | 
					func SizeOption(size uint64) Option {
 | 
				
			||||||
 | 
						return func(a applier) error {
 | 
				
			||||||
 | 
							switch w := a.(type) {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
								s := fmt.Sprintf("SizeOption(%d)", size)
 | 
				
			||||||
 | 
								return lz4errors.Error(s)
 | 
				
			||||||
 | 
							case *Writer:
 | 
				
			||||||
 | 
								w.frame.Descriptor.Flags.SizeSet(size > 0)
 | 
				
			||||||
 | 
								w.frame.Descriptor.ContentSize = size
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionNotApplicable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ConcurrencyOption sets the number of go routines used for compression.
 | 
				
			||||||
 | 
					// If n <= 0, then the output of runtime.GOMAXPROCS(0) is used.
 | 
				
			||||||
 | 
					func ConcurrencyOption(n int) Option {
 | 
				
			||||||
 | 
						if n <= 0 {
 | 
				
			||||||
 | 
							n = runtime.GOMAXPROCS(0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return func(a applier) error {
 | 
				
			||||||
 | 
							switch rw := a.(type) {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
								s := fmt.Sprintf("ConcurrencyOption(%d)", n)
 | 
				
			||||||
 | 
								return lz4errors.Error(s)
 | 
				
			||||||
 | 
							case *Writer:
 | 
				
			||||||
 | 
								rw.num = n
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							case *Reader:
 | 
				
			||||||
 | 
								rw.num = n
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionNotApplicable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CompressionLevel defines the level of compression to use. The higher the better, but slower, compression.
 | 
				
			||||||
 | 
					type CompressionLevel uint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						Fast   CompressionLevel = 0
 | 
				
			||||||
 | 
						Level1 CompressionLevel = 1 << (8 + iota)
 | 
				
			||||||
 | 
						Level2
 | 
				
			||||||
 | 
						Level3
 | 
				
			||||||
 | 
						Level4
 | 
				
			||||||
 | 
						Level5
 | 
				
			||||||
 | 
						Level6
 | 
				
			||||||
 | 
						Level7
 | 
				
			||||||
 | 
						Level8
 | 
				
			||||||
 | 
						Level9
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CompressionLevelOption defines the compression level (default=Fast).
 | 
				
			||||||
 | 
					func CompressionLevelOption(level CompressionLevel) Option {
 | 
				
			||||||
 | 
						return func(a applier) error {
 | 
				
			||||||
 | 
							switch w := a.(type) {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
								s := fmt.Sprintf("CompressionLevelOption(%s)", level)
 | 
				
			||||||
 | 
								return lz4errors.Error(s)
 | 
				
			||||||
 | 
							case *Writer:
 | 
				
			||||||
 | 
								switch level {
 | 
				
			||||||
 | 
								case Fast, Level1, Level2, Level3, Level4, Level5, Level6, Level7, Level8, Level9:
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									return fmt.Errorf("%w: %d", lz4errors.ErrOptionInvalidCompressionLevel, level)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								w.level = lz4block.CompressionLevel(level)
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionNotApplicable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func onBlockDone(int) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// OnBlockDoneOption is triggered when a block has been processed. For a Writer, it is when is has been compressed,
 | 
				
			||||||
 | 
					// for a Reader, it is when it has been uncompressed.
 | 
				
			||||||
 | 
					func OnBlockDoneOption(handler func(size int)) Option {
 | 
				
			||||||
 | 
						if handler == nil {
 | 
				
			||||||
 | 
							handler = onBlockDone
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return func(a applier) error {
 | 
				
			||||||
 | 
							switch rw := a.(type) {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
								s := fmt.Sprintf("OnBlockDoneOption(%s)", reflect.TypeOf(handler).String())
 | 
				
			||||||
 | 
								return lz4errors.Error(s)
 | 
				
			||||||
 | 
							case *Writer:
 | 
				
			||||||
 | 
								rw.handler = handler
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							case *Reader:
 | 
				
			||||||
 | 
								rw.handler = handler
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionNotApplicable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// LegacyOption provides support for writing LZ4 frames in the legacy format.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// See https://github.com/lz4/lz4/blob/dev/doc/lz4_Frame_format.md#legacy-frame.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// NB. compressed Linux kernel images use a tweaked LZ4 legacy format where
 | 
				
			||||||
 | 
					// the compressed stream is followed by the original (uncompressed) size of
 | 
				
			||||||
 | 
					// the kernel (https://events.static.linuxfound.org/sites/events/files/lcjpcojp13_klee.pdf).
 | 
				
			||||||
 | 
					// This is also supported as a special case.
 | 
				
			||||||
 | 
					func LegacyOption(legacy bool) Option {
 | 
				
			||||||
 | 
						return func(a applier) error {
 | 
				
			||||||
 | 
							switch rw := a.(type) {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
								s := fmt.Sprintf("LegacyOption(%v)", legacy)
 | 
				
			||||||
 | 
								return lz4errors.Error(s)
 | 
				
			||||||
 | 
							case *Writer:
 | 
				
			||||||
 | 
								rw.legacy = legacy
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionNotApplicable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										92
									
								
								vendor/github.com/pierrec/lz4/v4/options_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								vendor/github.com/pierrec/lz4/v4/options_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,92 @@
 | 
				
			|||||||
 | 
					// Code generated by "stringer -type=BlockSize,CompressionLevel -output options_gen.go"; DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package lz4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _() {
 | 
				
			||||||
 | 
						// An "invalid array index" compiler error signifies that the constant values have changed.
 | 
				
			||||||
 | 
						// Re-run the stringer command to generate them again.
 | 
				
			||||||
 | 
						var x [1]struct{}
 | 
				
			||||||
 | 
						_ = x[Block64Kb-65536]
 | 
				
			||||||
 | 
						_ = x[Block256Kb-262144]
 | 
				
			||||||
 | 
						_ = x[Block1Mb-1048576]
 | 
				
			||||||
 | 
						_ = x[Block4Mb-4194304]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						_BlockSize_name_0 = "Block64Kb"
 | 
				
			||||||
 | 
						_BlockSize_name_1 = "Block256Kb"
 | 
				
			||||||
 | 
						_BlockSize_name_2 = "Block1Mb"
 | 
				
			||||||
 | 
						_BlockSize_name_3 = "Block4Mb"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (i BlockSize) String() string {
 | 
				
			||||||
 | 
						switch {
 | 
				
			||||||
 | 
						case i == 65536:
 | 
				
			||||||
 | 
							return _BlockSize_name_0
 | 
				
			||||||
 | 
						case i == 262144:
 | 
				
			||||||
 | 
							return _BlockSize_name_1
 | 
				
			||||||
 | 
						case i == 1048576:
 | 
				
			||||||
 | 
							return _BlockSize_name_2
 | 
				
			||||||
 | 
						case i == 4194304:
 | 
				
			||||||
 | 
							return _BlockSize_name_3
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return "BlockSize(" + strconv.FormatInt(int64(i), 10) + ")"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					func _() {
 | 
				
			||||||
 | 
						// An "invalid array index" compiler error signifies that the constant values have changed.
 | 
				
			||||||
 | 
						// Re-run the stringer command to generate them again.
 | 
				
			||||||
 | 
						var x [1]struct{}
 | 
				
			||||||
 | 
						_ = x[Fast-0]
 | 
				
			||||||
 | 
						_ = x[Level1-512]
 | 
				
			||||||
 | 
						_ = x[Level2-1024]
 | 
				
			||||||
 | 
						_ = x[Level3-2048]
 | 
				
			||||||
 | 
						_ = x[Level4-4096]
 | 
				
			||||||
 | 
						_ = x[Level5-8192]
 | 
				
			||||||
 | 
						_ = x[Level6-16384]
 | 
				
			||||||
 | 
						_ = x[Level7-32768]
 | 
				
			||||||
 | 
						_ = x[Level8-65536]
 | 
				
			||||||
 | 
						_ = x[Level9-131072]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						_CompressionLevel_name_0 = "Fast"
 | 
				
			||||||
 | 
						_CompressionLevel_name_1 = "Level1"
 | 
				
			||||||
 | 
						_CompressionLevel_name_2 = "Level2"
 | 
				
			||||||
 | 
						_CompressionLevel_name_3 = "Level3"
 | 
				
			||||||
 | 
						_CompressionLevel_name_4 = "Level4"
 | 
				
			||||||
 | 
						_CompressionLevel_name_5 = "Level5"
 | 
				
			||||||
 | 
						_CompressionLevel_name_6 = "Level6"
 | 
				
			||||||
 | 
						_CompressionLevel_name_7 = "Level7"
 | 
				
			||||||
 | 
						_CompressionLevel_name_8 = "Level8"
 | 
				
			||||||
 | 
						_CompressionLevel_name_9 = "Level9"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (i CompressionLevel) String() string {
 | 
				
			||||||
 | 
						switch {
 | 
				
			||||||
 | 
						case i == 0:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_0
 | 
				
			||||||
 | 
						case i == 512:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_1
 | 
				
			||||||
 | 
						case i == 1024:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_2
 | 
				
			||||||
 | 
						case i == 2048:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_3
 | 
				
			||||||
 | 
						case i == 4096:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_4
 | 
				
			||||||
 | 
						case i == 8192:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_5
 | 
				
			||||||
 | 
						case i == 16384:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_6
 | 
				
			||||||
 | 
						case i == 32768:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_7
 | 
				
			||||||
 | 
						case i == 65536:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_8
 | 
				
			||||||
 | 
						case i == 131072:
 | 
				
			||||||
 | 
							return _CompressionLevel_name_9
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return "CompressionLevel(" + strconv.FormatInt(int64(i), 10) + ")"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										243
									
								
								vendor/github.com/pierrec/lz4/v4/reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								vendor/github.com/pierrec/lz4/v4/reader.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,243 @@
 | 
				
			|||||||
 | 
					package lz4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4block"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4errors"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4stream"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var readerStates = []aState{
 | 
				
			||||||
 | 
						noState:     newState,
 | 
				
			||||||
 | 
						errorState:  newState,
 | 
				
			||||||
 | 
						newState:    readState,
 | 
				
			||||||
 | 
						readState:   closedState,
 | 
				
			||||||
 | 
						closedState: newState,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewReader returns a new LZ4 frame decoder.
 | 
				
			||||||
 | 
					func NewReader(r io.Reader) *Reader {
 | 
				
			||||||
 | 
						return newReader(r, false)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func newReader(r io.Reader, legacy bool) *Reader {
 | 
				
			||||||
 | 
						zr := &Reader{frame: lz4stream.NewFrame()}
 | 
				
			||||||
 | 
						zr.state.init(readerStates)
 | 
				
			||||||
 | 
						_ = zr.Apply(DefaultConcurrency, defaultOnBlockDone)
 | 
				
			||||||
 | 
						zr.Reset(r)
 | 
				
			||||||
 | 
						return zr
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Reader allows reading an LZ4 stream.
 | 
				
			||||||
 | 
					type Reader struct {
 | 
				
			||||||
 | 
						state   _State
 | 
				
			||||||
 | 
						src     io.Reader        // source reader
 | 
				
			||||||
 | 
						num     int              // concurrency level
 | 
				
			||||||
 | 
						frame   *lz4stream.Frame // frame being read
 | 
				
			||||||
 | 
						data    []byte           // block buffer allocated in non concurrent mode
 | 
				
			||||||
 | 
						reads   chan []byte      // pending data
 | 
				
			||||||
 | 
						idx     int              // size of pending data
 | 
				
			||||||
 | 
						handler func(int)
 | 
				
			||||||
 | 
						cum     uint32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*Reader) private() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *Reader) Apply(options ...Option) (err error) {
 | 
				
			||||||
 | 
						defer r.state.check(&err)
 | 
				
			||||||
 | 
						switch r.state.state {
 | 
				
			||||||
 | 
						case newState:
 | 
				
			||||||
 | 
						case errorState:
 | 
				
			||||||
 | 
							return r.state.err
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionClosedOrError
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, o := range options {
 | 
				
			||||||
 | 
							if err = o(r); err != nil {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Size returns the size of the underlying uncompressed data, if set in the stream.
 | 
				
			||||||
 | 
					func (r *Reader) Size() int {
 | 
				
			||||||
 | 
						switch r.state.state {
 | 
				
			||||||
 | 
						case readState, closedState:
 | 
				
			||||||
 | 
							if r.frame.Descriptor.Flags.Size() {
 | 
				
			||||||
 | 
								return int(r.frame.Descriptor.ContentSize)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *Reader) isNotConcurrent() bool {
 | 
				
			||||||
 | 
						return r.num == 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *Reader) init() error {
 | 
				
			||||||
 | 
						data, err := r.frame.InitR(r.src, r.num)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						r.reads = data
 | 
				
			||||||
 | 
						r.idx = 0
 | 
				
			||||||
 | 
						size := r.frame.Descriptor.Flags.BlockSizeIndex()
 | 
				
			||||||
 | 
						r.data = size.Get()
 | 
				
			||||||
 | 
						r.cum = 0
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *Reader) Read(buf []byte) (n int, err error) {
 | 
				
			||||||
 | 
						defer r.state.check(&err)
 | 
				
			||||||
 | 
						switch r.state.state {
 | 
				
			||||||
 | 
						case readState:
 | 
				
			||||||
 | 
						case closedState, errorState:
 | 
				
			||||||
 | 
							return 0, r.state.err
 | 
				
			||||||
 | 
						case newState:
 | 
				
			||||||
 | 
							// First initialization.
 | 
				
			||||||
 | 
							if err = r.init(); r.state.next(err) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return 0, r.state.fail()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for len(buf) > 0 {
 | 
				
			||||||
 | 
							var bn int
 | 
				
			||||||
 | 
							if r.idx == 0 {
 | 
				
			||||||
 | 
								if r.isNotConcurrent() {
 | 
				
			||||||
 | 
									bn, err = r.read(buf)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									lz4block.Put(r.data)
 | 
				
			||||||
 | 
									r.data = <-r.reads
 | 
				
			||||||
 | 
									if len(r.data) == 0 {
 | 
				
			||||||
 | 
										// No uncompressed data: something went wrong or we are done.
 | 
				
			||||||
 | 
										err = r.frame.Blocks.ErrorR()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								switch err {
 | 
				
			||||||
 | 
								case nil:
 | 
				
			||||||
 | 
								case io.EOF:
 | 
				
			||||||
 | 
									if er := r.frame.CloseR(r.src); er != nil {
 | 
				
			||||||
 | 
										err = er
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									lz4block.Put(r.data)
 | 
				
			||||||
 | 
									r.data = nil
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if bn == 0 {
 | 
				
			||||||
 | 
								// Fill buf with buffered data.
 | 
				
			||||||
 | 
								bn = copy(buf, r.data[r.idx:])
 | 
				
			||||||
 | 
								r.idx += bn
 | 
				
			||||||
 | 
								if r.idx == len(r.data) {
 | 
				
			||||||
 | 
									// All data read, get ready for the next Read.
 | 
				
			||||||
 | 
									r.idx = 0
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							buf = buf[bn:]
 | 
				
			||||||
 | 
							n += bn
 | 
				
			||||||
 | 
							r.handler(bn)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// read uncompresses the next block as follow:
 | 
				
			||||||
 | 
					// - if buf has enough room, the block is uncompressed into it directly
 | 
				
			||||||
 | 
					//   and the lenght of used space is returned
 | 
				
			||||||
 | 
					// - else, the uncompress data is stored in r.data and 0 is returned
 | 
				
			||||||
 | 
					func (r *Reader) read(buf []byte) (int, error) {
 | 
				
			||||||
 | 
						block := r.frame.Blocks.Block
 | 
				
			||||||
 | 
						_, err := block.Read(r.frame, r.src, r.cum)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var direct bool
 | 
				
			||||||
 | 
						dst := r.data[:cap(r.data)]
 | 
				
			||||||
 | 
						if len(buf) >= len(dst) {
 | 
				
			||||||
 | 
							// Uncompress directly into buf.
 | 
				
			||||||
 | 
							direct = true
 | 
				
			||||||
 | 
							dst = buf
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dst, err = block.Uncompress(r.frame, dst, true)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						r.cum += uint32(len(dst))
 | 
				
			||||||
 | 
						if direct {
 | 
				
			||||||
 | 
							return len(dst), nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						r.data = dst
 | 
				
			||||||
 | 
						return 0, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Reset clears the state of the Reader r such that it is equivalent to its
 | 
				
			||||||
 | 
					// initial state from NewReader, but instead writing to writer.
 | 
				
			||||||
 | 
					// No access to reader is performed.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// w.Close must be called before Reset.
 | 
				
			||||||
 | 
					func (r *Reader) Reset(reader io.Reader) {
 | 
				
			||||||
 | 
						if r.data != nil {
 | 
				
			||||||
 | 
							lz4block.Put(r.data)
 | 
				
			||||||
 | 
							r.data = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						r.frame.Reset(r.num)
 | 
				
			||||||
 | 
						r.state.reset()
 | 
				
			||||||
 | 
						r.src = reader
 | 
				
			||||||
 | 
						r.reads = nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// WriteTo efficiently uncompresses the data from the Reader underlying source to w.
 | 
				
			||||||
 | 
					func (r *Reader) WriteTo(w io.Writer) (n int64, err error) {
 | 
				
			||||||
 | 
						switch r.state.state {
 | 
				
			||||||
 | 
						case closedState, errorState:
 | 
				
			||||||
 | 
							return 0, r.state.err
 | 
				
			||||||
 | 
						case newState:
 | 
				
			||||||
 | 
							if err = r.init(); r.state.next(err) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return 0, r.state.fail()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer r.state.nextd(&err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var data []byte
 | 
				
			||||||
 | 
						if r.isNotConcurrent() {
 | 
				
			||||||
 | 
							size := r.frame.Descriptor.Flags.BlockSizeIndex()
 | 
				
			||||||
 | 
							data = size.Get()
 | 
				
			||||||
 | 
							defer lz4block.Put(data)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							var bn int
 | 
				
			||||||
 | 
							var dst []byte
 | 
				
			||||||
 | 
							if r.isNotConcurrent() {
 | 
				
			||||||
 | 
								bn, err = r.read(data)
 | 
				
			||||||
 | 
								dst = data[:bn]
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								lz4block.Put(dst)
 | 
				
			||||||
 | 
								dst = <-r.reads
 | 
				
			||||||
 | 
								bn = len(dst)
 | 
				
			||||||
 | 
								if bn == 0 {
 | 
				
			||||||
 | 
									// No uncompressed data: something went wrong or we are done.
 | 
				
			||||||
 | 
									err = r.frame.Blocks.ErrorR()
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							switch err {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
							case io.EOF:
 | 
				
			||||||
 | 
								err = r.frame.CloseR(r.src)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							r.handler(bn)
 | 
				
			||||||
 | 
							bn, err = w.Write(dst)
 | 
				
			||||||
 | 
							n += int64(bn)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										75
									
								
								vendor/github.com/pierrec/lz4/v4/state.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								vendor/github.com/pierrec/lz4/v4/state.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					package lz4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4errors"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:generate go run golang.org/x/tools/cmd/stringer -type=aState -output state_gen.go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						noState     aState = iota // uninitialized reader
 | 
				
			||||||
 | 
						errorState                // unrecoverable error encountered
 | 
				
			||||||
 | 
						newState                  // instantiated object
 | 
				
			||||||
 | 
						readState                 // reading data
 | 
				
			||||||
 | 
						writeState                // writing data
 | 
				
			||||||
 | 
						closedState               // all done
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type (
 | 
				
			||||||
 | 
						aState uint8
 | 
				
			||||||
 | 
						_State struct {
 | 
				
			||||||
 | 
							states []aState
 | 
				
			||||||
 | 
							state  aState
 | 
				
			||||||
 | 
							err    error
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *_State) init(states []aState) {
 | 
				
			||||||
 | 
						s.states = states
 | 
				
			||||||
 | 
						s.state = states[0]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *_State) reset() {
 | 
				
			||||||
 | 
						s.state = s.states[0]
 | 
				
			||||||
 | 
						s.err = nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// next sets the state to the next one unless it is passed a non nil error.
 | 
				
			||||||
 | 
					// It returns whether or not it is in error.
 | 
				
			||||||
 | 
					func (s *_State) next(err error) bool {
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							s.err = fmt.Errorf("%s: %w", s.state, err)
 | 
				
			||||||
 | 
							s.state = errorState
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						s.state = s.states[s.state]
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// nextd is like next but for defers.
 | 
				
			||||||
 | 
					func (s *_State) nextd(errp *error) bool {
 | 
				
			||||||
 | 
						return errp != nil && s.next(*errp)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// check sets s in error if not already in error and if the error is not nil or io.EOF,
 | 
				
			||||||
 | 
					func (s *_State) check(errp *error) {
 | 
				
			||||||
 | 
						if s.state == errorState || errp == nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := *errp; err != nil {
 | 
				
			||||||
 | 
							s.err = fmt.Errorf("%w[%s]", err, s.state)
 | 
				
			||||||
 | 
							if !errors.Is(err, io.EOF) {
 | 
				
			||||||
 | 
								s.state = errorState
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *_State) fail() error {
 | 
				
			||||||
 | 
						s.state = errorState
 | 
				
			||||||
 | 
						s.err = fmt.Errorf("%w[%s]", lz4errors.ErrInternalUnhandledState, s.state)
 | 
				
			||||||
 | 
						return s.err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										28
									
								
								vendor/github.com/pierrec/lz4/v4/state_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/pierrec/lz4/v4/state_gen.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					// Code generated by "stringer -type=aState -output state_gen.go"; DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package lz4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func _() {
 | 
				
			||||||
 | 
						// An "invalid array index" compiler error signifies that the constant values have changed.
 | 
				
			||||||
 | 
						// Re-run the stringer command to generate them again.
 | 
				
			||||||
 | 
						var x [1]struct{}
 | 
				
			||||||
 | 
						_ = x[noState-0]
 | 
				
			||||||
 | 
						_ = x[errorState-1]
 | 
				
			||||||
 | 
						_ = x[newState-2]
 | 
				
			||||||
 | 
						_ = x[readState-3]
 | 
				
			||||||
 | 
						_ = x[writeState-4]
 | 
				
			||||||
 | 
						_ = x[closedState-5]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const _aState_name = "noStateerrorStatenewStatereadStatewriteStateclosedState"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _aState_index = [...]uint8{0, 7, 17, 25, 34, 44, 55}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (i aState) String() string {
 | 
				
			||||||
 | 
						if i >= aState(len(_aState_index)-1) {
 | 
				
			||||||
 | 
							return "aState(" + strconv.FormatInt(int64(i), 10) + ")"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return _aState_name[_aState_index[i]:_aState_index[i+1]]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										233
									
								
								vendor/github.com/pierrec/lz4/v4/writer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								vendor/github.com/pierrec/lz4/v4/writer.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,233 @@
 | 
				
			|||||||
 | 
					package lz4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4block"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4errors"
 | 
				
			||||||
 | 
						"github.com/pierrec/lz4/v4/internal/lz4stream"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var writerStates = []aState{
 | 
				
			||||||
 | 
						noState:     newState,
 | 
				
			||||||
 | 
						newState:    writeState,
 | 
				
			||||||
 | 
						writeState:  closedState,
 | 
				
			||||||
 | 
						closedState: newState,
 | 
				
			||||||
 | 
						errorState:  newState,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewWriter returns a new LZ4 frame encoder.
 | 
				
			||||||
 | 
					func NewWriter(w io.Writer) *Writer {
 | 
				
			||||||
 | 
						zw := &Writer{frame: lz4stream.NewFrame()}
 | 
				
			||||||
 | 
						zw.state.init(writerStates)
 | 
				
			||||||
 | 
						_ = zw.Apply(DefaultBlockSizeOption, DefaultChecksumOption, DefaultConcurrency, defaultOnBlockDone)
 | 
				
			||||||
 | 
						zw.Reset(w)
 | 
				
			||||||
 | 
						return zw
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Writer allows writing an LZ4 stream.
 | 
				
			||||||
 | 
					type Writer struct {
 | 
				
			||||||
 | 
						state   _State
 | 
				
			||||||
 | 
						src     io.Writer                 // destination writer
 | 
				
			||||||
 | 
						level   lz4block.CompressionLevel // how hard to try
 | 
				
			||||||
 | 
						num     int                       // concurrency level
 | 
				
			||||||
 | 
						frame   *lz4stream.Frame          // frame being built
 | 
				
			||||||
 | 
						data    []byte                    // pending data
 | 
				
			||||||
 | 
						idx     int                       // size of pending data
 | 
				
			||||||
 | 
						handler func(int)
 | 
				
			||||||
 | 
						legacy  bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (*Writer) private() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w *Writer) Apply(options ...Option) (err error) {
 | 
				
			||||||
 | 
						defer w.state.check(&err)
 | 
				
			||||||
 | 
						switch w.state.state {
 | 
				
			||||||
 | 
						case newState:
 | 
				
			||||||
 | 
						case errorState:
 | 
				
			||||||
 | 
							return w.state.err
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return lz4errors.ErrOptionClosedOrError
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, o := range options {
 | 
				
			||||||
 | 
							if err = o(w); err != nil {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						w.Reset(w.src)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w *Writer) isNotConcurrent() bool {
 | 
				
			||||||
 | 
						return w.num == 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// init sets up the Writer when in newState. It does not change the Writer state.
 | 
				
			||||||
 | 
					func (w *Writer) init() error {
 | 
				
			||||||
 | 
						w.frame.InitW(w.src, w.num, w.legacy)
 | 
				
			||||||
 | 
						if true || !w.isNotConcurrent() {
 | 
				
			||||||
 | 
							size := w.frame.Descriptor.Flags.BlockSizeIndex()
 | 
				
			||||||
 | 
							w.data = size.Get()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						w.idx = 0
 | 
				
			||||||
 | 
						return w.frame.Descriptor.Write(w.frame, w.src)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w *Writer) Write(buf []byte) (n int, err error) {
 | 
				
			||||||
 | 
						defer w.state.check(&err)
 | 
				
			||||||
 | 
						switch w.state.state {
 | 
				
			||||||
 | 
						case writeState:
 | 
				
			||||||
 | 
						case closedState, errorState:
 | 
				
			||||||
 | 
							return 0, w.state.err
 | 
				
			||||||
 | 
						case newState:
 | 
				
			||||||
 | 
							if err = w.init(); w.state.next(err) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return 0, w.state.fail()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						zn := len(w.data)
 | 
				
			||||||
 | 
						for len(buf) > 0 {
 | 
				
			||||||
 | 
							if w.idx == 0 && len(buf) >= zn {
 | 
				
			||||||
 | 
								// Avoid a copy as there is enough data for a block.
 | 
				
			||||||
 | 
								if err = w.write(buf[:zn], false); err != nil {
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								n += zn
 | 
				
			||||||
 | 
								buf = buf[zn:]
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Accumulate the data to be compressed.
 | 
				
			||||||
 | 
							m := copy(w.data[w.idx:], buf)
 | 
				
			||||||
 | 
							n += m
 | 
				
			||||||
 | 
							w.idx += m
 | 
				
			||||||
 | 
							buf = buf[m:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if w.idx < len(w.data) {
 | 
				
			||||||
 | 
								// Buffer not filled.
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Buffer full.
 | 
				
			||||||
 | 
							if err = w.write(w.data, true); err != nil {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !w.isNotConcurrent() {
 | 
				
			||||||
 | 
								size := w.frame.Descriptor.Flags.BlockSizeIndex()
 | 
				
			||||||
 | 
								w.data = size.Get()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							w.idx = 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w *Writer) write(data []byte, safe bool) error {
 | 
				
			||||||
 | 
						if w.isNotConcurrent() {
 | 
				
			||||||
 | 
							block := w.frame.Blocks.Block
 | 
				
			||||||
 | 
							err := block.Compress(w.frame, data, w.level).Write(w.frame, w.src)
 | 
				
			||||||
 | 
							w.handler(len(block.Data))
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						c := make(chan *lz4stream.FrameDataBlock)
 | 
				
			||||||
 | 
						w.frame.Blocks.Blocks <- c
 | 
				
			||||||
 | 
						go func(c chan *lz4stream.FrameDataBlock, data []byte, safe bool) {
 | 
				
			||||||
 | 
							b := lz4stream.NewFrameDataBlock(w.frame)
 | 
				
			||||||
 | 
							c <- b.Compress(w.frame, data, w.level)
 | 
				
			||||||
 | 
							<-c
 | 
				
			||||||
 | 
							w.handler(len(b.Data))
 | 
				
			||||||
 | 
							b.Close(w.frame)
 | 
				
			||||||
 | 
							if safe {
 | 
				
			||||||
 | 
								// safe to put it back as the last usage of it was FrameDataBlock.Write() called before c is closed
 | 
				
			||||||
 | 
								lz4block.Put(data)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}(c, data, safe)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Close closes the Writer, flushing any unwritten data to the underlying io.Writer,
 | 
				
			||||||
 | 
					// but does not close the underlying io.Writer.
 | 
				
			||||||
 | 
					func (w *Writer) Close() (err error) {
 | 
				
			||||||
 | 
						switch w.state.state {
 | 
				
			||||||
 | 
						case writeState:
 | 
				
			||||||
 | 
						case errorState:
 | 
				
			||||||
 | 
							return w.state.err
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer w.state.nextd(&err)
 | 
				
			||||||
 | 
						if w.idx > 0 {
 | 
				
			||||||
 | 
							// Flush pending data, disable w.data freeing as it is done later on.
 | 
				
			||||||
 | 
							if err = w.write(w.data[:w.idx], false); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							w.idx = 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = w.frame.CloseW(w.src, w.num)
 | 
				
			||||||
 | 
						// It is now safe to free the buffer.
 | 
				
			||||||
 | 
						if w.data != nil {
 | 
				
			||||||
 | 
							lz4block.Put(w.data)
 | 
				
			||||||
 | 
							w.data = nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Reset clears the state of the Writer w such that it is equivalent to its
 | 
				
			||||||
 | 
					// initial state from NewWriter, but instead writing to writer.
 | 
				
			||||||
 | 
					// Reset keeps the previous options unless overwritten by the supplied ones.
 | 
				
			||||||
 | 
					// No access to writer is performed.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// w.Close must be called before Reset or pending data may be dropped.
 | 
				
			||||||
 | 
					func (w *Writer) Reset(writer io.Writer) {
 | 
				
			||||||
 | 
						w.frame.Reset(w.num)
 | 
				
			||||||
 | 
						w.state.reset()
 | 
				
			||||||
 | 
						w.src = writer
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ReadFrom efficiently reads from r and compressed into the Writer destination.
 | 
				
			||||||
 | 
					func (w *Writer) ReadFrom(r io.Reader) (n int64, err error) {
 | 
				
			||||||
 | 
						switch w.state.state {
 | 
				
			||||||
 | 
						case closedState, errorState:
 | 
				
			||||||
 | 
							return 0, w.state.err
 | 
				
			||||||
 | 
						case newState:
 | 
				
			||||||
 | 
							if err = w.init(); w.state.next(err) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return 0, w.state.fail()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer w.state.check(&err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						size := w.frame.Descriptor.Flags.BlockSizeIndex()
 | 
				
			||||||
 | 
						var done bool
 | 
				
			||||||
 | 
						var rn int
 | 
				
			||||||
 | 
						data := size.Get()
 | 
				
			||||||
 | 
						if w.isNotConcurrent() {
 | 
				
			||||||
 | 
							// Keep the same buffer for the whole process.
 | 
				
			||||||
 | 
							defer lz4block.Put(data)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for !done {
 | 
				
			||||||
 | 
							rn, err = io.ReadFull(r, data)
 | 
				
			||||||
 | 
							switch err {
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
							case io.EOF, io.ErrUnexpectedEOF: // read may be partial
 | 
				
			||||||
 | 
								done = true
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							n += int64(rn)
 | 
				
			||||||
 | 
							err = w.write(data[:rn], true)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							w.handler(rn)
 | 
				
			||||||
 | 
							if !done && !w.isNotConcurrent() {
 | 
				
			||||||
 | 
								// The buffer will be returned automatically by go routines (safe=true)
 | 
				
			||||||
 | 
								// so get a new one fo the next round.
 | 
				
			||||||
 | 
								data = size.Get()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						err = w.Close()
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										14
									
								
								vendor/github.com/ssor/bom/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/ssor/bom/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					language: go
 | 
				
			||||||
 | 
					go:
 | 
				
			||||||
 | 
					  - tip
 | 
				
			||||||
 | 
					  - 1.8
 | 
				
			||||||
 | 
					  - 1.7
 | 
				
			||||||
 | 
					  - 1.6
 | 
				
			||||||
 | 
					  - 1.5
 | 
				
			||||||
 | 
					  - 1.4
 | 
				
			||||||
 | 
					  - 1.3
 | 
				
			||||||
 | 
					  - 1.2
 | 
				
			||||||
 | 
					notifications:
 | 
				
			||||||
 | 
					  email:
 | 
				
			||||||
 | 
					    on_success: change
 | 
				
			||||||
 | 
					    on_failure: always
 | 
				
			||||||
							
								
								
									
										21
									
								
								vendor/github.com/ssor/bom/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/ssor/bom/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					MIT License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2017 Asher
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The above copyright notice and this permission notice shall be included in all
 | 
				
			||||||
 | 
					copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||||
 | 
					SOFTWARE.
 | 
				
			||||||
							
								
								
									
										23
									
								
								vendor/github.com/ssor/bom/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								vendor/github.com/ssor/bom/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					# bom
 | 
				
			||||||
 | 
					small tools for cleaning bom from byte array or reader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Installation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```sh
 | 
				
			||||||
 | 
					$ go get github.com/ssor/bom
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## How to Use
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
						bs := []byte{bom0, bom1, bom2, 0x11}
 | 
				
			||||||
 | 
						result := CleanBom(bs)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
						bs := []byte{bom0, bom1, bom2, 0x11}
 | 
				
			||||||
 | 
						result := NewReaderWithoutBom(bytes.NewReader(bs))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										34
									
								
								vendor/github.com/ssor/bom/bom.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/ssor/bom/bom.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					package bom
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						bom0 = 0xef
 | 
				
			||||||
 | 
						bom1 = 0xbb
 | 
				
			||||||
 | 
						bom2 = 0xbf
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CleanBom returns b with the 3 byte BOM stripped off the front if it is present.
 | 
				
			||||||
 | 
					// If the BOM is not present, then b is returned.
 | 
				
			||||||
 | 
					func CleanBom(b []byte) []byte {
 | 
				
			||||||
 | 
						if len(b) >= 3 &&
 | 
				
			||||||
 | 
							b[0] == bom0 &&
 | 
				
			||||||
 | 
							b[1] == bom1 &&
 | 
				
			||||||
 | 
							b[2] == bom2 {
 | 
				
			||||||
 | 
							return b[3:]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return b
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewReaderWithoutBom returns an io.Reader that will skip over initial UTF-8 byte order marks.
 | 
				
			||||||
 | 
					func NewReaderWithoutBom(r io.Reader) (io.Reader, error) {
 | 
				
			||||||
 | 
						bs, err := ioutil.ReadAll(r)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return bytes.NewReader(CleanBom(bs)), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								vendor/github.com/unknwon/paginater/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/unknwon/paginater/Makefile
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					.PHONY: build test vet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					build: vet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test:
 | 
				
			||||||
 | 
						go test -v -cover -race
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					vet:
 | 
				
			||||||
 | 
						go vet
 | 
				
			||||||
							
								
								
									
										10
									
								
								vendor/github.com/unknwon/paginater/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/github.com/unknwon/paginater/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,5 +1,9 @@
 | 
				
			|||||||
Paginater [](https://drone.io/github.com/Unknwon/paginater/latest) [](http://gocover.io/github.com/Unknwon/paginater)
 | 
					# Paginater
 | 
				
			||||||
=========
 | 
					
 | 
				
			||||||
 | 
					[](https://github.com/unknwon/paginater/actions?query=workflow%3AGo)
 | 
				
			||||||
 | 
					[](https://codecov.io/gh/unknwon/paginater)
 | 
				
			||||||
 | 
					[](https://pkg.go.dev/github.com/unknwon/paginater?tab=doc)
 | 
				
			||||||
 | 
					[](https://sourcegraph.com/github.com/unknwon/paginater)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Package paginater is a helper module for custom pagination calculation.
 | 
					Package paginater is a helper module for custom pagination calculation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -21,7 +25,7 @@ func main() {
 | 
				
			|||||||
	// - Total number of rows
 | 
						// - Total number of rows
 | 
				
			||||||
	// - Number of rows in one page
 | 
						// - Number of rows in one page
 | 
				
			||||||
	// - Current page number 
 | 
						// - Current page number 
 | 
				
			||||||
	// - Number of page links
 | 
						// - Number of page links to be displayed
 | 
				
			||||||
	p := paginater.New(45, 10, 3, 3)
 | 
						p := paginater.New(45, 10, 3, 3)
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	// Then use p as a template object named "Page" in "demo.html"
 | 
						// Then use p as a template object named "Page" in "demo.html"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								vendor/github.com/unknwon/paginater/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/unknwon/paginater/go.mod
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					module github.com/unknwon/paginater
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require github.com/smartystreets/goconvey v1.6.4
 | 
				
			||||||
							
								
								
									
										12
									
								
								vendor/github.com/unknwon/paginater/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/unknwon/paginater/go.sum
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
				
			||||||
 | 
					github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 | 
				
			||||||
 | 
					github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 | 
				
			||||||
 | 
					github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
 | 
				
			||||||
 | 
					github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
				
			||||||
 | 
					github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 | 
				
			||||||
 | 
					github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
 | 
					golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
							
								
								
									
										7
									
								
								vendor/github.com/unknwon/paginater/paginater.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/unknwon/paginater/paginater.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -96,6 +96,11 @@ func (p *Paginater) Current() int {
 | 
				
			|||||||
	return p.current
 | 
						return p.current
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// PagingNum returns number of page size.
 | 
				
			||||||
 | 
					func (p *Paginater) PagingNum() int {
 | 
				
			||||||
 | 
						return p.pagingNum
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Page presents a page in the paginater.
 | 
					// Page presents a page in the paginater.
 | 
				
			||||||
type Page struct {
 | 
					type Page struct {
 | 
				
			||||||
	num       int
 | 
						num       int
 | 
				
			||||||
@@ -137,7 +142,6 @@ func (p *Paginater) Pages() []*Page {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	numPages := p.numPages
 | 
						numPages := p.numPages
 | 
				
			||||||
	maxIdx := numPages - 1
 | 
					 | 
				
			||||||
	offsetIdx := 0
 | 
						offsetIdx := 0
 | 
				
			||||||
	hasMoreNext := false
 | 
						hasMoreNext := false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -156,7 +160,6 @@ func (p *Paginater) Pages() []*Page {
 | 
				
			|||||||
	offsetVal := p.current - previousNum
 | 
						offsetVal := p.current - previousNum
 | 
				
			||||||
	if offsetVal > 1 {
 | 
						if offsetVal > 1 {
 | 
				
			||||||
		numPages++
 | 
							numPages++
 | 
				
			||||||
		maxIdx++
 | 
					 | 
				
			||||||
		offsetIdx = 1
 | 
							offsetIdx = 1
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user