[Vendor] update go-swagger v0.21.0 -> v0.25.0 (#12670)
* Update go-swagger * vendor
This commit is contained in:
		
							parent
							
								
									66843f2237
								
							
						
					
					
						commit
						3270e7a443
					
				
							
								
								
									
										11
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										11
									
								
								go.mod
								
								
								
								
							| 
						 | 
					@ -3,7 +3,6 @@ module code.gitea.io/gitea
 | 
				
			||||||
go 1.14
 | 
					go 1.14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	cloud.google.com/go v0.45.0 // indirect
 | 
					 | 
				
			||||||
	code.gitea.io/gitea-vet v0.2.1
 | 
						code.gitea.io/gitea-vet v0.2.1
 | 
				
			||||||
	gitea.com/lunny/levelqueue v0.3.0
 | 
						gitea.com/lunny/levelqueue v0.3.0
 | 
				
			||||||
	gitea.com/macaron/binding v0.0.0-20190822013154-a5f53841ed2b
 | 
						gitea.com/macaron/binding v0.0.0-20190822013154-a5f53841ed2b
 | 
				
			||||||
| 
						 | 
					@ -21,7 +20,6 @@ require (
 | 
				
			||||||
	github.com/PuerkitoBio/goquery v1.5.1
 | 
						github.com/PuerkitoBio/goquery v1.5.1
 | 
				
			||||||
	github.com/RoaringBitmap/roaring v0.4.23 // indirect
 | 
						github.com/RoaringBitmap/roaring v0.4.23 // indirect
 | 
				
			||||||
	github.com/alecthomas/chroma v0.8.0
 | 
						github.com/alecthomas/chroma v0.8.0
 | 
				
			||||||
	github.com/bgentry/speakeasy v0.1.0 // indirect
 | 
					 | 
				
			||||||
	github.com/blevesearch/bleve v1.0.7
 | 
						github.com/blevesearch/bleve v1.0.7
 | 
				
			||||||
	github.com/couchbase/gomemcached v0.0.0-20191004160342-7b5da2ec40b2 // indirect
 | 
						github.com/couchbase/gomemcached v0.0.0-20191004160342-7b5da2ec40b2 // indirect
 | 
				
			||||||
	github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect
 | 
						github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d // indirect
 | 
				
			||||||
| 
						 | 
					@ -41,15 +39,13 @@ require (
 | 
				
			||||||
	github.com/go-enry/go-enry/v2 v2.5.2
 | 
						github.com/go-enry/go-enry/v2 v2.5.2
 | 
				
			||||||
	github.com/go-git/go-billy/v5 v5.0.0
 | 
						github.com/go-git/go-billy/v5 v5.0.0
 | 
				
			||||||
	github.com/go-git/go-git/v5 v5.1.0
 | 
						github.com/go-git/go-git/v5 v5.1.0
 | 
				
			||||||
	github.com/go-openapi/jsonreference v0.19.3 // indirect
 | 
					 | 
				
			||||||
	github.com/go-redis/redis v6.15.2+incompatible
 | 
						github.com/go-redis/redis v6.15.2+incompatible
 | 
				
			||||||
	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.21.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.0
 | 
				
			||||||
	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/golang/protobuf v1.4.1 // indirect
 | 
					 | 
				
			||||||
	github.com/google/go-github/v32 v32.1.0
 | 
						github.com/google/go-github/v32 v32.1.0
 | 
				
			||||||
	github.com/google/uuid v1.1.1
 | 
						github.com/google/uuid v1.1.1
 | 
				
			||||||
	github.com/gorilla/context v1.1.1
 | 
						github.com/gorilla/context v1.1.1
 | 
				
			||||||
| 
						 | 
					@ -65,7 +61,6 @@ require (
 | 
				
			||||||
	github.com/lafriks/xormstore v1.3.2
 | 
						github.com/lafriks/xormstore v1.3.2
 | 
				
			||||||
	github.com/lib/pq v1.7.0
 | 
						github.com/lib/pq v1.7.0
 | 
				
			||||||
	github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96
 | 
						github.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96
 | 
				
			||||||
	github.com/mailru/easyjson v0.7.0 // indirect
 | 
					 | 
				
			||||||
	github.com/markbates/goth v1.61.2
 | 
						github.com/markbates/goth v1.61.2
 | 
				
			||||||
	github.com/mattn/go-isatty v0.0.12
 | 
						github.com/mattn/go-isatty v0.0.12
 | 
				
			||||||
	github.com/mattn/go-sqlite3 v1.14.0
 | 
						github.com/mattn/go-sqlite3 v1.14.0
 | 
				
			||||||
| 
						 | 
					@ -84,14 +79,13 @@ require (
 | 
				
			||||||
	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.1.0
 | 
						github.com/prometheus/client_golang v1.1.0
 | 
				
			||||||
	github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 // indirect
 | 
					 | 
				
			||||||
	github.com/prometheus/procfs v0.0.4 // indirect
 | 
						github.com/prometheus/procfs v0.0.4 // indirect
 | 
				
			||||||
	github.com/quasoft/websspi v1.0.0
 | 
						github.com/quasoft/websspi v1.0.0
 | 
				
			||||||
	github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 // indirect
 | 
						github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 // indirect
 | 
				
			||||||
	github.com/sergi/go-diff v1.1.0
 | 
						github.com/sergi/go-diff v1.1.0
 | 
				
			||||||
	github.com/shurcooL/httpfs v0.0.0-20190527155220-6a4d4a70508b // indirect
 | 
						github.com/shurcooL/httpfs v0.0.0-20190527155220-6a4d4a70508b // indirect
 | 
				
			||||||
	github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd
 | 
						github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd
 | 
				
			||||||
	github.com/stretchr/testify v1.5.1
 | 
						github.com/stretchr/testify v1.6.1
 | 
				
			||||||
	github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 // indirect
 | 
						github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 // indirect
 | 
				
			||||||
	github.com/tinylib/msgp v1.1.2 // indirect
 | 
						github.com/tinylib/msgp v1.1.2 // indirect
 | 
				
			||||||
	github.com/tstranex/u2f v1.0.0
 | 
						github.com/tstranex/u2f v1.0.0
 | 
				
			||||||
| 
						 | 
					@ -111,7 +105,6 @@ require (
 | 
				
			||||||
	golang.org/x/text v0.3.3
 | 
						golang.org/x/text v0.3.3
 | 
				
			||||||
	golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect
 | 
						golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect
 | 
				
			||||||
	golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d
 | 
						golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d
 | 
				
			||||||
	google.golang.org/appengine v1.6.5 // indirect
 | 
					 | 
				
			||||||
	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 | 
						gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 | 
				
			||||||
	gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175 // indirect
 | 
						gopkg.in/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175 // indirect
 | 
				
			||||||
	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 | 
						gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										227
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										227
									
								
								go.sum
								
								
								
								
							| 
						 | 
					@ -5,12 +5,17 @@ cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7h
 | 
				
			||||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
 | 
					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.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
 | 
				
			||||||
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
 | 
					cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
 | 
				
			||||||
cloud.google.com/go v0.45.0 h1:bALuGBSgE+BD4rxsopAYlqjcwqcQtye6pWG4bC3N/k0=
 | 
					cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
 | 
				
			||||||
cloud.google.com/go v0.45.0/go.mod h1:452BcPOeI9AZfbvDw0Tbo7D32wA+WX9WME8AZwMEDZU=
 | 
					cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y=
 | 
				
			||||||
 | 
					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/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/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.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=
 | 
				
			||||||
 | 
					dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 | 
				
			||||||
gitea.com/lunny/levelqueue v0.3.0 h1:MHn1GuSZkxvVEDMyAPqlc7A3cOW+q8RcGhRgH/xtm6I=
 | 
					gitea.com/lunny/levelqueue v0.3.0 h1:MHn1GuSZkxvVEDMyAPqlc7A3cOW+q8RcGhRgH/xtm6I=
 | 
				
			||||||
gitea.com/lunny/levelqueue v0.3.0/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU=
 | 
					gitea.com/lunny/levelqueue v0.3.0/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU=
 | 
				
			||||||
gitea.com/macaron/binding v0.0.0-20190822013154-a5f53841ed2b h1:vXt85uYV17KURaUlhU7v4GbCShkqRZDSfo0TkC0YCjQ=
 | 
					gitea.com/macaron/binding v0.0.0-20190822013154-a5f53841ed2b h1:vXt85uYV17KURaUlhU7v4GbCShkqRZDSfo0TkC0YCjQ=
 | 
				
			||||||
| 
						 | 
					@ -88,12 +93,18 @@ github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9Pq
 | 
				
			||||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
 | 
					github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
 | 
				
			||||||
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
 | 
					github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
 | 
				
			||||||
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 | 
					github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 | 
				
			||||||
 | 
					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/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/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
 | 
					github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
 | 
				
			||||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
					github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
 | 
				
			||||||
github.com/aws/aws-sdk-go v1.25.25/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
 | 
					github.com/aws/aws-sdk-go v1.25.25/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
 | 
				
			||||||
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
 | 
					github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
 | 
				
			||||||
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
 | 
					github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
 | 
				
			||||||
| 
						 | 
					@ -103,6 +114,7 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 | 
				
			||||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 | 
					github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 | 
				
			||||||
github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
 | 
					github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY=
 | 
				
			||||||
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 | 
					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/blevesearch/bleve v1.0.7 h1:4PspZE7XABMSKcVpzAKp0E05Yer1PIYmTWk+1ngNr/c=
 | 
					github.com/blevesearch/bleve v1.0.7 h1:4PspZE7XABMSKcVpzAKp0E05Yer1PIYmTWk+1ngNr/c=
 | 
				
			||||||
github.com/blevesearch/bleve v1.0.7/go.mod h1:3xvmBtaw12Y4C9iA1RTzwWCof5j5HjydjCTiDE2TeE0=
 | 
					github.com/blevesearch/bleve v1.0.7/go.mod h1:3xvmBtaw12Y4C9iA1RTzwWCof5j5HjydjCTiDE2TeE0=
 | 
				
			||||||
github.com/blevesearch/blevex v0.0.0-20190916190636-152f0fe5c040 h1:SjYVcfJVZoCfBlg+fkaq2eoZHTf5HaJfaTeTkOtyfHQ=
 | 
					github.com/blevesearch/blevex v0.0.0-20190916190636-152f0fe5c040 h1:SjYVcfJVZoCfBlg+fkaq2eoZHTf5HaJfaTeTkOtyfHQ=
 | 
				
			||||||
| 
						 | 
					@ -123,19 +135,20 @@ github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8
 | 
				
			||||||
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=
 | 
				
			||||||
github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
 | 
					github.com/bradfitz/gomemcache v0.0.0-20190329173943-551aad21a668/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
 | 
				
			||||||
 | 
					github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
				
			||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
					github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
				
			||||||
github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU=
 | 
					github.com/chris-ramon/douceur v0.2.0 h1:IDMEdxlEUUBYBKE4z/mJnFyVXox+MjuEVDJNN27glkU=
 | 
				
			||||||
github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE=
 | 
					github.com/chris-ramon/douceur v0.2.0/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE=
 | 
				
			||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
					github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 | 
				
			||||||
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
 | 
					github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
 | 
				
			||||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
 | 
					github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
 | 
				
			||||||
github.com/corbym/gocrest v1.0.3 h1:gwEdq6RkTmq+09CTuM29DfKOCtZ7G7bcyxs3IZ6EVdU=
 | 
					 | 
				
			||||||
github.com/corbym/gocrest v1.0.3/go.mod h1:maVFL5lbdS2PgfOQgGRWDYTeunSWQeiEgoNdTABShCs=
 | 
					 | 
				
			||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
 | 
					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.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
				
			||||||
 | 
					github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 | 
				
			||||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
 | 
					github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
 | 
				
			||||||
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
 | 
					github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
 | 
				
			||||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
 | 
					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/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
				
			||||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
					github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
 | 
				
			||||||
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
					github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 | 
				
			||||||
| 
						 | 
					@ -197,6 +210,8 @@ github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw=
 | 
				
			||||||
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=
 | 
				
			||||||
 | 
					github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 | 
				
			||||||
 | 
					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-20180203182544-0a76f03a811a h1:M1bRpaZAn4GSsqu3hdK2R8H0AH9O6vqCTCbm2oAFGfE=
 | 
				
			||||||
github.com/ethantkoenig/rupture v0.0.0-20180203182544-0a76f03a811a/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=
 | 
				
			||||||
| 
						 | 
					@ -205,6 +220,7 @@ github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojt
 | 
				
			||||||
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg=
 | 
					github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg=
 | 
				
			||||||
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y=
 | 
					github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQDg5gKsWoLBOB0n+ZW8s599zru8FJ2/Y=
 | 
				
			||||||
github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0=
 | 
					github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0=
 | 
				
			||||||
 | 
					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 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
 | 
				
			||||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 | 
					github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 | 
				
			||||||
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
 | 
					github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
 | 
				
			||||||
| 
						 | 
					@ -215,6 +231,8 @@ 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/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 | 
					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/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/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 | 
				
			||||||
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
 | 
					github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
 | 
				
			||||||
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
 | 
					github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
 | 
				
			||||||
| 
						 | 
					@ -237,6 +255,7 @@ github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp
 | 
				
			||||||
github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
 | 
					github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
 | 
				
			||||||
github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk=
 | 
					github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk=
 | 
				
			||||||
github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM=
 | 
					github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM=
 | 
				
			||||||
 | 
					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-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.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=
 | 
				
			||||||
| 
						 | 
					@ -248,10 +267,15 @@ github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9sn
 | 
				
			||||||
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
 | 
					github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
 | 
				
			||||||
github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI=
 | 
					github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI=
 | 
				
			||||||
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
 | 
					github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
 | 
				
			||||||
 | 
					github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE=
 | 
				
			||||||
 | 
					github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ=
 | 
				
			||||||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
					github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
				
			||||||
github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
					github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
				
			||||||
github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 | 
					github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 | 
				
			||||||
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
					github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
 | 
				
			||||||
github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=
 | 
					github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4=
 | 
				
			||||||
github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4=
 | 
					github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
					github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
				
			||||||
| 
						 | 
					@ -264,37 +288,53 @@ github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
					github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
 | 
					github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
 | 
					github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
 | 
				
			||||||
github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
 | 
					github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.3 h1:jwIoahqCmaA5OBoc/B+1+Mu2L0Gr8xYQnbeyQEo/7b0=
 | 
					github.com/go-openapi/loads v0.19.3 h1:jwIoahqCmaA5OBoc/B+1+Mu2L0Gr8xYQnbeyQEo/7b0=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI=
 | 
					github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI=
 | 
				
			||||||
 | 
					github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls=
 | 
				
			||||||
 | 
					github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY=
 | 
				
			||||||
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
 | 
					github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
 | 
				
			||||||
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
 | 
					github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
 | 
				
			||||||
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
 | 
					github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
 | 
				
			||||||
github.com/go-openapi/runtime v0.19.5 h1:h4Zk7oTfB3ZYM2oMNliQvL+3BrDstTIX8lqP7yaYCuI=
 | 
					github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo=
 | 
				
			||||||
github.com/go-openapi/runtime v0.19.5/go.mod h1:WIH6IYPXOrtgTClTV8xzdrD20jBlrK25D0aQbdSlqp8=
 | 
					github.com/go-openapi/runtime v0.19.20 h1:J/t+QIjbcoq8WJvjGxRKiFBhqUE8slS9SbmD0Oi/raQ=
 | 
				
			||||||
 | 
					github.com/go-openapi/runtime v0.19.20/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk=
 | 
				
			||||||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
					github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
				
			||||||
github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
					github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
 | 
					github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 | 
					github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 | 
					github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
					github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
					github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
 | 
					github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
					github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA=
 | 
					github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
					github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
				
			||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
					github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
 | 
				
			||||||
github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
 | 
					github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
 | 
				
			||||||
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
 | 
					github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
 | 
				
			||||||
github.com/go-openapi/validate v0.19.3 h1:PAH/2DylwWcIU1s0Y7k3yNmeAgWOcKrNE2Q7Ww/kCg4=
 | 
					github.com/go-openapi/validate v0.19.3 h1:PAH/2DylwWcIU1s0Y7k3yNmeAgWOcKrNE2Q7Ww/kCg4=
 | 
				
			||||||
github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo=
 | 
					github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo=
 | 
				
			||||||
 | 
					github.com/go-openapi/validate v0.19.10 h1:tG3SZ5DC5KF4cyt7nqLVcQXGj5A7mpaYkAcNPlDK+Yk=
 | 
				
			||||||
 | 
					github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8=
 | 
				
			||||||
github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4=
 | 
					github.com/go-redis/redis v6.15.2+incompatible h1:9SpNVG76gr6InJGxoZ6IuuxaCOQwDAhzyXg+Bs+0Sb4=
 | 
				
			||||||
github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 | 
					github.com/go-redis/redis v6.15.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 | 
				
			||||||
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
 | 
					github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
 | 
				
			||||||
| 
						 | 
					@ -303,14 +343,38 @@ github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gG
 | 
				
			||||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 | 
					github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
					github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
					github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
				
			||||||
github.com/go-swagger/go-swagger v0.21.0 h1:AX9mdfzp6eJtUe92nFrWmbK7ocRgkCDPJs0FsSSTDlA=
 | 
					github.com/go-swagger/go-swagger v0.25.0 h1:FxhyrWWV8V/A9P6GtI5szWordAdbb6Y0nqdY/y9So2w=
 | 
				
			||||||
github.com/go-swagger/go-swagger v0.21.0/go.mod h1:tDb8PdDVFcaE8EPXkMOsuxpL3UEPiwu1UDZar9Z/1RY=
 | 
					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.0 h1:cny44xqH4ctXRld/COxFGPC7XDyOU8KNnwmfCxEEqoQ=
 | 
				
			||||||
github.com/go-testfixtures/testfixtures/v3 v3.4.0/go.mod h1:P4L3WxgOsCLbAeUC50qX5rdj1ULZfUMqgCbqah3OH5U=
 | 
					github.com/go-testfixtures/testfixtures/v3 v3.4.0/go.mod h1:P4L3WxgOsCLbAeUC50qX5rdj1ULZfUMqgCbqah3OH5U=
 | 
				
			||||||
github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y=
 | 
					github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y=
 | 
				
			||||||
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/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
 | 
				
			||||||
 | 
					github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
 | 
				
			||||||
 | 
					github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
 | 
				
			||||||
 | 
					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/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
 | 
					github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
 | 
				
			||||||
| 
						 | 
					@ -342,6 +406,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
 | 
				
			||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
					github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
				
			||||||
github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
 | 
					github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0=
 | 
				
			||||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 | 
					github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
 | 
				
			||||||
 | 
					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.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
					github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
				
			||||||
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=
 | 
				
			||||||
| 
						 | 
					@ -352,6 +418,8 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
 | 
				
			||||||
github.com/google/go-cmp v0.3.1/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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
 | 
					github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
 | 
				
			||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
					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-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II=
 | 
					github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II=
 | 
				
			||||||
github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI=
 | 
					github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI=
 | 
				
			||||||
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
 | 
					github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
 | 
				
			||||||
| 
						 | 
					@ -360,6 +428,7 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
 | 
				
			||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 | 
					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-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/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/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
					github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
				
			||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
| 
						 | 
					@ -389,21 +458,37 @@ github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+
 | 
				
			||||||
github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
 | 
					github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w=
 | 
				
			||||||
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 v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
 | 
					github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
				
			||||||
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-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=
 | 
				
			||||||
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 | 
					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 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
 | 
					github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
 | 
				
			||||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 | 
					github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 | 
				
			||||||
github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
 | 
					github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI=
 | 
				
			||||||
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
 | 
					github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
 | 
				
			||||||
 | 
					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-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.6 h1:HJunrbHTDDbBb/ay4kxa1n+dLmttUlnP3V9oNE4hmsM=
 | 
					github.com/hashicorp/go-retryablehttp v0.6.6 h1:HJunrbHTDDbBb/ay4kxa1n+dLmttUlnP3V9oNE4hmsM=
 | 
				
			||||||
github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
					github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
				
			||||||
 | 
					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.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/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 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
					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 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 | 
					github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 | 
				
			||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
					github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
				
			||||||
github.com/huandu/xstrings v1.3.0 h1:gvV6jG9dTgFEncxo+AF7PH6MZXi/vZl25owA/8Dg8Wo=
 | 
					github.com/huandu/xstrings v1.3.0 h1:gvV6jG9dTgFEncxo+AF7PH6MZXi/vZl25owA/8Dg8Wo=
 | 
				
			||||||
| 
						 | 
					@ -479,6 +564,8 @@ github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVY
 | 
				
			||||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
 | 
					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/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/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
				
			||||||
 | 
					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/kballard/go-shellquote v0.0.0-20170619183022-cd60e84ee657 h1:vE7J1m7cCpiRVEIr1B5ccDxRpbPsWT5JU3if2Di5nE4=
 | 
					github.com/kballard/go-shellquote v0.0.0-20170619183022-cd60e84ee657 h1:vE7J1m7cCpiRVEIr1B5ccDxRpbPsWT5JU3if2Di5nE4=
 | 
				
			||||||
github.com/kballard/go-shellquote v0.0.0-20170619183022-cd60e84ee657/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=
 | 
				
			||||||
| 
						 | 
					@ -486,9 +573,11 @@ github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT
 | 
				
			||||||
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=
 | 
				
			||||||
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
 | 
					github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
 | 
				
			||||||
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
					github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 | 
				
			||||||
 | 
					github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
				
			||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
					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.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.10.11 h1:K9z59aO18Aywg2b/WSgBaUX99mHy2BES18Cr5lBKZHk=
 | 
					github.com/klauspost/compress v1.10.11 h1:K9z59aO18Aywg2b/WSgBaUX99mHy2BES18Cr5lBKZHk=
 | 
				
			||||||
github.com/klauspost/compress v1.10.11/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
					github.com/klauspost/compress v1.10.11/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
 | 
				
			||||||
github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 | 
					github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 | 
				
			||||||
| 
						 | 
					@ -502,9 +591,12 @@ github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfEN
 | 
				
			||||||
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.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
 | 
					github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 | 
				
			||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
					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 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
				
			||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
					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/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
				
			||||||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 | 
					github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 | 
				
			||||||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 | 
					github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 | 
				
			||||||
| 
						 | 
					@ -533,11 +625,13 @@ github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM=
 | 
					github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
 | 
				
			||||||
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
 | 
					github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
 | 
				
			||||||
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.61.2 h1:jDowrUH5qw8KGuQdKwFhLzkXkTYCIPfz3LHADJsiPIs=
 | 
					github.com/markbates/goth v1.61.2 h1:jDowrUH5qw8KGuQdKwFhLzkXkTYCIPfz3LHADJsiPIs=
 | 
				
			||||||
github.com/markbates/goth v1.61.2/go.mod h1:qh2QfwZoWRucQ+DR5KVKC6dUGkNCToWh4vS45GIzFsY=
 | 
					github.com/markbates/goth v1.61.2/go.mod h1:qh2QfwZoWRucQ+DR5KVKC6dUGkNCToWh4vS45GIzFsY=
 | 
				
			||||||
 | 
					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/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=
 | 
				
			||||||
| 
						 | 
					@ -545,6 +639,7 @@ github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaa
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
					github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
 | 
					github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
					github.com/mattn/go-colorable v0.1.6/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.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 | 
					github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 | 
				
			||||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
					github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
				
			||||||
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
					github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 | 
				
			||||||
| 
						 | 
					@ -572,22 +667,32 @@ github.com/mholt/archiver/v3 v3.3.0 h1:vWjhY8SQp5yzM9P6OJ/eZEkmi3UAbRrxCq48MxjAz
 | 
				
			||||||
github.com/mholt/archiver/v3 v3.3.0/go.mod h1:YnQtqsp+94Rwd0D/rk5cnLrxusUBUXg+08Ebtr1Mqao=
 | 
					github.com/mholt/archiver/v3 v3.3.0/go.mod h1:YnQtqsp+94Rwd0D/rk5cnLrxusUBUXg+08Ebtr1Mqao=
 | 
				
			||||||
github.com/microcosm-cc/bluemonday v1.0.3-0.20191119130333-0a75d7616912 h1:hJde9rA24hlTcAYSwJoXpDUyGtfKQ/jsofw+WaDqGrI=
 | 
					github.com/microcosm-cc/bluemonday v1.0.3-0.20191119130333-0a75d7616912 h1:hJde9rA24hlTcAYSwJoXpDUyGtfKQ/jsofw+WaDqGrI=
 | 
				
			||||||
github.com/microcosm-cc/bluemonday v1.0.3-0.20191119130333-0a75d7616912/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w=
 | 
					github.com/microcosm-cc/bluemonday v1.0.3-0.20191119130333-0a75d7616912/go.mod h1:8iwZnFn2CDDNZ0r6UXhF4xawGvzaqzCRa1n3/lO3W2w=
 | 
				
			||||||
 | 
					github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 | 
				
			||||||
github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4=
 | 
					github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4=
 | 
				
			||||||
github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw=
 | 
					github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw=
 | 
				
			||||||
github.com/minio/minio-go/v7 v7.0.4 h1:M9glnGclD87VfttesWzURw7SHqq1XDIYGrfTykBTI50=
 | 
					github.com/minio/minio-go/v7 v7.0.4 h1:M9glnGclD87VfttesWzURw7SHqq1XDIYGrfTykBTI50=
 | 
				
			||||||
github.com/minio/minio-go/v7 v7.0.4/go.mod h1:CSt2ETZNs+bIIhWTse0mcZKZWMGrFU7Er7RR0TmkDYk=
 | 
					github.com/minio/minio-go/v7 v7.0.4/go.mod h1:CSt2ETZNs+bIIhWTse0mcZKZWMGrFU7Er7RR0TmkDYk=
 | 
				
			||||||
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/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-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 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
				
			||||||
 | 
					github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg=
 | 
				
			||||||
 | 
					github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
					github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 | 
					github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 | 
				
			||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
					github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 | 
				
			||||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
					github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 | 
				
			||||||
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/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=
 | 
				
			||||||
| 
						 | 
					@ -621,10 +726,13 @@ 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/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
				
			||||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 | 
					github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 | 
				
			||||||
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
 | 
					github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
 | 
				
			||||||
 | 
					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/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
				
			||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 | 
					github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 | 
				
			||||||
github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg=
 | 
					github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg=
 | 
				
			||||||
github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
 | 
					github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
 | 
				
			||||||
 | 
					github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw=
 | 
				
			||||||
 | 
					github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs=
 | 
				
			||||||
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/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
 | 
					github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I=
 | 
				
			||||||
| 
						 | 
					@ -633,8 +741,10 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
 | 
				
			||||||
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=
 | 
				
			||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
					github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
				
			||||||
 | 
					github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					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/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/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
 | 
					github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
 | 
				
			||||||
github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok=
 | 
					github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok=
 | 
				
			||||||
github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
 | 
					github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg=
 | 
				
			||||||
| 
						 | 
					@ -670,12 +780,17 @@ github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqn
 | 
				
			||||||
github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 h1:YDeskXpkNDhPdWN3REluVa46HQOVuVkjkd2sWnrABNQ=
 | 
					github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 h1:YDeskXpkNDhPdWN3REluVa46HQOVuVkjkd2sWnrABNQ=
 | 
				
			||||||
github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 | 
					github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 | 
				
			||||||
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
					github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
 | 
				
			||||||
 | 
					github.com/rogpeppe/go-internal v1.1.0/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/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=
 | 
				
			||||||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
 | 
					github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
 | 
				
			||||||
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/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 | 
				
			||||||
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/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 | 
				
			||||||
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=
 | 
				
			||||||
| 
						 | 
					@ -691,6 +806,7 @@ github.com/siddontang/go-snappy v0.0.0-20140704025258-d8f7bb82a96d/go.mod h1:vq0
 | 
				
			||||||
github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=
 | 
					github.com/siddontang/ledisdb v0.0.0-20190202134119-8ceb77e66a92/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg=
 | 
				
			||||||
github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
 | 
					github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
 | 
				
			||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
					github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
					github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
				
			||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
					github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
				
			||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 | 
					github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 | 
				
			||||||
| 
						 | 
					@ -703,13 +819,18 @@ github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:X
 | 
				
			||||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
					github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
				
			||||||
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8=
 | 
					github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8=
 | 
				
			||||||
github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
					github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 | 
				
			||||||
 | 
					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/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 | 
				
			||||||
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.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
 | 
					github.com/spf13/afero v1.3.2 h1:GDarE4TJQI52kYSbSAmLiId1Elfj+xgSDqrUZxFhxlU=
 | 
				
			||||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 | 
					github.com/spf13/afero v1.3.2/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
 | 
				
			||||||
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
 | 
					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/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
				
			||||||
 | 
					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/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/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=
 | 
				
			||||||
| 
						 | 
					@ -718,8 +839,8 @@ 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 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
 | 
					github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
 | 
				
			||||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
 | 
					github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 | 
				
			||||||
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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
| 
						 | 
					@ -731,6 +852,10 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy
 | 
				
			||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
					github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
				
			||||||
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 | 
					github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 | 
				
			||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 | 
					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/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/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 h1:HOxvxvnntLiPn123Fk+twfUhCQdMDaqmb0cclArW0T0=
 | 
					github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481 h1:HOxvxvnntLiPn123Fk+twfUhCQdMDaqmb0cclArW0T0=
 | 
				
			||||||
| 
						 | 
					@ -745,7 +870,6 @@ github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9r
 | 
				
			||||||
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=
 | 
				
			||||||
| 
						 | 
					@ -766,6 +890,8 @@ github.com/xanzy/go-gitlab v0.31.0 h1:+nHztQuCXGSMluKe5Q9IRaPdz6tO8O0gMkQ0vqGpiB
 | 
				
			||||||
github.com/xanzy/go-gitlab v0.31.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug=
 | 
					github.com/xanzy/go-gitlab v0.31.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/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
 | 
				
			||||||
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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 | 
				
			||||||
| 
						 | 
					@ -791,6 +917,10 @@ go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs=
 | 
					go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.5 h1:S0ZOruh4YGHjD7JoN7mIsTrNjnQbOjrmgrx6l6pZN7I=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.5/go.mod h1:Ual6Gkco7ZGQw8wE1t4tLnvBsf6yVSM60qW6TgOeJ5c=
 | 
				
			||||||
go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 | 
					go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 | 
				
			||||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
					go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 | 
				
			||||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
					go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
 | 
				
			||||||
| 
						 | 
					@ -801,18 +931,21 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/
 | 
				
			||||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
					go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
				
			||||||
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
					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-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-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
					golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 | 
					golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190907121410-71b5226ff739/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
					golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
				
			||||||
| 
						 | 
					@ -822,14 +955,23 @@ golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPh
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
 | 
					golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
					golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/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-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-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-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-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-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-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-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-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-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.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
 | 
				
			||||||
golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
 | 
					golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
 | 
				
			||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
					golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
				
			||||||
| 
						 | 
					@ -840,8 +982,10 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r
 | 
				
			||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20181005035420-146acd28ed58/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-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20181108082009-03003ca0c849/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-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-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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
| 
						 | 
					@ -862,6 +1006,7 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL
 | 
				
			||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
					golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/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/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
 | 
					golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
| 
						 | 
					@ -876,12 +1021,15 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/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-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-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-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-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/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-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-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-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-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-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
| 
						 | 
					@ -895,9 +1043,11 @@ golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/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-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-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
| 
						 | 
					@ -905,7 +1055,7 @@ golang.org/x/sys v0.0.0-20190730183949-1393eb018365/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190907184412-d223b2b6db03/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
| 
						 | 
					@ -930,25 +1080,36 @@ golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxb
 | 
				
			||||||
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-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-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-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-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-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-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
					golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
					golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
					golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/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-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-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-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-20190907020128-2ca718005c18/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-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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200225230052-807dcd883420/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					golang.org/x/tools v0.0.0-20200225230052-807dcd883420/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224 h1:azwY/v0y0K4mFHVsg5+UrTgchqALYWpqVo6vL5OmkmI=
 | 
					golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224 h1:azwY/v0y0K4mFHVsg5+UrTgchqALYWpqVo6vL5OmkmI=
 | 
				
			||||||
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-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d h1:XZxUC4/ZNKTjrT4/Oc9gCgIYnzPW3/CefdPjsndrVWM=
 | 
					golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d h1:XZxUC4/ZNKTjrT4/Oc9gCgIYnzPW3/CefdPjsndrVWM=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
					golang.org/x/tools v0.0.0-20200814230902-9882f1d1823d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
 | 
				
			||||||
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=
 | 
				
			||||||
| 
						 | 
					@ -962,6 +1123,7 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt
 | 
				
			||||||
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 | 
					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.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 | 
				
			||||||
google.golang.org/api v0.9.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.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
				
			||||||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
| 
						 | 
					@ -969,10 +1131,9 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
 | 
				
			||||||
google.golang.org/appengine v1.5.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.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 | 
					google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 | 
				
			||||||
google.golang.org/appengine v1.6.2/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 | 
					 | 
				
			||||||
google.golang.org/appengine v1.6.4/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 | 
					google.golang.org/appengine v1.6.4/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 | 
				
			||||||
google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
 | 
					google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc=
 | 
				
			||||||
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 | 
					google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 | 
					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-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
					google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 | 
				
			||||||
| 
						 | 
					@ -981,11 +1142,15 @@ google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRn
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/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-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-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/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 | 
				
			||||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 | 
					google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 | 
				
			||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 | 
					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.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/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
					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-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 v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
				
			||||||
| 
						 | 
					@ -993,6 +1158,10 @@ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miE
 | 
				
			||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
					google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
				
			||||||
google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY=
 | 
					google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY=
 | 
				
			||||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
					google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
				
			||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
					gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
				
			||||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 | 
					gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 | 
				
			||||||
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 | 
					gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 | 
				
			||||||
| 
						 | 
					@ -1003,6 +1172,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/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 h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					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 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 | 
					gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 | 
				
			||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 | 
					gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 | 
				
			||||||
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
 | 
					gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
 | 
				
			||||||
| 
						 | 
					@ -1012,6 +1182,7 @@ gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ini.v1 v1.44.2/go.mod h1:M3Cogqpuv0QCi3ExAY5V4uOt4qb/R3xZubo9m8lK5wg=
 | 
					gopkg.in/ini.v1 v1.44.2/go.mod h1:M3Cogqpuv0QCi3ExAY5V4uOt4qb/R3xZubo9m8lK5wg=
 | 
				
			||||||
gopkg.in/ini.v1 v1.46.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					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.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww=
 | 
					gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww=
 | 
				
			||||||
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 h1:P5y5shSkb0CFe44qEeMBgn8JLow09MP17jlJHanke5g=
 | 
					gopkg.in/ini.v1 v1.60.1 h1:P5y5shSkb0CFe44qEeMBgn8JLow09MP17jlJHanke5g=
 | 
				
			||||||
| 
						 | 
					@ -1021,7 +1192,7 @@ gopkg.in/ini.v1 v1.60.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ldap.v3 v3.0.2 h1:R6RBtabK6e1GO0eQKtkyOFbAHO73QesLzI2w2DZ6b9w=
 | 
					gopkg.in/ldap.v3 v3.0.2 h1:R6RBtabK6e1GO0eQKtkyOFbAHO73QesLzI2w2DZ6b9w=
 | 
				
			||||||
gopkg.in/ldap.v3 v3.0.2/go.mod h1:oxD7NyBuxchC+SgJDE1Q5Od05eGt29SDQVBmV+HYbzw=
 | 
					gopkg.in/ldap.v3 v3.0.2/go.mod h1:oxD7NyBuxchC+SgJDE1Q5Od05eGt29SDQVBmV+HYbzw=
 | 
				
			||||||
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 | 
					gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 | 
				
			||||||
gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
 | 
					gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
 | 
				
			||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 | 
					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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 | 
				
			||||||
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
 | 
					gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
 | 
				
			||||||
| 
						 | 
					@ -1034,10 +1205,16 @@ gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.8/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 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
					honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
					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-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.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
 | 
					honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 | 
				
			||||||
 | 
					honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
 | 
				
			||||||
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
 | 
					k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
 | 
				
			||||||
mvdan.cc/xurls/v2 v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=
 | 
					mvdan.cc/xurls/v2 v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=
 | 
				
			||||||
mvdan.cc/xurls/v2 v2.1.0/go.mod h1:5GrSd9rOnKOpZaji1OZLYL/yeAAtGDlo/cFe+8K5n8E=
 | 
					mvdan.cc/xurls/v2 v2.1.0/go.mod h1:5GrSd9rOnKOpZaji1OZLYL/yeAAtGDlo/cFe+8K5n8E=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "metadata",
 | 
				
			||||||
 | 
					  "name_pretty": "Google Compute Engine Metadata API",
 | 
				
			||||||
 | 
					  "product_documentation": "https://cloud.google.com/compute/docs/storing-retrieving-metadata",
 | 
				
			||||||
 | 
					  "client_documentation": "https://godoc.org/cloud.google.com/go/compute/metadata",
 | 
				
			||||||
 | 
					  "release_level": "ga",
 | 
				
			||||||
 | 
					  "language": "go",
 | 
				
			||||||
 | 
					  "repo": "googleapis/google-cloud-go",
 | 
				
			||||||
 | 
					  "distribution_name": "cloud.google.com/go/compute/metadata",
 | 
				
			||||||
 | 
					  "api_id": "compute:metadata",
 | 
				
			||||||
 | 
					  "requires_billing": false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					bin/
 | 
				
			||||||
 | 
					.idea/
 | 
				
			||||||
 | 
					# Binaries for programs and plugins
 | 
				
			||||||
 | 
					*.exe
 | 
				
			||||||
 | 
					*.exe~
 | 
				
			||||||
 | 
					*.dll
 | 
				
			||||||
 | 
					*.so
 | 
				
			||||||
 | 
					*.dylib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Test binary, built with `go test -c`
 | 
				
			||||||
 | 
					*.test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Output of the go coverage tool, specifically when used with LiteIDE
 | 
				
			||||||
 | 
					*.out
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,14 +1,18 @@
 | 
				
			||||||
 | 
					dist: bionic
 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
 | 
					env: GO111MODULE=on GOFLAGS='-mod vendor'
 | 
				
			||||||
 | 
					install: true
 | 
				
			||||||
 | 
					email: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
  - 1.1
 | 
					  - 1.10
 | 
				
			||||||
  - 1.2
 | 
					  - 1.11
 | 
				
			||||||
  - 1.3
 | 
					  - 1.12
 | 
				
			||||||
  - 1.4
 | 
					  - 1.13
 | 
				
			||||||
  - 1.5
 | 
					 | 
				
			||||||
  - 1.6
 | 
					 | 
				
			||||||
  - tip
 | 
					  - tip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
notifications:
 | 
					before_script:
 | 
				
			||||||
  email:
 | 
					  - go install github.com/golangci/golangci-lint/cmd/golangci-lint
 | 
				
			||||||
    - bwatas@gmail.com
 | 
					script:
 | 
				
			||||||
 | 
					  - golangci-lint run       # run a bunch of code checkers/linters in parallel
 | 
				
			||||||
 | 
					  - go test -v -race ./...  # Run all the tests with the race detector enabled
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,7 @@ If you don't know what to do, there are some features and functions that need to
 | 
				
			||||||
- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
 | 
					- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
 | 
				
			||||||
- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
 | 
					- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
 | 
				
			||||||
- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
 | 
					- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
 | 
				
			||||||
- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
 | 
					- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
 | 
				
			||||||
- [ ] Implement fuzzing testing
 | 
					- [ ] Implement fuzzing testing
 | 
				
			||||||
- [ ] Implement some struct/map/array utilities
 | 
					- [ ] Implement some struct/map/array utilities
 | 
				
			||||||
- [ ] Implement map/array validation
 | 
					- [ ] Implement map/array validation
 | 
				
			||||||
| 
						 | 
					@ -37,7 +37,7 @@ Anyone can file an expense. If the expense makes sense for the development of th
 | 
				
			||||||
### Contributors
 | 
					### Contributors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Thank you to all the people who have already contributed to govalidator!
 | 
					Thank you to all the people who have already contributed to govalidator!
 | 
				
			||||||
<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
 | 
					<a href="https://github.com/asaskevich/govalidator/graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Backers
 | 
					### Backers
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,7 +13,7 @@ Type the following command in your terminal:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
or you can get specified release of the package with `gopkg.in`:
 | 
					or you can get specified release of the package with `gopkg.in`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	go get gopkg.in/asaskevich/govalidator.v4
 | 
						go get gopkg.in/asaskevich/govalidator.v10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
After it the package is ready to use.
 | 
					After it the package is ready to use.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,14 +83,14 @@ This was changed to prevent data races when accessing custom validators.
 | 
				
			||||||
import "github.com/asaskevich/govalidator"
 | 
					import "github.com/asaskevich/govalidator"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// before
 | 
					// before
 | 
				
			||||||
govalidator.CustomTypeTagMap["customByteArrayValidator"] = CustomTypeValidator(func(i interface{}, o interface{}) bool {
 | 
					govalidator.CustomTypeTagMap["customByteArrayValidator"] = func(i interface{}, o interface{}) bool {
 | 
				
			||||||
  // ...
 | 
					  // ...
 | 
				
			||||||
})
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// after
 | 
					// after
 | 
				
			||||||
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, o interface{}) bool {
 | 
					govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, o interface{}) bool {
 | 
				
			||||||
  // ...
 | 
					  // ...
 | 
				
			||||||
}))
 | 
					})
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### List of functions:
 | 
					#### List of functions:
 | 
				
			||||||
| 
						 | 
					@ -108,23 +108,34 @@ func Filter(array []interface{}, iterator ConditionIterator) []interface{}
 | 
				
			||||||
func Find(array []interface{}, iterator ConditionIterator) interface{}
 | 
					func Find(array []interface{}, iterator ConditionIterator) interface{}
 | 
				
			||||||
func GetLine(s string, index int) (string, error)
 | 
					func GetLine(s string, index int) (string, error)
 | 
				
			||||||
func GetLines(s string) []string
 | 
					func GetLines(s string) []string
 | 
				
			||||||
func InRange(value, left, right float64) bool
 | 
					func HasLowerCase(str string) bool
 | 
				
			||||||
 | 
					func HasUpperCase(str string) bool
 | 
				
			||||||
 | 
					func HasWhitespace(str string) bool
 | 
				
			||||||
 | 
					func HasWhitespaceOnly(str string) bool
 | 
				
			||||||
 | 
					func InRange(value interface{}, left interface{}, right interface{}) bool
 | 
				
			||||||
 | 
					func InRangeFloat32(value, left, right float32) bool
 | 
				
			||||||
 | 
					func InRangeFloat64(value, left, right float64) bool
 | 
				
			||||||
 | 
					func InRangeInt(value, left, right interface{}) bool
 | 
				
			||||||
func IsASCII(str string) bool
 | 
					func IsASCII(str string) bool
 | 
				
			||||||
func IsAlpha(str string) bool
 | 
					func IsAlpha(str string) bool
 | 
				
			||||||
func IsAlphanumeric(str string) bool
 | 
					func IsAlphanumeric(str string) bool
 | 
				
			||||||
func IsBase64(str string) bool
 | 
					func IsBase64(str string) bool
 | 
				
			||||||
func IsByteLength(str string, min, max int) bool
 | 
					func IsByteLength(str string, min, max int) bool
 | 
				
			||||||
func IsCIDR(str string) bool
 | 
					func IsCIDR(str string) bool
 | 
				
			||||||
 | 
					func IsCRC32(str string) bool
 | 
				
			||||||
 | 
					func IsCRC32b(str string) bool
 | 
				
			||||||
func IsCreditCard(str string) bool
 | 
					func IsCreditCard(str string) bool
 | 
				
			||||||
func IsDNSName(str string) bool
 | 
					func IsDNSName(str string) bool
 | 
				
			||||||
func IsDataURI(str string) bool
 | 
					func IsDataURI(str string) bool
 | 
				
			||||||
func IsDialString(str string) bool
 | 
					func IsDialString(str string) bool
 | 
				
			||||||
func IsDivisibleBy(str, num string) bool
 | 
					func IsDivisibleBy(str, num string) bool
 | 
				
			||||||
func IsEmail(str string) bool
 | 
					func IsEmail(str string) bool
 | 
				
			||||||
 | 
					func IsExistingEmail(email string) bool
 | 
				
			||||||
func IsFilePath(str string) (bool, int)
 | 
					func IsFilePath(str string) (bool, int)
 | 
				
			||||||
func IsFloat(str string) bool
 | 
					func IsFloat(str string) bool
 | 
				
			||||||
func IsFullWidth(str string) bool
 | 
					func IsFullWidth(str string) bool
 | 
				
			||||||
func IsHalfWidth(str string) bool
 | 
					func IsHalfWidth(str string) bool
 | 
				
			||||||
 | 
					func IsHash(str string, algorithm string) bool
 | 
				
			||||||
func IsHexadecimal(str string) bool
 | 
					func IsHexadecimal(str string) bool
 | 
				
			||||||
func IsHexcolor(str string) bool
 | 
					func IsHexcolor(str string) bool
 | 
				
			||||||
func IsHost(str string) bool
 | 
					func IsHost(str string) bool
 | 
				
			||||||
| 
						 | 
					@ -136,22 +147,27 @@ func IsISBN10(str string) bool
 | 
				
			||||||
func IsISBN13(str string) bool
 | 
					func IsISBN13(str string) bool
 | 
				
			||||||
func IsISO3166Alpha2(str string) bool
 | 
					func IsISO3166Alpha2(str string) bool
 | 
				
			||||||
func IsISO3166Alpha3(str string) bool
 | 
					func IsISO3166Alpha3(str string) bool
 | 
				
			||||||
 | 
					func IsISO4217(str string) bool
 | 
				
			||||||
func IsISO693Alpha2(str string) bool
 | 
					func IsISO693Alpha2(str string) bool
 | 
				
			||||||
func IsISO693Alpha3b(str string) bool
 | 
					func IsISO693Alpha3b(str string) bool
 | 
				
			||||||
func IsISO4217(str string) bool
 | 
					 | 
				
			||||||
func IsIn(str string, params ...string) bool
 | 
					func IsIn(str string, params ...string) bool
 | 
				
			||||||
 | 
					func IsInRaw(str string, params ...string) bool
 | 
				
			||||||
func IsInt(str string) bool
 | 
					func IsInt(str string) bool
 | 
				
			||||||
func IsJSON(str string) bool
 | 
					func IsJSON(str string) bool
 | 
				
			||||||
func IsLatitude(str string) bool
 | 
					func IsLatitude(str string) bool
 | 
				
			||||||
func IsLongitude(str string) bool
 | 
					func IsLongitude(str string) bool
 | 
				
			||||||
func IsLowerCase(str string) bool
 | 
					func IsLowerCase(str string) bool
 | 
				
			||||||
func IsMAC(str string) bool
 | 
					func IsMAC(str string) bool
 | 
				
			||||||
 | 
					func IsMD4(str string) bool
 | 
				
			||||||
 | 
					func IsMD5(str string) bool
 | 
				
			||||||
 | 
					func IsMagnetURI(str string) bool
 | 
				
			||||||
func IsMongoID(str string) bool
 | 
					func IsMongoID(str string) bool
 | 
				
			||||||
func IsMultibyte(str string) bool
 | 
					func IsMultibyte(str string) bool
 | 
				
			||||||
func IsNatural(value float64) bool
 | 
					func IsNatural(value float64) bool
 | 
				
			||||||
func IsNegative(value float64) bool
 | 
					func IsNegative(value float64) bool
 | 
				
			||||||
func IsNonNegative(value float64) bool
 | 
					func IsNonNegative(value float64) bool
 | 
				
			||||||
func IsNonPositive(value float64) bool
 | 
					func IsNonPositive(value float64) bool
 | 
				
			||||||
 | 
					func IsNotNull(str string) bool
 | 
				
			||||||
func IsNull(str string) bool
 | 
					func IsNull(str string) bool
 | 
				
			||||||
func IsNumeric(str string) bool
 | 
					func IsNumeric(str string) bool
 | 
				
			||||||
func IsPort(str string) bool
 | 
					func IsPort(str string) bool
 | 
				
			||||||
| 
						 | 
					@ -162,9 +178,21 @@ func IsRFC3339WithoutZone(str string) bool
 | 
				
			||||||
func IsRGBcolor(str string) bool
 | 
					func IsRGBcolor(str string) bool
 | 
				
			||||||
func IsRequestURI(rawurl string) bool
 | 
					func IsRequestURI(rawurl string) bool
 | 
				
			||||||
func IsRequestURL(rawurl string) bool
 | 
					func IsRequestURL(rawurl string) bool
 | 
				
			||||||
 | 
					func IsRipeMD128(str string) bool
 | 
				
			||||||
 | 
					func IsRipeMD160(str string) bool
 | 
				
			||||||
 | 
					func IsRsaPub(str string, params ...string) bool
 | 
				
			||||||
 | 
					func IsRsaPublicKey(str string, keylen int) bool
 | 
				
			||||||
 | 
					func IsSHA1(str string) bool
 | 
				
			||||||
 | 
					func IsSHA256(str string) bool
 | 
				
			||||||
 | 
					func IsSHA384(str string) bool
 | 
				
			||||||
 | 
					func IsSHA512(str string) bool
 | 
				
			||||||
func IsSSN(str string) bool
 | 
					func IsSSN(str string) bool
 | 
				
			||||||
func IsSemver(str string) bool
 | 
					func IsSemver(str string) bool
 | 
				
			||||||
 | 
					func IsTiger128(str string) bool
 | 
				
			||||||
 | 
					func IsTiger160(str string) bool
 | 
				
			||||||
 | 
					func IsTiger192(str string) bool
 | 
				
			||||||
func IsTime(str string, format string) bool
 | 
					func IsTime(str string, format string) bool
 | 
				
			||||||
 | 
					func IsType(v interface{}, params ...string) bool
 | 
				
			||||||
func IsURL(str string) bool
 | 
					func IsURL(str string) bool
 | 
				
			||||||
func IsUTFDigit(str string) bool
 | 
					func IsUTFDigit(str string) bool
 | 
				
			||||||
func IsUTFLetter(str string) bool
 | 
					func IsUTFLetter(str string) bool
 | 
				
			||||||
| 
						 | 
					@ -174,16 +202,20 @@ func IsUUID(str string) bool
 | 
				
			||||||
func IsUUIDv3(str string) bool
 | 
					func IsUUIDv3(str string) bool
 | 
				
			||||||
func IsUUIDv4(str string) bool
 | 
					func IsUUIDv4(str string) bool
 | 
				
			||||||
func IsUUIDv5(str string) bool
 | 
					func IsUUIDv5(str string) bool
 | 
				
			||||||
 | 
					func IsUnixTime(str string) bool
 | 
				
			||||||
func IsUpperCase(str string) bool
 | 
					func IsUpperCase(str string) bool
 | 
				
			||||||
func IsVariableWidth(str string) bool
 | 
					func IsVariableWidth(str string) bool
 | 
				
			||||||
func IsWhole(value float64) bool
 | 
					func IsWhole(value float64) bool
 | 
				
			||||||
func LeftTrim(str, chars string) string
 | 
					func LeftTrim(str, chars string) string
 | 
				
			||||||
func Map(array []interface{}, iterator ResultIterator) []interface{}
 | 
					func Map(array []interface{}, iterator ResultIterator) []interface{}
 | 
				
			||||||
func Matches(str, pattern string) bool
 | 
					func Matches(str, pattern string) bool
 | 
				
			||||||
 | 
					func MaxStringLength(str string, params ...string) bool
 | 
				
			||||||
 | 
					func MinStringLength(str string, params ...string) bool
 | 
				
			||||||
func NormalizeEmail(str string) (string, error)
 | 
					func NormalizeEmail(str string) (string, error)
 | 
				
			||||||
func PadBoth(str string, padStr string, padLen int) string
 | 
					func PadBoth(str string, padStr string, padLen int) string
 | 
				
			||||||
func PadLeft(str string, padStr string, padLen int) string
 | 
					func PadLeft(str string, padStr string, padLen int) string
 | 
				
			||||||
func PadRight(str string, padStr string, padLen int) string
 | 
					func PadRight(str string, padStr string, padLen int) string
 | 
				
			||||||
 | 
					func PrependPathToErrors(err error, path string) error
 | 
				
			||||||
func Range(str string, params ...string) bool
 | 
					func Range(str string, params ...string) bool
 | 
				
			||||||
func RemoveTags(s string) string
 | 
					func RemoveTags(s string) string
 | 
				
			||||||
func ReplacePattern(str, pattern, replace string) string
 | 
					func ReplacePattern(str, pattern, replace string) string
 | 
				
			||||||
| 
						 | 
					@ -192,18 +224,21 @@ func RightTrim(str, chars string) string
 | 
				
			||||||
func RuneLength(str string, params ...string) bool
 | 
					func RuneLength(str string, params ...string) bool
 | 
				
			||||||
func SafeFileName(str string) string
 | 
					func SafeFileName(str string) string
 | 
				
			||||||
func SetFieldsRequiredByDefault(value bool)
 | 
					func SetFieldsRequiredByDefault(value bool)
 | 
				
			||||||
 | 
					func SetNilPtrAllowedByRequired(value bool)
 | 
				
			||||||
func Sign(value float64) float64
 | 
					func Sign(value float64) float64
 | 
				
			||||||
func StringLength(str string, params ...string) bool
 | 
					func StringLength(str string, params ...string) bool
 | 
				
			||||||
func StringMatches(s string, params ...string) bool
 | 
					func StringMatches(s string, params ...string) bool
 | 
				
			||||||
func StripLow(str string, keepNewLines bool) string
 | 
					func StripLow(str string, keepNewLines bool) string
 | 
				
			||||||
func ToBoolean(str string) (bool, error)
 | 
					func ToBoolean(str string) (bool, error)
 | 
				
			||||||
func ToFloat(str string) (float64, error)
 | 
					func ToFloat(str string) (float64, error)
 | 
				
			||||||
func ToInt(str string) (int64, error)
 | 
					func ToInt(value interface{}) (res int64, err error)
 | 
				
			||||||
func ToJSON(obj interface{}) (string, error)
 | 
					func ToJSON(obj interface{}) (string, error)
 | 
				
			||||||
func ToString(obj interface{}) string
 | 
					func ToString(obj interface{}) string
 | 
				
			||||||
func Trim(str, chars string) string
 | 
					func Trim(str, chars string) string
 | 
				
			||||||
func Truncate(str string, length int, ending string) string
 | 
					func Truncate(str string, length int, ending string) string
 | 
				
			||||||
 | 
					func TruncatingErrorf(str string, args ...interface{}) error
 | 
				
			||||||
func UnderscoreToCamelCase(s string) string
 | 
					func UnderscoreToCamelCase(s string) string
 | 
				
			||||||
 | 
					func ValidateMap(inputMap map[string]interface{}, validationMap map[string]interface{}) (bool, error)
 | 
				
			||||||
func ValidateStruct(s interface{}) (bool, error)
 | 
					func ValidateStruct(s interface{}) (bool, error)
 | 
				
			||||||
func WhiteList(str, chars string) string
 | 
					func WhiteList(str, chars string) string
 | 
				
			||||||
type ConditionIterator
 | 
					type ConditionIterator
 | 
				
			||||||
| 
						 | 
					@ -214,6 +249,8 @@ type Errors
 | 
				
			||||||
func (es Errors) Error() string
 | 
					func (es Errors) Error() string
 | 
				
			||||||
func (es Errors) Errors() []error
 | 
					func (es Errors) Errors() []error
 | 
				
			||||||
type ISO3166Entry
 | 
					type ISO3166Entry
 | 
				
			||||||
 | 
					type ISO693Entry
 | 
				
			||||||
 | 
					type InterfaceParamValidator
 | 
				
			||||||
type Iterator
 | 
					type Iterator
 | 
				
			||||||
type ParamValidator
 | 
					type ParamValidator
 | 
				
			||||||
type ResultIterator
 | 
					type ResultIterator
 | 
				
			||||||
| 
						 | 
					@ -227,6 +264,27 @@ type Validator
 | 
				
			||||||
```go
 | 
					```go
 | 
				
			||||||
println(govalidator.IsURL(`http://user@pass:domain.com/path/page`))
 | 
					println(govalidator.IsURL(`http://user@pass:domain.com/path/page`))
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					###### IsType
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					println(govalidator.IsType("Bob", "string"))
 | 
				
			||||||
 | 
					println(govalidator.IsType(1, "int"))
 | 
				
			||||||
 | 
					i := 1
 | 
				
			||||||
 | 
					println(govalidator.IsType(&i, "*int"))
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IsType can be used through the tag `type` which is essential for map validation:
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					type User	struct {
 | 
				
			||||||
 | 
					  Name string      `valid:"type(string)"`
 | 
				
			||||||
 | 
					  Age  int         `valid:"type(int)"`
 | 
				
			||||||
 | 
					  Meta interface{} `valid:"type(string)"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					result, err := govalidator.ValidateStruct(user{"Bob", 20, "meta"})
 | 
				
			||||||
 | 
					if err != nil {
 | 
				
			||||||
 | 
						println("error: " + err.Error())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					println(result)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
###### ToString
 | 
					###### ToString
 | 
				
			||||||
```go
 | 
					```go
 | 
				
			||||||
type User struct {
 | 
					type User struct {
 | 
				
			||||||
| 
						 | 
					@ -335,6 +393,11 @@ Validators with parameters
 | 
				
			||||||
"in(string1|string2|...|stringN)": IsIn,
 | 
					"in(string1|string2|...|stringN)": IsIn,
 | 
				
			||||||
"rsapub(keylength)" : IsRsaPub,
 | 
					"rsapub(keylength)" : IsRsaPub,
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					Validators with parameters for any type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					"type(type)": IsType,
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
And here is small example of usage:
 | 
					And here is small example of usage:
 | 
				
			||||||
```go
 | 
					```go
 | 
				
			||||||
| 
						 | 
					@ -370,6 +433,41 @@ if err != nil {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
println(result)
 | 
					println(result)
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					###### ValidateMap [#2](https://github.com/asaskevich/govalidator/pull/338)
 | 
				
			||||||
 | 
					If you want to validate maps, you can use the map to be validated and a validation map that contain the same tags used in ValidateStruct, both maps have to be in the form `map[string]interface{}`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So here is small example of usage:
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					var mapTemplate = map[string]interface{}{
 | 
				
			||||||
 | 
						"name":"required,alpha",
 | 
				
			||||||
 | 
						"family":"required,alpha",
 | 
				
			||||||
 | 
						"email":"required,email",
 | 
				
			||||||
 | 
						"cell-phone":"numeric",
 | 
				
			||||||
 | 
						"address":map[string]interface{}{
 | 
				
			||||||
 | 
							"line1":"required,alphanum",
 | 
				
			||||||
 | 
							"line2":"alphanum",
 | 
				
			||||||
 | 
							"postal-code":"numeric",
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var inputMap = map[string]interface{}{
 | 
				
			||||||
 | 
						"name":"Bob",
 | 
				
			||||||
 | 
						"family":"Smith",
 | 
				
			||||||
 | 
						"email":"foo@bar.baz",
 | 
				
			||||||
 | 
						"address":map[string]interface{}{
 | 
				
			||||||
 | 
							"line1":"",
 | 
				
			||||||
 | 
							"line2":"",
 | 
				
			||||||
 | 
							"postal-code":"",
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					result, err := govalidator.ValidateMap(inputMap, mapTemplate)
 | 
				
			||||||
 | 
					if err != nil {
 | 
				
			||||||
 | 
						println("error: " + err.Error())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					println(result)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### WhiteList
 | 
					###### WhiteList
 | 
				
			||||||
```go
 | 
					```go
 | 
				
			||||||
// Remove all characters from string ignoring characters between "a" and "z"
 | 
					// Remove all characters from string ignoring characters between "a" and "z"
 | 
				
			||||||
| 
						 | 
					@ -389,7 +487,7 @@ type StructWithCustomByteArray struct {
 | 
				
			||||||
  CustomMinLength int             `valid:"-"`
 | 
					  CustomMinLength int             `valid:"-"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool {
 | 
					govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, context interface{}) bool {
 | 
				
			||||||
  switch v := context.(type) { // you can type switch on the context interface being validated
 | 
					  switch v := context.(type) { // you can type switch on the context interface being validated
 | 
				
			||||||
  case StructWithCustomByteArray:
 | 
					  case StructWithCustomByteArray:
 | 
				
			||||||
    // you can check and validate against some other field in the context,
 | 
					    // you can check and validate against some other field in the context,
 | 
				
			||||||
| 
						 | 
					@ -409,14 +507,25 @@ govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return false
 | 
					  return false
 | 
				
			||||||
}))
 | 
					})
 | 
				
			||||||
govalidator.CustomTypeTagMap.Set("customMinLengthValidator", CustomTypeValidator(func(i interface{}, context interface{}) bool {
 | 
					govalidator.CustomTypeTagMap.Set("customMinLengthValidator", func(i interface{}, context interface{}) bool {
 | 
				
			||||||
  switch v := context.(type) { // this validates a field against the value in another field, i.e. dependent validation
 | 
					  switch v := context.(type) { // this validates a field against the value in another field, i.e. dependent validation
 | 
				
			||||||
  case StructWithCustomByteArray:
 | 
					  case StructWithCustomByteArray:
 | 
				
			||||||
    return len(v.ID) >= v.CustomMinLength
 | 
					    return len(v.ID) >= v.CustomMinLength
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return false
 | 
					  return false
 | 
				
			||||||
}))
 | 
					})
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					###### Loop over Error()
 | 
				
			||||||
 | 
					By default .Error() returns all errors in a single String. To access each error you can do this:
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					  if err != nil {
 | 
				
			||||||
 | 
					    errs := err.(govalidator.Errors).Errors()
 | 
				
			||||||
 | 
					    for _, e := range errs {
 | 
				
			||||||
 | 
					      fmt.Println(e.Error())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###### Custom error messages
 | 
					###### Custom error messages
 | 
				
			||||||
| 
						 | 
					@ -445,7 +554,7 @@ If you don't know what to do, there are some features and functions that need to
 | 
				
			||||||
- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
 | 
					- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions)
 | 
				
			||||||
- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
 | 
					- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new
 | 
				
			||||||
- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
 | 
					- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc
 | 
				
			||||||
- [ ] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
 | 
					- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224)
 | 
				
			||||||
- [ ] Implement fuzzing testing
 | 
					- [ ] Implement fuzzing testing
 | 
				
			||||||
- [ ] Implement some struct/map/array utilities
 | 
					- [ ] Implement some struct/map/array utilities
 | 
				
			||||||
- [ ] Implement map/array validation
 | 
					- [ ] Implement map/array validation
 | 
				
			||||||
| 
						 | 
					@ -475,7 +584,7 @@ This project exists thanks to all the people who contribute. [[Contribute](CONTR
 | 
				
			||||||
* [Matt Sanford](https://github.com/mzsanford)
 | 
					* [Matt Sanford](https://github.com/mzsanford)
 | 
				
			||||||
* [Simon ccl1115](https://github.com/ccl1115)
 | 
					* [Simon ccl1115](https://github.com/ccl1115)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<a href="graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
 | 
					<a href="https://github.com/asaskevich/govalidator/graphs/contributors"><img src="https://opencollective.com/govalidator/contributors.svg?width=890" /></a>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Backers
 | 
					### Backers
 | 
				
			||||||
| 
						 | 
					@ -504,4 +613,4 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## License
 | 
					## License
 | 
				
			||||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large)
 | 
					[](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					package govalidator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// A package of validators and sanitizers for strings, structures and collections.
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
package govalidator
 | 
					package govalidator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "strings"
 | 
					import (
 | 
				
			||||||
 | 
						"sort"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Errors is an array of multiple errors and conforms to the error interface.
 | 
					// Errors is an array of multiple errors and conforms to the error interface.
 | 
				
			||||||
type Errors []error
 | 
					type Errors []error
 | 
				
			||||||
| 
						 | 
					@ -15,6 +18,7 @@ func (es Errors) Error() string {
 | 
				
			||||||
	for _, e := range es {
 | 
						for _, e := range es {
 | 
				
			||||||
		errs = append(errs, e.Error())
 | 
							errs = append(errs, e.Error())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						sort.Strings(errs)
 | 
				
			||||||
	return strings.Join(errs, ";")
 | 
						return strings.Join(errs, ";")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					module github.com/asaskevich/govalidator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.12
 | 
				
			||||||
| 
						 | 
					@ -4,49 +4,51 @@ import "regexp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Basic regular expressions for validating strings
 | 
					// Basic regular expressions for validating strings
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
    Email             string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
 | 
						Email             string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$"
 | 
				
			||||||
    CreditCard        string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})$"
 | 
						CreditCard        string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$"
 | 
				
			||||||
    ISBN10            string = "^(?:[0-9]{9}X|[0-9]{10})$"
 | 
						ISBN10            string = "^(?:[0-9]{9}X|[0-9]{10})$"
 | 
				
			||||||
    ISBN13            string = "^(?:[0-9]{13})$"
 | 
						ISBN13            string = "^(?:[0-9]{13})$"
 | 
				
			||||||
    UUID3             string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$"
 | 
						UUID3             string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$"
 | 
				
			||||||
    UUID4             string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
 | 
						UUID4             string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
 | 
				
			||||||
    UUID5             string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
 | 
						UUID5             string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
 | 
				
			||||||
    UUID              string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
 | 
						UUID              string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"
 | 
				
			||||||
    Alpha             string = "^[a-zA-Z]+$"
 | 
						Alpha             string = "^[a-zA-Z]+$"
 | 
				
			||||||
    Alphanumeric      string = "^[a-zA-Z0-9]+$"
 | 
						Alphanumeric      string = "^[a-zA-Z0-9]+$"
 | 
				
			||||||
    Numeric           string = "^[0-9]+$"
 | 
						Numeric           string = "^[0-9]+$"
 | 
				
			||||||
    Int               string = "^(?:[-+]?(?:0|[1-9][0-9]*))$"
 | 
						Int               string = "^(?:[-+]?(?:0|[1-9][0-9]*))$"
 | 
				
			||||||
    Float             string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"
 | 
						Float             string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$"
 | 
				
			||||||
    Hexadecimal       string = "^[0-9a-fA-F]+$"
 | 
						Hexadecimal       string = "^[0-9a-fA-F]+$"
 | 
				
			||||||
    Hexcolor          string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
 | 
						Hexcolor          string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"
 | 
				
			||||||
    RGBcolor          string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$"
 | 
						RGBcolor          string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$"
 | 
				
			||||||
    ASCII             string = "^[\x00-\x7F]+$"
 | 
						ASCII             string = "^[\x00-\x7F]+$"
 | 
				
			||||||
    Multibyte         string = "[^\x00-\x7F]"
 | 
						Multibyte         string = "[^\x00-\x7F]"
 | 
				
			||||||
    FullWidth         string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"
 | 
						FullWidth         string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"
 | 
				
			||||||
    HalfWidth         string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"
 | 
						HalfWidth         string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]"
 | 
				
			||||||
    Base64            string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$"
 | 
						Base64            string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$"
 | 
				
			||||||
    PrintableASCII    string = "^[\x20-\x7E]+$"
 | 
						PrintableASCII    string = "^[\x20-\x7E]+$"
 | 
				
			||||||
    DataURI           string = "^data:.+\\/(.+);base64$"
 | 
						DataURI           string = "^data:.+\\/(.+);base64$"
 | 
				
			||||||
    Latitude          string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$"
 | 
						MagnetURI         string = "^magnet:\\?xt=urn:[a-zA-Z0-9]+:[a-zA-Z0-9]{32,40}&dn=.+&tr=.+$"
 | 
				
			||||||
    Longitude         string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"
 | 
						Latitude          string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$"
 | 
				
			||||||
    DNSName           string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$`
 | 
						Longitude         string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$"
 | 
				
			||||||
    IP                string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))`
 | 
						DNSName           string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$`
 | 
				
			||||||
    URLSchema         string = `((ftp|tcp|udp|wss?|https?):\/\/)`
 | 
						IP                string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))`
 | 
				
			||||||
    URLUsername       string = `(\S+(:\S*)?@)`
 | 
						URLSchema         string = `((ftp|tcp|udp|wss?|https?):\/\/)`
 | 
				
			||||||
    URLPath           string = `((\/|\?|#)[^\s]*)`
 | 
						URLUsername       string = `(\S+(:\S*)?@)`
 | 
				
			||||||
    URLPort           string = `(:(\d{1,5}))`
 | 
						URLPath           string = `((\/|\?|#)[^\s]*)`
 | 
				
			||||||
    URLIP             string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3])(\.(1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-4]))`
 | 
						URLPort           string = `(:(\d{1,5}))`
 | 
				
			||||||
	  URLSubdomain      string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))`  
 | 
						URLIP             string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3]|24\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-5]))`
 | 
				
			||||||
    URL               string = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$`
 | 
						URLSubdomain      string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))`
 | 
				
			||||||
    SSN               string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$`
 | 
						URL               string = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$`
 | 
				
			||||||
    WinPath           string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$`
 | 
						SSN               string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$`
 | 
				
			||||||
    UnixPath          string = `^(/[^/\x00]*)+/?$`
 | 
						WinPath           string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$`
 | 
				
			||||||
    Semver            string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$"
 | 
						UnixPath          string = `^(/[^/\x00]*)+/?$`
 | 
				
			||||||
    tagName           string = "valid"
 | 
						Semver            string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$"
 | 
				
			||||||
    hasLowerCase      string = ".*[[:lower:]]"
 | 
						tagName           string = "valid"
 | 
				
			||||||
    hasUpperCase      string = ".*[[:upper:]]"
 | 
						hasLowerCase      string = ".*[[:lower:]]"
 | 
				
			||||||
    hasWhitespace     string = ".*[[:space:]]"
 | 
						hasUpperCase      string = ".*[[:upper:]]"
 | 
				
			||||||
    hasWhitespaceOnly string = "^[[:space:]]+$"
 | 
						hasWhitespace     string = ".*[[:space:]]"
 | 
				
			||||||
 | 
						hasWhitespaceOnly string = "^[[:space:]]+$"
 | 
				
			||||||
 | 
						IMEI              string = "^[0-9a-f]{14}$|^\\d{15}$|^\\d{18}$"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Used by IsFilePath func
 | 
					// Used by IsFilePath func
 | 
				
			||||||
| 
						 | 
					@ -60,42 +62,44 @@ const (
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
    userRegexp            = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$")
 | 
						userRegexp          = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$")
 | 
				
			||||||
    hostRegexp            = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$")
 | 
						hostRegexp          = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$")
 | 
				
			||||||
    userDotRegexp         = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})")
 | 
						userDotRegexp       = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})")
 | 
				
			||||||
    rxEmail               = regexp.MustCompile(Email)
 | 
						rxEmail             = regexp.MustCompile(Email)
 | 
				
			||||||
    rxCreditCard          = regexp.MustCompile(CreditCard)
 | 
						rxCreditCard        = regexp.MustCompile(CreditCard)
 | 
				
			||||||
    rxISBN10              = regexp.MustCompile(ISBN10)
 | 
						rxISBN10            = regexp.MustCompile(ISBN10)
 | 
				
			||||||
    rxISBN13              = regexp.MustCompile(ISBN13)
 | 
						rxISBN13            = regexp.MustCompile(ISBN13)
 | 
				
			||||||
    rxUUID3               = regexp.MustCompile(UUID3)
 | 
						rxUUID3             = regexp.MustCompile(UUID3)
 | 
				
			||||||
    rxUUID4               = regexp.MustCompile(UUID4)
 | 
						rxUUID4             = regexp.MustCompile(UUID4)
 | 
				
			||||||
    rxUUID5               = regexp.MustCompile(UUID5)
 | 
						rxUUID5             = regexp.MustCompile(UUID5)
 | 
				
			||||||
    rxUUID                = regexp.MustCompile(UUID)
 | 
						rxUUID              = regexp.MustCompile(UUID)
 | 
				
			||||||
    rxAlpha               = regexp.MustCompile(Alpha)
 | 
						rxAlpha             = regexp.MustCompile(Alpha)
 | 
				
			||||||
    rxAlphanumeric        = regexp.MustCompile(Alphanumeric)
 | 
						rxAlphanumeric      = regexp.MustCompile(Alphanumeric)
 | 
				
			||||||
    rxNumeric             = regexp.MustCompile(Numeric)
 | 
						rxNumeric           = regexp.MustCompile(Numeric)
 | 
				
			||||||
    rxInt                 = regexp.MustCompile(Int)
 | 
						rxInt               = regexp.MustCompile(Int)
 | 
				
			||||||
    rxFloat               = regexp.MustCompile(Float)
 | 
						rxFloat             = regexp.MustCompile(Float)
 | 
				
			||||||
    rxHexadecimal         = regexp.MustCompile(Hexadecimal)
 | 
						rxHexadecimal       = regexp.MustCompile(Hexadecimal)
 | 
				
			||||||
    rxHexcolor            = regexp.MustCompile(Hexcolor)
 | 
						rxHexcolor          = regexp.MustCompile(Hexcolor)
 | 
				
			||||||
    rxRGBcolor            = regexp.MustCompile(RGBcolor)
 | 
						rxRGBcolor          = regexp.MustCompile(RGBcolor)
 | 
				
			||||||
    rxASCII               = regexp.MustCompile(ASCII)
 | 
						rxASCII             = regexp.MustCompile(ASCII)
 | 
				
			||||||
    rxPrintableASCII      = regexp.MustCompile(PrintableASCII)
 | 
						rxPrintableASCII    = regexp.MustCompile(PrintableASCII)
 | 
				
			||||||
    rxMultibyte           = regexp.MustCompile(Multibyte)
 | 
						rxMultibyte         = regexp.MustCompile(Multibyte)
 | 
				
			||||||
    rxFullWidth           = regexp.MustCompile(FullWidth)
 | 
						rxFullWidth         = regexp.MustCompile(FullWidth)
 | 
				
			||||||
    rxHalfWidth           = regexp.MustCompile(HalfWidth)
 | 
						rxHalfWidth         = regexp.MustCompile(HalfWidth)
 | 
				
			||||||
    rxBase64              = regexp.MustCompile(Base64)
 | 
						rxBase64            = regexp.MustCompile(Base64)
 | 
				
			||||||
    rxDataURI             = regexp.MustCompile(DataURI)
 | 
						rxDataURI           = regexp.MustCompile(DataURI)
 | 
				
			||||||
    rxLatitude            = regexp.MustCompile(Latitude)
 | 
						rxMagnetURI         = regexp.MustCompile(MagnetURI)
 | 
				
			||||||
    rxLongitude           = regexp.MustCompile(Longitude)
 | 
						rxLatitude          = regexp.MustCompile(Latitude)
 | 
				
			||||||
    rxDNSName             = regexp.MustCompile(DNSName)
 | 
						rxLongitude         = regexp.MustCompile(Longitude)
 | 
				
			||||||
    rxURL                 = regexp.MustCompile(URL)
 | 
						rxDNSName           = regexp.MustCompile(DNSName)
 | 
				
			||||||
    rxSSN                 = regexp.MustCompile(SSN)
 | 
						rxURL               = regexp.MustCompile(URL)
 | 
				
			||||||
    rxWinPath             = regexp.MustCompile(WinPath)
 | 
						rxSSN               = regexp.MustCompile(SSN)
 | 
				
			||||||
    rxUnixPath            = regexp.MustCompile(UnixPath)
 | 
						rxWinPath           = regexp.MustCompile(WinPath)
 | 
				
			||||||
    rxSemver              = regexp.MustCompile(Semver)
 | 
						rxUnixPath          = regexp.MustCompile(UnixPath)
 | 
				
			||||||
    rxHasLowerCase        = regexp.MustCompile(hasLowerCase)
 | 
						rxSemver            = regexp.MustCompile(Semver)
 | 
				
			||||||
    rxHasUpperCase        = regexp.MustCompile(hasUpperCase)
 | 
						rxHasLowerCase      = regexp.MustCompile(hasLowerCase)
 | 
				
			||||||
    rxHasWhitespace       = regexp.MustCompile(hasWhitespace)
 | 
						rxHasUpperCase      = regexp.MustCompile(hasUpperCase)
 | 
				
			||||||
    rxHasWhitespaceOnly   = regexp.MustCompile(hasWhitespaceOnly)
 | 
						rxHasWhitespace     = regexp.MustCompile(hasWhitespace)
 | 
				
			||||||
 | 
						rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly)
 | 
				
			||||||
 | 
						rxIMEI              = regexp.MustCompile(IMEI)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@ type CustomTypeValidator func(i interface{}, o interface{}) bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ParamValidator is a wrapper for validator functions that accepts additional parameters.
 | 
					// ParamValidator is a wrapper for validator functions that accepts additional parameters.
 | 
				
			||||||
type ParamValidator func(str string, params ...string) bool
 | 
					type ParamValidator func(str string, params ...string) bool
 | 
				
			||||||
 | 
					type InterfaceParamValidator func(in interface{}, params ...string) bool
 | 
				
			||||||
type tagOptionsMap map[string]tagOption
 | 
					type tagOptionsMap map[string]tagOption
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (t tagOptionsMap) orderedKeys() []string {
 | 
					func (t tagOptionsMap) orderedKeys() []string {
 | 
				
			||||||
| 
						 | 
					@ -46,15 +47,27 @@ type UnsupportedTypeError struct {
 | 
				
			||||||
// It implements the methods to sort by string.
 | 
					// It implements the methods to sort by string.
 | 
				
			||||||
type stringValues []reflect.Value
 | 
					type stringValues []reflect.Value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InterfaceParamTagMap is a map of functions accept variants parameters for an interface value
 | 
				
			||||||
 | 
					var InterfaceParamTagMap = map[string]InterfaceParamValidator{
 | 
				
			||||||
 | 
						"type": IsType,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// InterfaceParamTagRegexMap maps interface param tags to their respective regexes.
 | 
				
			||||||
 | 
					var InterfaceParamTagRegexMap = map[string]*regexp.Regexp{
 | 
				
			||||||
 | 
						"type": regexp.MustCompile(`^type\((.*)\)$`),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ParamTagMap is a map of functions accept variants parameters
 | 
					// ParamTagMap is a map of functions accept variants parameters
 | 
				
			||||||
var ParamTagMap = map[string]ParamValidator{
 | 
					var ParamTagMap = map[string]ParamValidator{
 | 
				
			||||||
	"length":       ByteLength,
 | 
						"length":          ByteLength,
 | 
				
			||||||
	"range":        Range,
 | 
						"range":           Range,
 | 
				
			||||||
	"runelength":   RuneLength,
 | 
						"runelength":      RuneLength,
 | 
				
			||||||
	"stringlength": StringLength,
 | 
						"stringlength":    StringLength,
 | 
				
			||||||
	"matches":      StringMatches,
 | 
						"matches":         StringMatches,
 | 
				
			||||||
	"in":           isInRaw,
 | 
						"in":              IsInRaw,
 | 
				
			||||||
	"rsapub":       IsRsaPub,
 | 
						"rsapub":          IsRsaPub,
 | 
				
			||||||
 | 
						"minstringlength": MinStringLength,
 | 
				
			||||||
 | 
						"maxstringlength": MaxStringLength,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ParamTagRegexMap maps param tags to their respective regexes.
 | 
					// ParamTagRegexMap maps param tags to their respective regexes.
 | 
				
			||||||
| 
						 | 
					@ -66,6 +79,8 @@ var ParamTagRegexMap = map[string]*regexp.Regexp{
 | 
				
			||||||
	"in":           regexp.MustCompile(`^in\((.*)\)`),
 | 
						"in":           regexp.MustCompile(`^in\((.*)\)`),
 | 
				
			||||||
	"matches":      regexp.MustCompile(`^matches\((.+)\)$`),
 | 
						"matches":      regexp.MustCompile(`^matches\((.+)\)$`),
 | 
				
			||||||
	"rsapub":       regexp.MustCompile("^rsapub\\((\\d+)\\)$"),
 | 
						"rsapub":       regexp.MustCompile("^rsapub\\((\\d+)\\)$"),
 | 
				
			||||||
 | 
						"minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"),
 | 
				
			||||||
 | 
						"maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type customTypeTagMap struct {
 | 
					type customTypeTagMap struct {
 | 
				
			||||||
| 
						 | 
					@ -114,6 +129,7 @@ var TagMap = map[string]Validator{
 | 
				
			||||||
	"int":                IsInt,
 | 
						"int":                IsInt,
 | 
				
			||||||
	"float":              IsFloat,
 | 
						"float":              IsFloat,
 | 
				
			||||||
	"null":               IsNull,
 | 
						"null":               IsNull,
 | 
				
			||||||
 | 
						"notnull":            IsNotNull,
 | 
				
			||||||
	"uuid":               IsUUID,
 | 
						"uuid":               IsUUID,
 | 
				
			||||||
	"uuidv3":             IsUUIDv3,
 | 
						"uuidv3":             IsUUIDv3,
 | 
				
			||||||
	"uuidv4":             IsUUIDv4,
 | 
						"uuidv4":             IsUUIDv4,
 | 
				
			||||||
| 
						 | 
					@ -146,6 +162,7 @@ var TagMap = map[string]Validator{
 | 
				
			||||||
	"ISO3166Alpha2":      IsISO3166Alpha2,
 | 
						"ISO3166Alpha2":      IsISO3166Alpha2,
 | 
				
			||||||
	"ISO3166Alpha3":      IsISO3166Alpha3,
 | 
						"ISO3166Alpha3":      IsISO3166Alpha3,
 | 
				
			||||||
	"ISO4217":            IsISO4217,
 | 
						"ISO4217":            IsISO4217,
 | 
				
			||||||
 | 
						"IMEI":               IsIMEI,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ISO3166Entry stores country codes
 | 
					// ISO3166Entry stores country codes
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,20 +12,20 @@ import (
 | 
				
			||||||
	"unicode/utf8"
 | 
						"unicode/utf8"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Contains check if the string contains the substring.
 | 
					// Contains checks if the string contains the substring.
 | 
				
			||||||
func Contains(str, substring string) bool {
 | 
					func Contains(str, substring string) bool {
 | 
				
			||||||
	return strings.Contains(str, substring)
 | 
						return strings.Contains(str, substring)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Matches check if string matches the pattern (pattern is regular expression)
 | 
					// Matches checks if string matches the pattern (pattern is regular expression)
 | 
				
			||||||
// In case of error return false
 | 
					// In case of error return false
 | 
				
			||||||
func Matches(str, pattern string) bool {
 | 
					func Matches(str, pattern string) bool {
 | 
				
			||||||
	match, _ := regexp.MatchString(pattern, str)
 | 
						match, _ := regexp.MatchString(pattern, str)
 | 
				
			||||||
	return match
 | 
						return match
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LeftTrim trim characters from the left-side of the input.
 | 
					// LeftTrim trims characters from the left side of the input.
 | 
				
			||||||
// If second argument is empty, it's will be remove leading spaces.
 | 
					// If second argument is empty, it will remove leading spaces.
 | 
				
			||||||
func LeftTrim(str, chars string) string {
 | 
					func LeftTrim(str, chars string) string {
 | 
				
			||||||
	if chars == "" {
 | 
						if chars == "" {
 | 
				
			||||||
		return strings.TrimLeftFunc(str, unicode.IsSpace)
 | 
							return strings.TrimLeftFunc(str, unicode.IsSpace)
 | 
				
			||||||
| 
						 | 
					@ -34,8 +34,8 @@ func LeftTrim(str, chars string) string {
 | 
				
			||||||
	return r.ReplaceAllString(str, "")
 | 
						return r.ReplaceAllString(str, "")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RightTrim trim characters from the right-side of the input.
 | 
					// RightTrim trims characters from the right side of the input.
 | 
				
			||||||
// If second argument is empty, it's will be remove spaces.
 | 
					// If second argument is empty, it will remove trailing spaces.
 | 
				
			||||||
func RightTrim(str, chars string) string {
 | 
					func RightTrim(str, chars string) string {
 | 
				
			||||||
	if chars == "" {
 | 
						if chars == "" {
 | 
				
			||||||
		return strings.TrimRightFunc(str, unicode.IsSpace)
 | 
							return strings.TrimRightFunc(str, unicode.IsSpace)
 | 
				
			||||||
| 
						 | 
					@ -44,27 +44,27 @@ func RightTrim(str, chars string) string {
 | 
				
			||||||
	return r.ReplaceAllString(str, "")
 | 
						return r.ReplaceAllString(str, "")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Trim trim characters from both sides of the input.
 | 
					// Trim trims characters from both sides of the input.
 | 
				
			||||||
// If second argument is empty, it's will be remove spaces.
 | 
					// If second argument is empty, it will remove spaces.
 | 
				
			||||||
func Trim(str, chars string) string {
 | 
					func Trim(str, chars string) string {
 | 
				
			||||||
	return LeftTrim(RightTrim(str, chars), chars)
 | 
						return LeftTrim(RightTrim(str, chars), chars)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WhiteList remove characters that do not appear in the whitelist.
 | 
					// WhiteList removes characters that do not appear in the whitelist.
 | 
				
			||||||
func WhiteList(str, chars string) string {
 | 
					func WhiteList(str, chars string) string {
 | 
				
			||||||
	pattern := "[^" + chars + "]+"
 | 
						pattern := "[^" + chars + "]+"
 | 
				
			||||||
	r, _ := regexp.Compile(pattern)
 | 
						r, _ := regexp.Compile(pattern)
 | 
				
			||||||
	return r.ReplaceAllString(str, "")
 | 
						return r.ReplaceAllString(str, "")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// BlackList remove characters that appear in the blacklist.
 | 
					// BlackList removes characters that appear in the blacklist.
 | 
				
			||||||
func BlackList(str, chars string) string {
 | 
					func BlackList(str, chars string) string {
 | 
				
			||||||
	pattern := "[" + chars + "]+"
 | 
						pattern := "[" + chars + "]+"
 | 
				
			||||||
	r, _ := regexp.Compile(pattern)
 | 
						r, _ := regexp.Compile(pattern)
 | 
				
			||||||
	return r.ReplaceAllString(str, "")
 | 
						return r.ReplaceAllString(str, "")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// StripLow remove characters with a numerical value < 32 and 127, mostly control characters.
 | 
					// StripLow removes characters with a numerical value < 32 and 127, mostly control characters.
 | 
				
			||||||
// If keep_new_lines is true, newline characters are preserved (\n and \r, hex 0xA and 0xD).
 | 
					// If keep_new_lines is true, newline characters are preserved (\n and \r, hex 0xA and 0xD).
 | 
				
			||||||
func StripLow(str string, keepNewLines bool) string {
 | 
					func StripLow(str string, keepNewLines bool) string {
 | 
				
			||||||
	chars := ""
 | 
						chars := ""
 | 
				
			||||||
| 
						 | 
					@ -76,13 +76,13 @@ func StripLow(str string, keepNewLines bool) string {
 | 
				
			||||||
	return BlackList(str, chars)
 | 
						return BlackList(str, chars)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ReplacePattern replace regular expression pattern in string
 | 
					// ReplacePattern replaces regular expression pattern in string
 | 
				
			||||||
func ReplacePattern(str, pattern, replace string) string {
 | 
					func ReplacePattern(str, pattern, replace string) string {
 | 
				
			||||||
	r, _ := regexp.Compile(pattern)
 | 
						r, _ := regexp.Compile(pattern)
 | 
				
			||||||
	return r.ReplaceAllString(str, replace)
 | 
						return r.ReplaceAllString(str, replace)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Escape replace <, >, & and " with HTML entities.
 | 
					// Escape replaces <, >, & and " with HTML entities.
 | 
				
			||||||
var Escape = html.EscapeString
 | 
					var Escape = html.EscapeString
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func addSegment(inrune, segment []rune) []rune {
 | 
					func addSegment(inrune, segment []rune) []rune {
 | 
				
			||||||
| 
						 | 
					@ -120,7 +120,7 @@ func CamelCaseToUnderscore(str string) string {
 | 
				
			||||||
	return string(output)
 | 
						return string(output)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Reverse return reversed string
 | 
					// Reverse returns reversed string
 | 
				
			||||||
func Reverse(s string) string {
 | 
					func Reverse(s string) string {
 | 
				
			||||||
	r := []rune(s)
 | 
						r := []rune(s)
 | 
				
			||||||
	for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
 | 
						for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
 | 
				
			||||||
| 
						 | 
					@ -129,12 +129,12 @@ func Reverse(s string) string {
 | 
				
			||||||
	return string(r)
 | 
						return string(r)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetLines split string by "\n" and return array of lines
 | 
					// GetLines splits string by "\n" and return array of lines
 | 
				
			||||||
func GetLines(s string) []string {
 | 
					func GetLines(s string) []string {
 | 
				
			||||||
	return strings.Split(s, "\n")
 | 
						return strings.Split(s, "\n")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetLine return specified line of multiline string
 | 
					// GetLine returns specified line of multiline string
 | 
				
			||||||
func GetLine(s string, index int) (string, error) {
 | 
					func GetLine(s string, index int) (string, error) {
 | 
				
			||||||
	lines := GetLines(s)
 | 
						lines := GetLines(s)
 | 
				
			||||||
	if index < 0 || index >= len(lines) {
 | 
						if index < 0 || index >= len(lines) {
 | 
				
			||||||
| 
						 | 
					@ -143,12 +143,12 @@ func GetLine(s string, index int) (string, error) {
 | 
				
			||||||
	return lines[index], nil
 | 
						return lines[index], nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RemoveTags remove all tags from HTML string
 | 
					// RemoveTags removes all tags from HTML string
 | 
				
			||||||
func RemoveTags(s string) string {
 | 
					func RemoveTags(s string) string {
 | 
				
			||||||
	return ReplacePattern(s, "<[^>]*>", "")
 | 
						return ReplacePattern(s, "<[^>]*>", "")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SafeFileName return safe string that can be used in file names
 | 
					// SafeFileName returns safe string that can be used in file names
 | 
				
			||||||
func SafeFileName(str string) string {
 | 
					func SafeFileName(str string) string {
 | 
				
			||||||
	name := strings.ToLower(str)
 | 
						name := strings.ToLower(str)
 | 
				
			||||||
	name = path.Clean(path.Base(name))
 | 
						name = path.Clean(path.Base(name))
 | 
				
			||||||
| 
						 | 
					@ -210,23 +210,23 @@ func Truncate(str string, length int, ending string) string {
 | 
				
			||||||
	return str
 | 
						return str
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PadLeft pad left side of string if size of string is less then indicated pad length
 | 
					// PadLeft pads left side of a string if size of string is less then indicated pad length
 | 
				
			||||||
func PadLeft(str string, padStr string, padLen int) string {
 | 
					func PadLeft(str string, padStr string, padLen int) string {
 | 
				
			||||||
	return buildPadStr(str, padStr, padLen, true, false)
 | 
						return buildPadStr(str, padStr, padLen, true, false)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PadRight pad right side of string if size of string is less then indicated pad length
 | 
					// PadRight pads right side of a string if size of string is less then indicated pad length
 | 
				
			||||||
func PadRight(str string, padStr string, padLen int) string {
 | 
					func PadRight(str string, padStr string, padLen int) string {
 | 
				
			||||||
	return buildPadStr(str, padStr, padLen, false, true)
 | 
						return buildPadStr(str, padStr, padLen, false, true)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PadBoth pad sides of string if size of string is less then indicated pad length
 | 
					// PadBoth pads both sides of a string if size of string is less then indicated pad length
 | 
				
			||||||
func PadBoth(str string, padStr string, padLen int) string {
 | 
					func PadBoth(str string, padStr string, padLen int) string {
 | 
				
			||||||
	return buildPadStr(str, padStr, padLen, true, true)
 | 
						return buildPadStr(str, padStr, padLen, true, true)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// PadString either left, right or both sides, not the padding string can be unicode and more then one
 | 
					// PadString either left, right or both sides.
 | 
				
			||||||
// character
 | 
					// Note that padding string can be unicode and more then one character
 | 
				
			||||||
func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string {
 | 
					func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// When padded length is less then the current string size
 | 
						// When padded length is less then the current string size
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -282,7 +282,7 @@ func HasLowerCase(str string) bool {
 | 
				
			||||||
	return rxHasLowerCase.MatchString(str)
 | 
						return rxHasLowerCase.MatchString(str)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HasUpperCase check if the string contians as least 1 uppercase. Empty string is valid.
 | 
					// HasUpperCase check if the string contains as least 1 uppercase. Empty string is valid.
 | 
				
			||||||
func HasUpperCase(str string) bool {
 | 
					func HasUpperCase(str string) bool {
 | 
				
			||||||
	if IsNull(str) {
 | 
						if IsNull(str) {
 | 
				
			||||||
		return true
 | 
							return true
 | 
				
			||||||
| 
						 | 
					@ -321,14 +321,19 @@ func IsNull(str string) bool {
 | 
				
			||||||
	return len(str) == 0
 | 
						return len(str) == 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsNotNull check if the string is not null.
 | 
				
			||||||
 | 
					func IsNotNull(str string) bool {
 | 
				
			||||||
 | 
						return !IsNull(str)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HasWhitespaceOnly checks the string only contains whitespace
 | 
					// HasWhitespaceOnly checks the string only contains whitespace
 | 
				
			||||||
func HasWhitespaceOnly(str string) bool {
 | 
					func HasWhitespaceOnly(str string) bool {
 | 
				
			||||||
    return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str)
 | 
						return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HasWhitespace checks if the string contains any whitespace
 | 
					// HasWhitespace checks if the string contains any whitespace
 | 
				
			||||||
func HasWhitespace(str string) bool {
 | 
					func HasWhitespace(str string) bool {
 | 
				
			||||||
    return len(str) > 0 && rxHasWhitespace.MatchString(str)
 | 
						return len(str) > 0 && rxHasWhitespace.MatchString(str)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsByteLength check if the string's length (in bytes) falls in a range.
 | 
					// IsByteLength check if the string's length (in bytes) falls in a range.
 | 
				
			||||||
| 
						 | 
					@ -513,6 +518,11 @@ func IsDataURI(str string) bool {
 | 
				
			||||||
	return IsBase64(dataURI[1])
 | 
						return IsBase64(dataURI[1])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsMagnetURI checks if a string is valid magnet URI
 | 
				
			||||||
 | 
					func IsMagnetURI(str string) bool {
 | 
				
			||||||
 | 
						return rxMagnetURI.MatchString(str)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsISO3166Alpha2 checks if a string is valid two-letter country code
 | 
					// IsISO3166Alpha2 checks if a string is valid two-letter country code
 | 
				
			||||||
func IsISO3166Alpha2(str string) bool {
 | 
					func IsISO3166Alpha2(str string) bool {
 | 
				
			||||||
	for _, entry := range ISO3166List {
 | 
						for _, entry := range ISO3166List {
 | 
				
			||||||
| 
						 | 
					@ -565,7 +575,7 @@ func IsDNSName(str string) bool {
 | 
				
			||||||
// IsHash checks if a string is a hash of type algorithm.
 | 
					// IsHash checks if a string is a hash of type algorithm.
 | 
				
			||||||
// Algorithm is one of ['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b']
 | 
					// Algorithm is one of ['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b']
 | 
				
			||||||
func IsHash(str string, algorithm string) bool {
 | 
					func IsHash(str string, algorithm string) bool {
 | 
				
			||||||
	len := "0"
 | 
						var len string
 | 
				
			||||||
	algo := strings.ToLower(algorithm)
 | 
						algo := strings.ToLower(algorithm)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if algo == "crc32" || algo == "crc32b" {
 | 
						if algo == "crc32" || algo == "crc32b" {
 | 
				
			||||||
| 
						 | 
					@ -589,9 +599,73 @@ func IsHash(str string, algorithm string) bool {
 | 
				
			||||||
	return Matches(str, "^[a-f0-9]{"+len+"}$")
 | 
						return Matches(str, "^[a-f0-9]{"+len+"}$")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsSHA512 checks is a string is a SHA512 hash. Alias for `IsHash(str, "sha512")`
 | 
				
			||||||
 | 
					func IsSHA512(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "sha512")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsSHA384 checks is a string is a SHA384 hash. Alias for `IsHash(str, "sha384")`
 | 
				
			||||||
 | 
					func IsSHA384(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "sha384")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsSHA256 checks is a string is a SHA256 hash. Alias for `IsHash(str, "sha256")`
 | 
				
			||||||
 | 
					func IsSHA256(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "sha256")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsTiger192 checks is a string is a Tiger192 hash. Alias for `IsHash(str, "tiger192")`
 | 
				
			||||||
 | 
					func IsTiger192(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "tiger192")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsTiger160 checks is a string is a Tiger160 hash. Alias for `IsHash(str, "tiger160")`
 | 
				
			||||||
 | 
					func IsTiger160(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "tiger160")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsRipeMD160 checks is a string is a RipeMD160 hash. Alias for `IsHash(str, "ripemd160")`
 | 
				
			||||||
 | 
					func IsRipeMD160(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "ripemd160")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsSHA1 checks is a string is a SHA-1 hash. Alias for `IsHash(str, "sha1")`
 | 
				
			||||||
 | 
					func IsSHA1(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "sha1")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsTiger128 checks is a string is a Tiger128 hash. Alias for `IsHash(str, "tiger128")`
 | 
				
			||||||
 | 
					func IsTiger128(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "tiger128")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsRipeMD128 checks is a string is a RipeMD128 hash. Alias for `IsHash(str, "ripemd128")`
 | 
				
			||||||
 | 
					func IsRipeMD128(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "ripemd128")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsCRC32 checks is a string is a CRC32 hash. Alias for `IsHash(str, "crc32")`
 | 
				
			||||||
 | 
					func IsCRC32(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "crc32")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsCRC32b checks is a string is a CRC32b hash. Alias for `IsHash(str, "crc32b")`
 | 
				
			||||||
 | 
					func IsCRC32b(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "crc32b")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsMD5 checks is a string is a MD5 hash. Alias for `IsHash(str, "md5")`
 | 
				
			||||||
 | 
					func IsMD5(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "md5")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsMD4 checks is a string is a MD4 hash. Alias for `IsHash(str, "md4")`
 | 
				
			||||||
 | 
					func IsMD4(str string) bool {
 | 
				
			||||||
 | 
						return IsHash(str, "md4")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsDialString validates the given string for usage with the various Dial() functions
 | 
					// IsDialString validates the given string for usage with the various Dial() functions
 | 
				
			||||||
func IsDialString(str string) bool {
 | 
					func IsDialString(str string) bool {
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) {
 | 
						if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) {
 | 
				
			||||||
		return true
 | 
							return true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -599,7 +673,7 @@ func IsDialString(str string) bool {
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsIP checks if a string is either IP version 4 or 6.
 | 
					// IsIP checks if a string is either IP version 4 or 6. Alias for `net.ParseIP`
 | 
				
			||||||
func IsIP(str string) bool {
 | 
					func IsIP(str string) bool {
 | 
				
			||||||
	return net.ParseIP(str) != nil
 | 
						return net.ParseIP(str) != nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -663,6 +737,11 @@ func IsLongitude(str string) bool {
 | 
				
			||||||
	return rxLongitude.MatchString(str)
 | 
						return rxLongitude.MatchString(str)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsIMEI check if a string is valid IMEI
 | 
				
			||||||
 | 
					func IsIMEI(str string) bool {
 | 
				
			||||||
 | 
						return rxIMEI.MatchString(str)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsRsaPublicKey check if a string is valid public key with provided length
 | 
					// IsRsaPublicKey check if a string is valid public key with provided length
 | 
				
			||||||
func IsRsaPublicKey(str string, keylen int) bool {
 | 
					func IsRsaPublicKey(str string, keylen int) bool {
 | 
				
			||||||
	bb := bytes.NewBufferString(str)
 | 
						bb := bytes.NewBufferString(str)
 | 
				
			||||||
| 
						 | 
					@ -729,12 +808,116 @@ func PrependPathToErrors(err error, path string) error {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return err2
 | 
							return err2
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	fmt.Println(err)
 | 
					 | 
				
			||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ValidateMap use validation map for fields.
 | 
				
			||||||
 | 
					// result will be equal to `false` if there are any errors.
 | 
				
			||||||
 | 
					// s is the map containing the data to be validated.
 | 
				
			||||||
 | 
					// m is the validation map in the form:
 | 
				
			||||||
 | 
					//   map[string]interface{}{"name":"required,alpha","address":map[string]interface{}{"line1":"required,alphanum"}}
 | 
				
			||||||
 | 
					func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, error) {
 | 
				
			||||||
 | 
						if s == nil {
 | 
				
			||||||
 | 
							return true, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						result := true
 | 
				
			||||||
 | 
						var err error
 | 
				
			||||||
 | 
						var errs Errors
 | 
				
			||||||
 | 
						var index int
 | 
				
			||||||
 | 
						val := reflect.ValueOf(s)
 | 
				
			||||||
 | 
						for key, value := range s {
 | 
				
			||||||
 | 
							presentResult := true
 | 
				
			||||||
 | 
							validator, ok := m[key]
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								presentResult = false
 | 
				
			||||||
 | 
								var err error
 | 
				
			||||||
 | 
								err = fmt.Errorf("all map keys has to be present in the validation map; got %s", key)
 | 
				
			||||||
 | 
								err = PrependPathToErrors(err, key)
 | 
				
			||||||
 | 
								errs = append(errs, err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							valueField := reflect.ValueOf(value)
 | 
				
			||||||
 | 
							mapResult := true
 | 
				
			||||||
 | 
							typeResult := true
 | 
				
			||||||
 | 
							structResult := true
 | 
				
			||||||
 | 
							resultField := true
 | 
				
			||||||
 | 
							switch subValidator := validator.(type) {
 | 
				
			||||||
 | 
							case map[string]interface{}:
 | 
				
			||||||
 | 
								var err error
 | 
				
			||||||
 | 
								if v, ok := value.(map[string]interface{}); !ok {
 | 
				
			||||||
 | 
									mapResult = false
 | 
				
			||||||
 | 
									err = fmt.Errorf("map validator has to be for the map type only; got %s", valueField.Type().String())
 | 
				
			||||||
 | 
									err = PrependPathToErrors(err, key)
 | 
				
			||||||
 | 
									errs = append(errs, err)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									mapResult, err = ValidateMap(v, subValidator)
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										mapResult = false
 | 
				
			||||||
 | 
										err = PrependPathToErrors(err, key)
 | 
				
			||||||
 | 
										errs = append(errs, err)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							case string:
 | 
				
			||||||
 | 
								if (valueField.Kind() == reflect.Struct ||
 | 
				
			||||||
 | 
									(valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) &&
 | 
				
			||||||
 | 
									subValidator != "-" {
 | 
				
			||||||
 | 
									var err error
 | 
				
			||||||
 | 
									structResult, err = ValidateStruct(valueField.Interface())
 | 
				
			||||||
 | 
									if err != nil {
 | 
				
			||||||
 | 
										err = PrependPathToErrors(err, key)
 | 
				
			||||||
 | 
										errs = append(errs, err)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								resultField, err = typeCheck(valueField, reflect.StructField{
 | 
				
			||||||
 | 
									Name:      key,
 | 
				
			||||||
 | 
									PkgPath:   "",
 | 
				
			||||||
 | 
									Type:      val.Type(),
 | 
				
			||||||
 | 
									Tag:       reflect.StructTag(fmt.Sprintf("%s:%q", tagName, subValidator)),
 | 
				
			||||||
 | 
									Offset:    0,
 | 
				
			||||||
 | 
									Index:     []int{index},
 | 
				
			||||||
 | 
									Anonymous: false,
 | 
				
			||||||
 | 
								}, val, nil)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									errs = append(errs, err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							case nil:
 | 
				
			||||||
 | 
								// already handlerd when checked before
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								typeResult = false
 | 
				
			||||||
 | 
								err = fmt.Errorf("map validator has to be either map[string]interface{} or string; got %s", valueField.Type().String())
 | 
				
			||||||
 | 
								err = PrependPathToErrors(err, key)
 | 
				
			||||||
 | 
								errs = append(errs, err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							result = result && presentResult && typeResult && resultField && structResult && mapResult
 | 
				
			||||||
 | 
							index++
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// check required keys
 | 
				
			||||||
 | 
						requiredResult := true
 | 
				
			||||||
 | 
						for key, value := range m {
 | 
				
			||||||
 | 
							if schema, ok := value.(string); ok {
 | 
				
			||||||
 | 
								tags := parseTagIntoMap(schema)
 | 
				
			||||||
 | 
								if required, ok := tags["required"]; ok {
 | 
				
			||||||
 | 
									if _, ok := s[key]; !ok {
 | 
				
			||||||
 | 
										requiredResult = false
 | 
				
			||||||
 | 
										if required.customErrorMessage != "" {
 | 
				
			||||||
 | 
											err = Error{key, fmt.Errorf(required.customErrorMessage), true, "required", []string{}}
 | 
				
			||||||
 | 
										} else {
 | 
				
			||||||
 | 
											err = Error{key, fmt.Errorf("required field missing"), false, "required", []string{}}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										errs = append(errs, err)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(errs) > 0 {
 | 
				
			||||||
 | 
							err = errs
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return result && requiredResult, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ValidateStruct use tags for fields.
 | 
					// ValidateStruct use tags for fields.
 | 
				
			||||||
// result will be equal to `false` if there are any errors.
 | 
					// result will be equal to `false` if there are any errors.
 | 
				
			||||||
 | 
					// todo currently there is no guarantee that errors will be returned in predictable order (tests may to fail)
 | 
				
			||||||
func ValidateStruct(s interface{}) (bool, error) {
 | 
					func ValidateStruct(s interface{}) (bool, error) {
 | 
				
			||||||
	if s == nil {
 | 
						if s == nil {
 | 
				
			||||||
		return true, nil
 | 
							return true, nil
 | 
				
			||||||
| 
						 | 
					@ -856,12 +1039,29 @@ func IsSemver(str string) bool {
 | 
				
			||||||
	return rxSemver.MatchString(str)
 | 
						return rxSemver.MatchString(str)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsType check if interface is of some type
 | 
				
			||||||
 | 
					func IsType(v interface{}, params ...string) bool {
 | 
				
			||||||
 | 
						if len(params) == 1 {
 | 
				
			||||||
 | 
							typ := params[0]
 | 
				
			||||||
 | 
							return strings.Replace(reflect.TypeOf(v).String(), " ", "", -1) == strings.Replace(typ, " ", "", -1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsTime check if string is valid according to given format
 | 
					// IsTime check if string is valid according to given format
 | 
				
			||||||
func IsTime(str string, format string) bool {
 | 
					func IsTime(str string, format string) bool {
 | 
				
			||||||
	_, err := time.Parse(format, str)
 | 
						_, err := time.Parse(format, str)
 | 
				
			||||||
	return err == nil
 | 
						return err == nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsUnixTime check if string is valid unix timestamp value
 | 
				
			||||||
 | 
					func IsUnixTime(str string) bool {
 | 
				
			||||||
 | 
						if _, err := strconv.Atoi(str); err == nil {
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IsRFC3339 check if string is valid timestamp value according to RFC3339
 | 
					// IsRFC3339 check if string is valid timestamp value according to RFC3339
 | 
				
			||||||
func IsRFC3339(str string) bool {
 | 
					func IsRFC3339(str string) bool {
 | 
				
			||||||
	return IsTime(str, time.RFC3339)
 | 
						return IsTime(str, time.RFC3339)
 | 
				
			||||||
| 
						 | 
					@ -933,6 +1133,30 @@ func StringLength(str string, params ...string) bool {
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MinStringLength check string's minimum length (including multi byte strings)
 | 
				
			||||||
 | 
					func MinStringLength(str string, params ...string) bool {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(params) == 1 {
 | 
				
			||||||
 | 
							strLength := utf8.RuneCountInString(str)
 | 
				
			||||||
 | 
							min, _ := ToInt(params[0])
 | 
				
			||||||
 | 
							return strLength >= int(min)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MaxStringLength check string's maximum length (including multi byte strings)
 | 
				
			||||||
 | 
					func MaxStringLength(str string, params ...string) bool {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(params) == 1 {
 | 
				
			||||||
 | 
							strLength := utf8.RuneCountInString(str)
 | 
				
			||||||
 | 
							max, _ := ToInt(params[0])
 | 
				
			||||||
 | 
							return strLength <= int(max)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Range check string's length
 | 
					// Range check string's length
 | 
				
			||||||
func Range(str string, params ...string) bool {
 | 
					func Range(str string, params ...string) bool {
 | 
				
			||||||
	if len(params) == 2 {
 | 
						if len(params) == 2 {
 | 
				
			||||||
| 
						 | 
					@ -945,7 +1169,7 @@ func Range(str string, params ...string) bool {
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func isInRaw(str string, params ...string) bool {
 | 
					func IsInRaw(str string, params ...string) bool {
 | 
				
			||||||
	if len(params) == 1 {
 | 
						if len(params) == 1 {
 | 
				
			||||||
		rawParams := params[0]
 | 
							rawParams := params[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1014,7 +1238,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options
 | 
				
			||||||
		options = parseTagIntoMap(tag)
 | 
							options = parseTagIntoMap(tag)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if isEmptyValue(v) {
 | 
						if !isFieldSet(v) {
 | 
				
			||||||
		// an empty value is not validated, check only required
 | 
							// an empty value is not validated, check only required
 | 
				
			||||||
		isValid, resultErr = checkRequired(v, t, options)
 | 
							isValid, resultErr = checkRequired(v, t, options)
 | 
				
			||||||
		for key := range options {
 | 
							for key := range options {
 | 
				
			||||||
| 
						 | 
					@ -1062,6 +1286,45 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options
 | 
				
			||||||
		}()
 | 
							}()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, validatorSpec := range optionsOrder {
 | 
				
			||||||
 | 
							validatorStruct := options[validatorSpec]
 | 
				
			||||||
 | 
							var negate bool
 | 
				
			||||||
 | 
							validator := validatorSpec
 | 
				
			||||||
 | 
							customMsgExists := len(validatorStruct.customErrorMessage) > 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Check whether the tag looks like '!something' or 'something'
 | 
				
			||||||
 | 
							if validator[0] == '!' {
 | 
				
			||||||
 | 
								validator = validator[1:]
 | 
				
			||||||
 | 
								negate = true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Check for interface param validators
 | 
				
			||||||
 | 
							for key, value := range InterfaceParamTagRegexMap {
 | 
				
			||||||
 | 
								ps := value.FindStringSubmatch(validator)
 | 
				
			||||||
 | 
								if len(ps) == 0 {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								validatefunc, ok := InterfaceParamTagMap[key]
 | 
				
			||||||
 | 
								if !ok {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								delete(options, validatorSpec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								field := fmt.Sprint(v)
 | 
				
			||||||
 | 
								if result := validatefunc(v.Interface(), ps[1:]...); (!result && !negate) || (result && negate) {
 | 
				
			||||||
 | 
									if customMsgExists {
 | 
				
			||||||
 | 
										return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if negate {
 | 
				
			||||||
 | 
										return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch v.Kind() {
 | 
						switch v.Kind() {
 | 
				
			||||||
	case reflect.Bool,
 | 
						case reflect.Bool,
 | 
				
			||||||
		reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
 | 
							reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
 | 
				
			||||||
| 
						 | 
					@ -1121,10 +1384,10 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options
 | 
				
			||||||
				delete(options, validatorSpec)
 | 
									delete(options, validatorSpec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				switch v.Kind() {
 | 
									switch v.Kind() {
 | 
				
			||||||
                case reflect.String,
 | 
									case reflect.String,
 | 
				
			||||||
                    reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
 | 
										reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
 | 
				
			||||||
                    reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
 | 
										reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
 | 
				
			||||||
                    reflect.Float32, reflect.Float64:
 | 
										reflect.Float32, reflect.Float64:
 | 
				
			||||||
					field := fmt.Sprint(v) // make value into string, then validate with regex
 | 
										field := fmt.Sprint(v) // make value into string, then validate with regex
 | 
				
			||||||
					if result := validatefunc(field); !result && !negate || result && negate {
 | 
										if result := validatefunc(field); !result && !negate || result && negate {
 | 
				
			||||||
						if customMsgExists {
 | 
											if customMsgExists {
 | 
				
			||||||
| 
						 | 
					@ -1202,7 +1465,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return typeCheck(v.Elem(), t, o, options)
 | 
							return typeCheck(v.Elem(), t, o, options)
 | 
				
			||||||
	case reflect.Struct:
 | 
						case reflect.Struct:
 | 
				
			||||||
		return ValidateStruct(v.Interface())
 | 
							return true, nil
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		return false, &UnsupportedTypeError{v.Type()}
 | 
							return false, &UnsupportedTypeError{v.Type()}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1212,25 +1475,14 @@ func stripParams(validatorString string) string {
 | 
				
			||||||
	return paramsRegexp.ReplaceAllString(validatorString, "")
 | 
						return paramsRegexp.ReplaceAllString(validatorString, "")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func isEmptyValue(v reflect.Value) bool {
 | 
					// isFieldSet returns false for nil pointers, interfaces, maps, and slices. For all other values, it returns true.
 | 
				
			||||||
 | 
					func isFieldSet(v reflect.Value) bool {
 | 
				
			||||||
	switch v.Kind() {
 | 
						switch v.Kind() {
 | 
				
			||||||
	case reflect.String, reflect.Array:
 | 
						case reflect.Map, reflect.Slice, reflect.Interface, reflect.Ptr:
 | 
				
			||||||
		return v.Len() == 0
 | 
							return !v.IsNil()
 | 
				
			||||||
	case reflect.Map, reflect.Slice:
 | 
					 | 
				
			||||||
		return v.Len() == 0 || v.IsNil()
 | 
					 | 
				
			||||||
	case reflect.Bool:
 | 
					 | 
				
			||||||
		return !v.Bool()
 | 
					 | 
				
			||||||
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
 | 
					 | 
				
			||||||
		return v.Int() == 0
 | 
					 | 
				
			||||||
	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
 | 
					 | 
				
			||||||
		return v.Uint() == 0
 | 
					 | 
				
			||||||
	case reflect.Float32, reflect.Float64:
 | 
					 | 
				
			||||||
		return v.Float() == 0
 | 
					 | 
				
			||||||
	case reflect.Interface, reflect.Ptr:
 | 
					 | 
				
			||||||
		return v.IsNil()
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface())
 | 
						return true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ErrorByField returns error for specified field of the struct
 | 
					// ErrorByField returns error for specified field of the struct
 | 
				
			||||||
| 
						 | 
					@ -1252,11 +1504,11 @@ func ErrorsByField(e error) map[string]string {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// prototype for ValidateStruct
 | 
						// prototype for ValidateStruct
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch e.(type) {
 | 
						switch e := e.(type) {
 | 
				
			||||||
	case Error:
 | 
						case Error:
 | 
				
			||||||
		m[e.(Error).Name] = e.(Error).Err.Error()
 | 
							m[e.Name] = e.Err.Error()
 | 
				
			||||||
	case Errors:
 | 
						case Errors:
 | 
				
			||||||
		for _, item := range e.(Errors).Errors() {
 | 
							for _, item := range e.Errors() {
 | 
				
			||||||
			n := ErrorsByField(item)
 | 
								n := ErrorsByField(item)
 | 
				
			||||||
			for k, v := range n {
 | 
								for k, v := range n {
 | 
				
			||||||
				m[k] = v
 | 
									m[k] = v
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,4 +12,4 @@ build:
 | 
				
			||||||
    - script:
 | 
					    - script:
 | 
				
			||||||
        name: go test
 | 
					        name: go test
 | 
				
			||||||
        code: |
 | 
					        code: |
 | 
				
			||||||
          go test -race ./...
 | 
					          go test -race -v ./...
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,12 @@
 | 
				
			||||||
root = true
 | 
					root = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[*]
 | 
					[*.go]
 | 
				
			||||||
indent_style = tab
 | 
					indent_style = tab
 | 
				
			||||||
indent_size = 4
 | 
					indent_size = 4
 | 
				
			||||||
 | 
					insert_final_newline = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[*.{yml,yaml}]
 | 
				
			||||||
 | 
					indent_style = space
 | 
				
			||||||
 | 
					indent_size = 2
 | 
				
			||||||
 | 
					insert_final_newline = true
 | 
				
			||||||
 | 
					trim_trailing_whitespace = true
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					go.sum linguist-generated
 | 
				
			||||||
| 
						 | 
					@ -2,29 +2,35 @@ sudo: false
 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
  - 1.8.x
 | 
					  - "stable"
 | 
				
			||||||
  - 1.9.x
 | 
					  - "1.11.x"
 | 
				
			||||||
  - tip
 | 
					  - "1.10.x"
 | 
				
			||||||
 | 
					  - "1.9.x"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
matrix:
 | 
					matrix:
 | 
				
			||||||
 | 
					  include:
 | 
				
			||||||
 | 
					    - go: "stable"
 | 
				
			||||||
 | 
					      env: GOLINT=true
 | 
				
			||||||
  allow_failures:
 | 
					  allow_failures:
 | 
				
			||||||
    - go: tip
 | 
					    - go: tip
 | 
				
			||||||
  fast_finish: true
 | 
					  fast_finish: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
before_script:
 | 
					
 | 
				
			||||||
  - go get -u github.com/golang/lint/golint
 | 
					before_install:
 | 
				
			||||||
 | 
					  - if [ ! -z "${GOLINT}" ]; then go get -u golang.org/x/lint/golint; fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
script:
 | 
					script:
 | 
				
			||||||
  - go test -v --race ./...
 | 
					  - go test --race ./...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
after_script:
 | 
					after_script:
 | 
				
			||||||
  - test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
 | 
					  - test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
 | 
				
			||||||
  - test -z "$(golint ./...     | tee /dev/stderr)"
 | 
					  - if [ ! -z  "${GOLINT}" ]; then echo running golint; golint --set_exit_status  ./...; else echo skipping golint; fi
 | 
				
			||||||
  - go vet ./...
 | 
					  - go vet ./...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
os:
 | 
					os:
 | 
				
			||||||
  - linux
 | 
					  - linux
 | 
				
			||||||
  - osx
 | 
					  - osx
 | 
				
			||||||
 | 
					  - windows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  email: false
 | 
					  email: false
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
Copyright (c) 2012 The Go Authors. All rights reserved.
 | 
					Copyright (c) 2012 The Go Authors. All rights reserved.
 | 
				
			||||||
Copyright (c) 2012 fsnotify Authors. All rights reserved.
 | 
					Copyright (c) 2012-2019 fsnotify Authors. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Redistribution and use in source and binary forms, with or without
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
modification, are permitted provided that the following conditions are
 | 
					modification, are permitted provided that the following conditions are
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,16 +10,16 @@ go get -u golang.org/x/sys/...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Cross platform: Windows, Linux, BSD and macOS.
 | 
					Cross platform: Windows, Linux, BSD and macOS.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
|Adapter   |OS        |Status    |
 | 
					| Adapter               | OS                               | Status                                                                                                                          |
 | 
				
			||||||
|----------|----------|----------|
 | 
					| --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
 | 
				
			||||||
|inotify   |Linux 2.6.27 or later, Android\*|Supported [](https://travis-ci.org/fsnotify/fsnotify)|
 | 
					| inotify               | Linux 2.6.27 or later, Android\* | Supported [](https://travis-ci.org/fsnotify/fsnotify) |
 | 
				
			||||||
|kqueue    |BSD, macOS, iOS\*|Supported [](https://travis-ci.org/fsnotify/fsnotify)|
 | 
					| kqueue                | BSD, macOS, iOS\*                | Supported [](https://travis-ci.org/fsnotify/fsnotify) |
 | 
				
			||||||
|ReadDirectoryChangesW|Windows|Supported [](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)|
 | 
					| ReadDirectoryChangesW | Windows                          | Supported [](https://travis-ci.org/fsnotify/fsnotify) |
 | 
				
			||||||
|FSEvents  |macOS         |[Planned](https://github.com/fsnotify/fsnotify/issues/11)|
 | 
					| FSEvents              | macOS                            | [Planned](https://github.com/fsnotify/fsnotify/issues/11)                                                                       |
 | 
				
			||||||
|FEN       |Solaris 11    |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)|
 | 
					| FEN                   | Solaris 11                       | [In Progress](https://github.com/fsnotify/fsnotify/issues/12)                                                                   |
 | 
				
			||||||
|fanotify  |Linux 2.6.37+ | |
 | 
					| fanotify              | Linux 2.6.37+                    | [Planned](https://github.com/fsnotify/fsnotify/issues/114)                                                                      |
 | 
				
			||||||
|USN Journals |Windows    |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)|
 | 
					| USN Journals          | Windows                          | [Maybe](https://github.com/fsnotify/fsnotify/issues/53)                                                                         |
 | 
				
			||||||
|Polling   |*All*         |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)|
 | 
					| Polling               | *All*                            | [Maybe](https://github.com/fsnotify/fsnotify/issues/9)                                                                          |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
\* Android and iOS are untested.
 | 
					\* Android and iOS are untested.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,53 @@ All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`.
 | 
					Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```go
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"log"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/fsnotify/fsnotify"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						watcher, err := fsnotify.NewWatcher()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer watcher.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						done := make(chan bool)
 | 
				
			||||||
 | 
						go func() {
 | 
				
			||||||
 | 
							for {
 | 
				
			||||||
 | 
								select {
 | 
				
			||||||
 | 
								case event, ok := <-watcher.Events:
 | 
				
			||||||
 | 
									if !ok {
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									log.Println("event:", event)
 | 
				
			||||||
 | 
									if event.Op&fsnotify.Write == fsnotify.Write {
 | 
				
			||||||
 | 
										log.Println("modified file:", event.Name)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								case err, ok := <-watcher.Errors:
 | 
				
			||||||
 | 
									if !ok {
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									log.Println("error:", err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = watcher.Add("/tmp/foo")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						<-done
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Contributing
 | 
					## Contributing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please refer to [CONTRIBUTING][] before opening an issue or pull request.
 | 
					Please refer to [CONTRIBUTING][] before opening an issue or pull request.
 | 
				
			||||||
| 
						 | 
					@ -65,6 +112,10 @@ There are OS-specific limits as to how many watches can be created:
 | 
				
			||||||
* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error.
 | 
					* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error.
 | 
				
			||||||
* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error.
 | 
					* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Why don't notifications work with NFS filesystems or filesystem in userspace (FUSE)?**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fsnotify requires support from underlying OS to work. The current NFS protocol does not provide network level support for file notifications.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[#62]: https://github.com/howeyc/fsnotify/issues/62
 | 
					[#62]: https://github.com/howeyc/fsnotify/issues/62
 | 
				
			||||||
[#18]: https://github.com/fsnotify/fsnotify/issues/18
 | 
					[#18]: https://github.com/fsnotify/fsnotify/issues/18
 | 
				
			||||||
[#11]: https://github.com/fsnotify/fsnotify/issues/11
 | 
					[#11]: https://github.com/fsnotify/fsnotify/issues/11
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,4 +63,6 @@ func (e Event) String() string {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Common errors that can be reported by a watcher
 | 
					// Common errors that can be reported by a watcher
 | 
				
			||||||
var ErrEventOverflow = errors.New("fsnotify queue overflow")
 | 
					var (
 | 
				
			||||||
 | 
						ErrEventOverflow = errors.New("fsnotify queue overflow")
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,5 @@
 | 
				
			||||||
 | 
					module github.com/fsnotify/fsnotify
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.13
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 h1:L2auWcuQIvxz9xSEqzESnV/QN/gNRXNApHi3fYwl2w0=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
| 
						 | 
					@ -40,12 +40,12 @@ func newFdPoller(fd int) (*fdPoller, error) {
 | 
				
			||||||
	poller.fd = fd
 | 
						poller.fd = fd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create epoll fd
 | 
						// Create epoll fd
 | 
				
			||||||
	poller.epfd, errno = unix.EpollCreate1(0)
 | 
						poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC)
 | 
				
			||||||
	if poller.epfd == -1 {
 | 
						if poller.epfd == -1 {
 | 
				
			||||||
		return nil, errno
 | 
							return nil, errno
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Create pipe; pipe[0] is the read end, pipe[1] the write end.
 | 
						// Create pipe; pipe[0] is the read end, pipe[1] the write end.
 | 
				
			||||||
	errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK)
 | 
						errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK|unix.O_CLOEXEC)
 | 
				
			||||||
	if errno != nil {
 | 
						if errno != nil {
 | 
				
			||||||
		return nil, errno
 | 
							return nil, errno
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,4 +8,4 @@ package fsnotify
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "golang.org/x/sys/unix"
 | 
					import "golang.org/x/sys/unix"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const openMode = unix.O_NONBLOCK | unix.O_RDONLY
 | 
					const openMode = unix.O_NONBLOCK | unix.O_RDONLY | unix.O_CLOEXEC
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,4 +9,4 @@ package fsnotify
 | 
				
			||||||
import "golang.org/x/sys/unix"
 | 
					import "golang.org/x/sys/unix"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// note: this constant is not defined on BSD
 | 
					// note: this constant is not defined on BSD
 | 
				
			||||||
const openMode = unix.O_EVTONLY
 | 
					const openMode = unix.O_EVTONLY | unix.O_CLOEXEC
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,3 +25,8 @@ linters:
 | 
				
			||||||
    # linter rather than changing code that works.
 | 
					    # linter rather than changing code that works.
 | 
				
			||||||
    # see: https://github.com/kyoh86/scopelint/issues/4
 | 
					    # see: https://github.com/kyoh86/scopelint/issues/4
 | 
				
			||||||
    - scopelint
 | 
					    - scopelint
 | 
				
			||||||
 | 
					    - godox
 | 
				
			||||||
 | 
					    - gocognit
 | 
				
			||||||
 | 
					    - whitespace
 | 
				
			||||||
 | 
					    - wsl
 | 
				
			||||||
 | 
					    - funlen
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,10 @@
 | 
				
			||||||
after_success:
 | 
					after_success:
 | 
				
			||||||
- bash <(curl -s https://codecov.io/bash)
 | 
					- bash <(curl -s https://codecov.io/bash)
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
- 1.11.x
 | 
					- 1.13.x
 | 
				
			||||||
- 1.12.x
 | 
					- 1.14.x
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
					- go get -u gotest.tools/gotestsum
 | 
				
			||||||
env:
 | 
					 | 
				
			||||||
- GO111MODULE=on
 | 
					 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  slack:
 | 
					  slack:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -221,7 +221,7 @@ func (s *Spec) initialize() {
 | 
				
			||||||
			s.analyzeItems("items", parameter.Items, refPref, "parameter")
 | 
								s.analyzeItems("items", parameter.Items, refPref, "parameter")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if parameter.In == "body" && parameter.Schema != nil {
 | 
							if parameter.In == "body" && parameter.Schema != nil {
 | 
				
			||||||
			s.analyzeSchema("schema", *parameter.Schema, refPref)
 | 
								s.analyzeSchema("schema", parameter.Schema, refPref)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if parameter.Pattern != "" {
 | 
							if parameter.Pattern != "" {
 | 
				
			||||||
			s.patterns.addParameterPattern(refPref, parameter.Pattern)
 | 
								s.patterns.addParameterPattern(refPref, parameter.Pattern)
 | 
				
			||||||
| 
						 | 
					@ -246,12 +246,13 @@ func (s *Spec) initialize() {
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if response.Schema != nil {
 | 
							if response.Schema != nil {
 | 
				
			||||||
			s.analyzeSchema("schema", *response.Schema, refPref)
 | 
								s.analyzeSchema("schema", response.Schema, refPref)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for name, schema := range s.spec.Definitions {
 | 
						for name := range s.spec.Definitions {
 | 
				
			||||||
		s.analyzeSchema(name, schema, "/definitions")
 | 
							schema := s.spec.Definitions[name]
 | 
				
			||||||
 | 
							s.analyzeSchema(name, &schema, "/definitions")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// TODO: after analyzing all things and flattening schemas etc
 | 
						// TODO: after analyzing all things and flattening schemas etc
 | 
				
			||||||
	// resolve all the collected references to their final representations
 | 
						// resolve all the collected references to their final representations
 | 
				
			||||||
| 
						 | 
					@ -288,7 +289,7 @@ func (s *Spec) analyzeOperations(path string, pi *spec.PathItem) {
 | 
				
			||||||
			s.analyzeItems("items", param.Items, refPref, "parameter")
 | 
								s.analyzeItems("items", param.Items, refPref, "parameter")
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if param.Schema != nil {
 | 
							if param.Schema != nil {
 | 
				
			||||||
			s.analyzeSchema("schema", *param.Schema, refPref)
 | 
								s.analyzeSchema("schema", param.Schema, refPref)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -344,7 +345,7 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		s.analyzeItems("items", param.Items, refPref, "parameter")
 | 
							s.analyzeItems("items", param.Items, refPref, "parameter")
 | 
				
			||||||
		if param.In == "body" && param.Schema != nil {
 | 
							if param.In == "body" && param.Schema != nil {
 | 
				
			||||||
			s.analyzeSchema("schema", *param.Schema, refPref)
 | 
								s.analyzeSchema("schema", param.Schema, refPref)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if op.Responses != nil {
 | 
						if op.Responses != nil {
 | 
				
			||||||
| 
						 | 
					@ -361,7 +362,7 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) {
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if op.Responses.Default.Schema != nil {
 | 
								if op.Responses.Default.Schema != nil {
 | 
				
			||||||
				s.analyzeSchema("schema", *op.Responses.Default.Schema, refPref)
 | 
									s.analyzeSchema("schema", op.Responses.Default.Schema, refPref)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for k, res := range op.Responses.StatusCodeResponses {
 | 
							for k, res := range op.Responses.StatusCodeResponses {
 | 
				
			||||||
| 
						 | 
					@ -380,17 +381,17 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) {
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if res.Schema != nil {
 | 
								if res.Schema != nil {
 | 
				
			||||||
				s.analyzeSchema("schema", *res.Schema, refPref)
 | 
									s.analyzeSchema("schema", res.Schema, refPref)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) {
 | 
					func (s *Spec) analyzeSchema(name string, schema *spec.Schema, prefix string) {
 | 
				
			||||||
	refURI := slashpath.Join(prefix, jsonpointer.Escape(name))
 | 
						refURI := slashpath.Join(prefix, jsonpointer.Escape(name))
 | 
				
			||||||
	schRef := SchemaRef{
 | 
						schRef := SchemaRef{
 | 
				
			||||||
		Name:     name,
 | 
							Name:     name,
 | 
				
			||||||
		Schema:   &schema,
 | 
							Schema:   schema,
 | 
				
			||||||
		Ref:      spec.MustCreateRef("#" + refURI),
 | 
							Ref:      spec.MustCreateRef("#" + refURI),
 | 
				
			||||||
		TopLevel: prefix == "/definitions",
 | 
							TopLevel: prefix == "/definitions",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -408,28 +409,34 @@ func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for k, v := range schema.Definitions {
 | 
						for k, v := range schema.Definitions {
 | 
				
			||||||
		s.analyzeSchema(k, v, slashpath.Join(refURI, "definitions"))
 | 
							v := v
 | 
				
			||||||
 | 
							s.analyzeSchema(k, &v, slashpath.Join(refURI, "definitions"))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for k, v := range schema.Properties {
 | 
						for k, v := range schema.Properties {
 | 
				
			||||||
		s.analyzeSchema(k, v, slashpath.Join(refURI, "properties"))
 | 
							v := v
 | 
				
			||||||
 | 
							s.analyzeSchema(k, &v, slashpath.Join(refURI, "properties"))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for k, v := range schema.PatternProperties {
 | 
						for k, v := range schema.PatternProperties {
 | 
				
			||||||
 | 
							v := v
 | 
				
			||||||
		// NOTE: swagger 2.0 does not support PatternProperties.
 | 
							// NOTE: swagger 2.0 does not support PatternProperties.
 | 
				
			||||||
		// However it is possible to analyze this in a schema
 | 
							// However it is possible to analyze this in a schema
 | 
				
			||||||
		s.analyzeSchema(k, v, slashpath.Join(refURI, "patternProperties"))
 | 
							s.analyzeSchema(k, &v, slashpath.Join(refURI, "patternProperties"))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for i, v := range schema.AllOf {
 | 
						for i := range schema.AllOf {
 | 
				
			||||||
 | 
							v := &schema.AllOf[i]
 | 
				
			||||||
		s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "allOf"))
 | 
							s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "allOf"))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if len(schema.AllOf) > 0 {
 | 
						if len(schema.AllOf) > 0 {
 | 
				
			||||||
		s.allOfs["#"+refURI] = schRef
 | 
							s.allOfs["#"+refURI] = schRef
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for i, v := range schema.AnyOf {
 | 
						for i := range schema.AnyOf {
 | 
				
			||||||
 | 
							v := &schema.AnyOf[i]
 | 
				
			||||||
		// NOTE: swagger 2.0 does not support anyOf constructs.
 | 
							// NOTE: swagger 2.0 does not support anyOf constructs.
 | 
				
			||||||
		// However it is possible to analyze this in a schema
 | 
							// However it is possible to analyze this in a schema
 | 
				
			||||||
		s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "anyOf"))
 | 
							s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "anyOf"))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for i, v := range schema.OneOf {
 | 
						for i := range schema.OneOf {
 | 
				
			||||||
 | 
							v := &schema.OneOf[i]
 | 
				
			||||||
		// NOTE: swagger 2.0 does not support oneOf constructs.
 | 
							// NOTE: swagger 2.0 does not support oneOf constructs.
 | 
				
			||||||
		// However it is possible to analyze this in a schema
 | 
							// However it is possible to analyze this in a schema
 | 
				
			||||||
		s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "oneOf"))
 | 
							s.analyzeSchema(strconv.Itoa(i), v, slashpath.Join(refURI, "oneOf"))
 | 
				
			||||||
| 
						 | 
					@ -437,21 +444,22 @@ func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) {
 | 
				
			||||||
	if schema.Not != nil {
 | 
						if schema.Not != nil {
 | 
				
			||||||
		// NOTE: swagger 2.0 does not support "not" constructs.
 | 
							// NOTE: swagger 2.0 does not support "not" constructs.
 | 
				
			||||||
		// However it is possible to analyze this in a schema
 | 
							// However it is possible to analyze this in a schema
 | 
				
			||||||
		s.analyzeSchema("not", *schema.Not, refURI)
 | 
							s.analyzeSchema("not", schema.Not, refURI)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil {
 | 
						if schema.AdditionalProperties != nil && schema.AdditionalProperties.Schema != nil {
 | 
				
			||||||
		s.analyzeSchema("additionalProperties", *schema.AdditionalProperties.Schema, refURI)
 | 
							s.analyzeSchema("additionalProperties", schema.AdditionalProperties.Schema, refURI)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil {
 | 
						if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil {
 | 
				
			||||||
		// NOTE: swagger 2.0 does not support AdditionalItems.
 | 
							// NOTE: swagger 2.0 does not support AdditionalItems.
 | 
				
			||||||
		// However it is possible to analyze this in a schema
 | 
							// However it is possible to analyze this in a schema
 | 
				
			||||||
		s.analyzeSchema("additionalItems", *schema.AdditionalItems.Schema, refURI)
 | 
							s.analyzeSchema("additionalItems", schema.AdditionalItems.Schema, refURI)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if schema.Items != nil {
 | 
						if schema.Items != nil {
 | 
				
			||||||
		if schema.Items.Schema != nil {
 | 
							if schema.Items.Schema != nil {
 | 
				
			||||||
			s.analyzeSchema("items", *schema.Items.Schema, refURI)
 | 
								s.analyzeSchema("items", schema.Items.Schema, refURI)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for i, sch := range schema.Items.Schemas {
 | 
							for i := range schema.Items.Schemas {
 | 
				
			||||||
 | 
								sch := &schema.Items.Schemas[i]
 | 
				
			||||||
			s.analyzeSchema(strconv.Itoa(i), sch, slashpath.Join(refURI, "items"))
 | 
								s.analyzeSchema(strconv.Itoa(i), sch, slashpath.Join(refURI, "items"))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,10 +41,11 @@ type FlattenOpts struct {
 | 
				
			||||||
	BasePath string
 | 
						BasePath string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Flattening options
 | 
						// Flattening options
 | 
				
			||||||
	Expand       bool // If Expand is true, we skip flattening the spec and expand it instead
 | 
						Expand          bool // If Expand is true, we skip flattening the spec and expand it instead
 | 
				
			||||||
	Minimal      bool
 | 
						Minimal         bool
 | 
				
			||||||
	Verbose      bool
 | 
						Verbose         bool
 | 
				
			||||||
	RemoveUnused bool
 | 
						RemoveUnused    bool
 | 
				
			||||||
 | 
						ContinueOnError bool // Continues when facing some issues
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Extra keys */
 | 
						/* Extra keys */
 | 
				
			||||||
	_ struct{} // require keys
 | 
						_ struct{} // require keys
 | 
				
			||||||
| 
						 | 
					@ -135,6 +136,7 @@ func newContext() *context {
 | 
				
			||||||
//     - ...
 | 
					//     - ...
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
func Flatten(opts FlattenOpts) error {
 | 
					func Flatten(opts FlattenOpts) error {
 | 
				
			||||||
 | 
						debugLog("FlattenOpts: %#v", opts)
 | 
				
			||||||
	// Make sure opts.BasePath is an absolute path
 | 
						// Make sure opts.BasePath is an absolute path
 | 
				
			||||||
	if !filepath.IsAbs(opts.BasePath) {
 | 
						if !filepath.IsAbs(opts.BasePath) {
 | 
				
			||||||
		cwd, _ := os.Getwd()
 | 
							cwd, _ := os.Getwd()
 | 
				
			||||||
| 
						 | 
					@ -148,7 +150,9 @@ func Flatten(opts FlattenOpts) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// recursively expand responses, parameters, path items and items in simple schemas.
 | 
						// recursively expand responses, parameters, path items and items in simple schemas.
 | 
				
			||||||
	// This simplifies the spec and leaves $ref only into schema objects.
 | 
						// This simplifies the spec and leaves $ref only into schema objects.
 | 
				
			||||||
	if err := swspec.ExpandSpec(opts.Swagger(), opts.ExpandOpts(!opts.Expand)); err != nil {
 | 
						expandOpts := opts.ExpandOpts(!opts.Expand)
 | 
				
			||||||
 | 
						expandOpts.ContinueOnError = opts.ContinueOnError
 | 
				
			||||||
 | 
						if err := swspec.ExpandSpec(opts.Swagger(), expandOpts); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -846,7 +850,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) {
 | 
				
			||||||
				enums:      enumAnalysis{},
 | 
									enums:      enumAnalysis{},
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			partialAnalyzer.reset()
 | 
								partialAnalyzer.reset()
 | 
				
			||||||
			partialAnalyzer.analyzeSchema("", *sch, "/")
 | 
								partialAnalyzer.analyzeSchema("", sch, "/")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// now rewrite those refs with rebase
 | 
								// now rewrite those refs with rebase
 | 
				
			||||||
			for key, ref := range partialAnalyzer.references.allRefs {
 | 
								for key, ref := range partialAnalyzer.references.allRefs {
 | 
				
			||||||
| 
						 | 
					@ -874,6 +878,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) {
 | 
				
			||||||
				if _, ok := opts.flattenContext.newRefs[key]; ok {
 | 
									if _, ok := opts.flattenContext.newRefs[key]; ok {
 | 
				
			||||||
					resolved = opts.flattenContext.newRefs[key].resolved
 | 
										resolved = opts.flattenContext.newRefs[key].resolved
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									debugLog("keeping track of ref: %s (%s), resolved: %t", key, newName, resolved)
 | 
				
			||||||
				opts.flattenContext.newRefs[key] = &newRef{
 | 
									opts.flattenContext.newRefs[key] = &newRef{
 | 
				
			||||||
					key:      key,
 | 
										key:      key,
 | 
				
			||||||
					newName:  newName,
 | 
										newName:  newName,
 | 
				
			||||||
| 
						 | 
					@ -1308,16 +1313,55 @@ func stripPointersAndOAIGen(opts *FlattenOpts) error {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// restrip
 | 
							// restrip and re-analyze
 | 
				
			||||||
		if hasIntroducedPointerOrInline, ers = stripOAIGen(opts); ers != nil {
 | 
							if hasIntroducedPointerOrInline, ers = stripOAIGen(opts); ers != nil {
 | 
				
			||||||
			return ers
 | 
								return ers
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		opts.Spec.reload() // re-analyze
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func updateRefParents(opts *FlattenOpts, r *newRef) {
 | 
				
			||||||
 | 
						if !r.isOAIGen || r.resolved { // bail on already resolved entries (avoid looping)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for k, v := range opts.Spec.references.allRefs {
 | 
				
			||||||
 | 
							if r.path != v.String() {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							found := false
 | 
				
			||||||
 | 
							for _, p := range r.parents {
 | 
				
			||||||
 | 
								if p == k {
 | 
				
			||||||
 | 
									found = true
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if !found {
 | 
				
			||||||
 | 
								r.parents = append(r.parents, k)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// topMostRefs is able to sort refs by hierarchical then lexicographic order,
 | 
				
			||||||
 | 
					// yielding refs ordered breadth-first.
 | 
				
			||||||
 | 
					type topmostRefs []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (k topmostRefs) Len() int      { return len(k) }
 | 
				
			||||||
 | 
					func (k topmostRefs) Swap(i, j int) { k[i], k[j] = k[j], k[i] }
 | 
				
			||||||
 | 
					func (k topmostRefs) Less(i, j int) bool {
 | 
				
			||||||
 | 
						li, lj := len(strings.Split(k[i], "/")), len(strings.Split(k[j], "/"))
 | 
				
			||||||
 | 
						if li == lj {
 | 
				
			||||||
 | 
							return k[i] < k[j]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return li < lj
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func topmostFirst(refs []string) []string {
 | 
				
			||||||
 | 
						res := topmostRefs(refs)
 | 
				
			||||||
 | 
						sort.Sort(res)
 | 
				
			||||||
 | 
						return res
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// stripOAIGen strips the spec from unnecessary OAIGen constructs, initially created to dedupe flattened definitions.
 | 
					// stripOAIGen strips the spec from unnecessary OAIGen constructs, initially created to dedupe flattened definitions.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// A dedupe is deemed unnecessary whenever:
 | 
					// A dedupe is deemed unnecessary whenever:
 | 
				
			||||||
| 
						 | 
					@ -1325,44 +1369,25 @@ func stripPointersAndOAIGen(opts *FlattenOpts) error {
 | 
				
			||||||
//  - there is a conflict with multiple parents: merge OAIGen in first parent, the rewrite other parents to point to
 | 
					//  - there is a conflict with multiple parents: merge OAIGen in first parent, the rewrite other parents to point to
 | 
				
			||||||
//    the first parent.
 | 
					//    the first parent.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// This function returns a true bool whenever it re-inlined a complex schema, so the caller may chose to iterate
 | 
					// This function returns true whenever it re-inlined a complex schema, so the caller may chose to iterate
 | 
				
			||||||
// pointer and name resolution again.
 | 
					// pointer and name resolution again.
 | 
				
			||||||
func stripOAIGen(opts *FlattenOpts) (bool, error) {
 | 
					func stripOAIGen(opts *FlattenOpts) (bool, error) {
 | 
				
			||||||
	debugLog("stripOAIGen")
 | 
						debugLog("stripOAIGen")
 | 
				
			||||||
	replacedWithComplex := false
 | 
						replacedWithComplex := false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// figure out referers of OAIGen definitions
 | 
						// figure out referers of OAIGen definitions (doing it before the ref start mutating)
 | 
				
			||||||
	for _, r := range opts.flattenContext.newRefs {
 | 
						for _, r := range opts.flattenContext.newRefs {
 | 
				
			||||||
		if !r.isOAIGen || r.resolved { // bail on already resolved entries (avoid looping)
 | 
							updateRefParents(opts, r)
 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		for k, v := range opts.Spec.references.allRefs {
 | 
					 | 
				
			||||||
			if r.path != v.String() {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			found := false
 | 
					 | 
				
			||||||
			for _, p := range r.parents {
 | 
					 | 
				
			||||||
				if p == k {
 | 
					 | 
				
			||||||
					found = true
 | 
					 | 
				
			||||||
					break
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if !found {
 | 
					 | 
				
			||||||
				r.parents = append(r.parents, k)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	for k := range opts.flattenContext.newRefs {
 | 
						for k := range opts.flattenContext.newRefs {
 | 
				
			||||||
		r := opts.flattenContext.newRefs[k]
 | 
							r := opts.flattenContext.newRefs[k]
 | 
				
			||||||
		//debugLog("newRefs[%s]: isOAIGen: %t, resolved: %t, name: %s, path:%s, #parents: %d, parents: %v,  ref: %s",
 | 
							debugLog("newRefs[%s]: isOAIGen: %t, resolved: %t, name: %s, path:%s, #parents: %d, parents: %v,  ref: %s",
 | 
				
			||||||
		//	k, r.isOAIGen, r.resolved, r.newName, r.path, len(r.parents), r.parents, r.schema.Ref.String())
 | 
								k, r.isOAIGen, r.resolved, r.newName, r.path, len(r.parents), r.parents, r.schema.Ref.String())
 | 
				
			||||||
		if r.isOAIGen && len(r.parents) >= 1 {
 | 
							if r.isOAIGen && len(r.parents) >= 1 {
 | 
				
			||||||
			pr := r.parents
 | 
								pr := topmostFirst(r.parents)
 | 
				
			||||||
			sort.Strings(pr)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// rewrite first parent schema in lexicographical order
 | 
								// rewrite first parent schema in hierarchical then lexicographical order
 | 
				
			||||||
			debugLog("rewrite first parent in lex order %s with schema", pr[0])
 | 
								debugLog("rewrite first parent %s with schema", pr[0])
 | 
				
			||||||
			if err := updateRefWithSchema(opts.Swagger(), pr[0], r.schema); err != nil {
 | 
								if err := updateRefWithSchema(opts.Swagger(), pr[0], r.schema); err != nil {
 | 
				
			||||||
				return false, err
 | 
									return false, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,13 +1,23 @@
 | 
				
			||||||
module github.com/go-openapi/analysis
 | 
					module github.com/go-openapi/analysis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
 | 
						github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 // indirect
 | 
				
			||||||
 | 
						github.com/go-openapi/errors v0.19.3 // indirect
 | 
				
			||||||
	github.com/go-openapi/jsonpointer v0.19.3
 | 
						github.com/go-openapi/jsonpointer v0.19.3
 | 
				
			||||||
 | 
						github.com/go-openapi/jsonreference v0.19.3 // indirect
 | 
				
			||||||
	github.com/go-openapi/loads v0.19.0
 | 
						github.com/go-openapi/loads v0.19.0
 | 
				
			||||||
	github.com/go-openapi/spec v0.19.3
 | 
						github.com/go-openapi/spec v0.19.6
 | 
				
			||||||
	github.com/go-openapi/strfmt v0.19.3
 | 
						github.com/go-openapi/strfmt v0.19.4
 | 
				
			||||||
	github.com/go-openapi/swag v0.19.5
 | 
						github.com/go-openapi/swag v0.19.7
 | 
				
			||||||
 | 
						github.com/kr/pty v1.1.5 // indirect
 | 
				
			||||||
 | 
						github.com/mailru/easyjson v0.7.1 // indirect
 | 
				
			||||||
	github.com/stretchr/testify v1.3.0
 | 
						github.com/stretchr/testify v1.3.0
 | 
				
			||||||
	go.mongodb.org/mongo-driver v1.1.1 // indirect
 | 
						go.mongodb.org/mongo-driver v1.3.0 // indirect
 | 
				
			||||||
 | 
						golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect
 | 
				
			||||||
 | 
						golang.org/x/net v0.0.0-20200226121028-0de0cce0169b // indirect
 | 
				
			||||||
 | 
						golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect
 | 
				
			||||||
 | 
						golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 // indirect
 | 
				
			||||||
 | 
						gopkg.in/yaml.v2 v2.2.8 // indirect
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.13
 | 
					go 1.13
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
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=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
					github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
					github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
				
			||||||
| 
						 | 
					@ -6,6 +7,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
 | 
				
			||||||
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=
 | 
				
			||||||
| 
						 | 
					@ -14,6 +17,8 @@ github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70t
 | 
				
			||||||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
					github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
				
			||||||
github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 | 
					github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 | 
				
			||||||
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
					github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.3 h1:7MGZI1ibQDLasvAz8HuhvYk9eNJbJkCOXWsSjjMS+Zc=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
					github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
					github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 | 
					github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 | 
				
			||||||
| 
						 | 
					@ -22,28 +27,70 @@ github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
					github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
 | 
					github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
					github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.0 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA=
 | 
					github.com/go-openapi/loads v0.19.0 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
					github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 | 
					github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 | 
					github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.6 h1:rMMMj8cV38KVXK7SFc+I2MWClbEfbK705+j+dyqun5g=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
					github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.2 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncCRnE=
 | 
					github.com/go-openapi/strfmt v0.19.2 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncCRnE=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
					github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA=
 | 
					github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
					github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.4 h1:eRvaqAhpL0IL6Trh5fDsGnGhiXndzHFuA05w6sXH6/g=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
				
			||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
					github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
					github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.7 h1:VRuXN2EnMSsZdauzdss6JBC29YotDqG59BZ+tdlIL1s=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
					github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
					github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
				
			||||||
 | 
					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.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
 | 
				
			||||||
 | 
					github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
 | 
				
			||||||
 | 
					github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 | 
				
			||||||
 | 
					github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
				
			||||||
 | 
					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 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 | 
				
			||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
					github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
				
			||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
 | 
					github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
				
			||||||
 | 
					github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 | 
				
			||||||
 | 
					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/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
				
			||||||
 | 
					github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
					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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
				
			||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
					github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
				
			||||||
| 
						 | 
					@ -55,23 +102,47 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
 | 
					github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
 | 
				
			||||||
 | 
					github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
 | 
				
			||||||
 | 
					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/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
					github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
				
			||||||
 | 
					github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 | 
				
			||||||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
					github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
				
			||||||
 | 
					github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
 | 
				
			||||||
 | 
					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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
 | 
					github.com/rogpeppe/go-internal v1.1.0/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/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
				
			||||||
 | 
					github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
				
			||||||
 | 
					github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
 | 
					github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
					github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
				
			||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
					github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
				
			||||||
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/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
 | 
				
			||||||
 | 
					github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU=
 | 
					go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs=
 | 
					go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.0 h1:ew6uUIeJOo+qdUUv7LxFCUhtWmVv7ZV/Xuy4FAUsw2E=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20181005035420-146acd28ed58/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-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
| 
						 | 
					@ -80,18 +151,36 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK
 | 
				
			||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
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.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
					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/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
				
			||||||
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-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-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
 | 
					gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
					gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2/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 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -332,6 +332,9 @@ func mergeSwaggerProps(primary *spec.Swagger, m *spec.Swagger) []string {
 | 
				
			||||||
		if primary.Info.Contact == nil {
 | 
							if primary.Info.Contact == nil {
 | 
				
			||||||
			primary.Info.Contact = m.Info.Contact
 | 
								primary.Info.Contact = m.Info.Contact
 | 
				
			||||||
		} else if m.Info.Contact != nil {
 | 
							} else if m.Info.Contact != nil {
 | 
				
			||||||
 | 
								var csk []string
 | 
				
			||||||
 | 
								primary.Info.Contact.Extensions, csk = mergeExtensions(primary.Info.Contact.Extensions, m.Info.Contact.Extensions)
 | 
				
			||||||
 | 
								skipped = append(skipped, csk...)
 | 
				
			||||||
			if primary.Info.Contact.Name == "" {
 | 
								if primary.Info.Contact.Name == "" {
 | 
				
			||||||
				primary.Info.Contact.Name = m.Info.Contact.Name
 | 
									primary.Info.Contact.Name = m.Info.Contact.Name
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -346,6 +349,9 @@ func mergeSwaggerProps(primary *spec.Swagger, m *spec.Swagger) []string {
 | 
				
			||||||
		if primary.Info.License == nil {
 | 
							if primary.Info.License == nil {
 | 
				
			||||||
			primary.Info.License = m.Info.License
 | 
								primary.Info.License = m.Info.License
 | 
				
			||||||
		} else if m.Info.License != nil {
 | 
							} else if m.Info.License != nil {
 | 
				
			||||||
 | 
								var lsk []string
 | 
				
			||||||
 | 
								primary.Info.License.Extensions, lsk = mergeExtensions(primary.Info.License.Extensions, m.Info.License.Extensions)
 | 
				
			||||||
 | 
								skipped = append(skipped, lsk...)
 | 
				
			||||||
			if primary.Info.License.Name == "" {
 | 
								if primary.Info.License.Name == "" {
 | 
				
			||||||
				primary.Info.License.Name = m.Info.License.Name
 | 
									primary.Info.License.Name = m.Info.License.Name
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,10 @@
 | 
				
			||||||
after_success:
 | 
					after_success:
 | 
				
			||||||
- bash <(curl -s https://codecov.io/bash)
 | 
					- bash <(curl -s https://codecov.io/bash)
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
- 1.11.x
 | 
					- 1.13.x
 | 
				
			||||||
- 1.12.x
 | 
					- 1.14.x
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
					- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
				
			||||||
env:
 | 
					 | 
				
			||||||
- GO111MODULE=on
 | 
					 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  slack:
 | 
					  slack:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,12 @@
 | 
				
			||||||
module github.com/go-openapi/errors
 | 
					module github.com/go-openapi/errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/stretchr/objx v0.2.0 // indirect
 | 
						github.com/davecgh/go-spew v1.1.1 // indirect
 | 
				
			||||||
	github.com/stretchr/testify v1.3.0
 | 
						github.com/kr/text v0.2.0 // indirect
 | 
				
			||||||
 | 
						github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
 | 
				
			||||||
 | 
						github.com/stretchr/testify v1.6.1
 | 
				
			||||||
 | 
						gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
 | 
				
			||||||
 | 
						gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c // indirect
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,26 @@
 | 
				
			||||||
 | 
					github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w=
 | 
				
			||||||
 | 
					github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
				
			||||||
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/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
 | 
				
			||||||
 | 
					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/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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
					github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
					github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 | 
					github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/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=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ package errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import "fmt"
 | 
					import "fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ParseError respresents a parsing error
 | 
					// ParseError represents a parsing error
 | 
				
			||||||
type ParseError struct {
 | 
					type ParseError struct {
 | 
				
			||||||
	code    int32
 | 
						code    int32
 | 
				
			||||||
	Name    string
 | 
						Name    string
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -268,7 +268,7 @@ func DuplicateItems(name, in string) *Validation {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TooManyItems error for when an array contains too many items
 | 
					// TooManyItems error for when an array contains too many items
 | 
				
			||||||
func TooManyItems(name, in string, max int64) *Validation {
 | 
					func TooManyItems(name, in string, max int64, value interface{}) *Validation {
 | 
				
			||||||
	msg := fmt.Sprintf(maxItemsFail, name, in, max)
 | 
						msg := fmt.Sprintf(maxItemsFail, name, in, max)
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		msg = fmt.Sprintf(maxItemsFailNoIn, name, max)
 | 
							msg = fmt.Sprintf(maxItemsFailNoIn, name, max)
 | 
				
			||||||
| 
						 | 
					@ -278,12 +278,13 @@ func TooManyItems(name, in string, max int64) *Validation {
 | 
				
			||||||
		code:    MaxItemsFailCode,
 | 
							code:    MaxItemsFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
 | 
							Value:   value,
 | 
				
			||||||
		message: msg,
 | 
							message: msg,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TooFewItems error for when an array contains too few items
 | 
					// TooFewItems error for when an array contains too few items
 | 
				
			||||||
func TooFewItems(name, in string, min int64) *Validation {
 | 
					func TooFewItems(name, in string, min int64, value interface{}) *Validation {
 | 
				
			||||||
	msg := fmt.Sprintf(minItemsFail, name, in, min)
 | 
						msg := fmt.Sprintf(minItemsFail, name, in, min)
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		msg = fmt.Sprintf(minItemsFailNoIn, name, min)
 | 
							msg = fmt.Sprintf(minItemsFailNoIn, name, min)
 | 
				
			||||||
| 
						 | 
					@ -292,12 +293,13 @@ func TooFewItems(name, in string, min int64) *Validation {
 | 
				
			||||||
		code:    MinItemsFailCode,
 | 
							code:    MinItemsFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
 | 
							Value:   value,
 | 
				
			||||||
		message: msg,
 | 
							message: msg,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExceedsMaximumInt error for when maxinum validation fails
 | 
					// ExceedsMaximumInt error for when maximum validation fails
 | 
				
			||||||
func ExceedsMaximumInt(name, in string, max int64, exclusive bool) *Validation {
 | 
					func ExceedsMaximumInt(name, in string, max int64, exclusive bool, value interface{}) *Validation {
 | 
				
			||||||
	var message string
 | 
						var message string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		m := maxIncFailNoIn
 | 
							m := maxIncFailNoIn
 | 
				
			||||||
| 
						 | 
					@ -316,13 +318,13 @@ func ExceedsMaximumInt(name, in string, max int64, exclusive bool) *Validation {
 | 
				
			||||||
		code:    MaxFailCode,
 | 
							code:    MaxFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
		Value:   max,
 | 
							Value:   value,
 | 
				
			||||||
		message: message,
 | 
							message: message,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExceedsMaximumUint error for when maxinum validation fails
 | 
					// ExceedsMaximumUint error for when maximum validation fails
 | 
				
			||||||
func ExceedsMaximumUint(name, in string, max uint64, exclusive bool) *Validation {
 | 
					func ExceedsMaximumUint(name, in string, max uint64, exclusive bool, value interface{}) *Validation {
 | 
				
			||||||
	var message string
 | 
						var message string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		m := maxIncFailNoIn
 | 
							m := maxIncFailNoIn
 | 
				
			||||||
| 
						 | 
					@ -341,13 +343,13 @@ func ExceedsMaximumUint(name, in string, max uint64, exclusive bool) *Validation
 | 
				
			||||||
		code:    MaxFailCode,
 | 
							code:    MaxFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
		Value:   max,
 | 
							Value:   value,
 | 
				
			||||||
		message: message,
 | 
							message: message,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExceedsMaximum error for when maxinum validation fails
 | 
					// ExceedsMaximum error for when maximum validation fails
 | 
				
			||||||
func ExceedsMaximum(name, in string, max float64, exclusive bool) *Validation {
 | 
					func ExceedsMaximum(name, in string, max float64, exclusive bool, value interface{}) *Validation {
 | 
				
			||||||
	var message string
 | 
						var message string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		m := maxIncFailNoIn
 | 
							m := maxIncFailNoIn
 | 
				
			||||||
| 
						 | 
					@ -366,13 +368,13 @@ func ExceedsMaximum(name, in string, max float64, exclusive bool) *Validation {
 | 
				
			||||||
		code:    MaxFailCode,
 | 
							code:    MaxFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
		Value:   max,
 | 
							Value:   value,
 | 
				
			||||||
		message: message,
 | 
							message: message,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExceedsMinimumInt error for when maxinum validation fails
 | 
					// ExceedsMinimumInt error for when minimum validation fails
 | 
				
			||||||
func ExceedsMinimumInt(name, in string, min int64, exclusive bool) *Validation {
 | 
					func ExceedsMinimumInt(name, in string, min int64, exclusive bool, value interface{}) *Validation {
 | 
				
			||||||
	var message string
 | 
						var message string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		m := minIncFailNoIn
 | 
							m := minIncFailNoIn
 | 
				
			||||||
| 
						 | 
					@ -391,13 +393,13 @@ func ExceedsMinimumInt(name, in string, min int64, exclusive bool) *Validation {
 | 
				
			||||||
		code:    MinFailCode,
 | 
							code:    MinFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
		Value:   min,
 | 
							Value:   value,
 | 
				
			||||||
		message: message,
 | 
							message: message,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExceedsMinimumUint error for when maxinum validation fails
 | 
					// ExceedsMinimumUint error for when minimum validation fails
 | 
				
			||||||
func ExceedsMinimumUint(name, in string, min uint64, exclusive bool) *Validation {
 | 
					func ExceedsMinimumUint(name, in string, min uint64, exclusive bool, value interface{}) *Validation {
 | 
				
			||||||
	var message string
 | 
						var message string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		m := minIncFailNoIn
 | 
							m := minIncFailNoIn
 | 
				
			||||||
| 
						 | 
					@ -416,13 +418,13 @@ func ExceedsMinimumUint(name, in string, min uint64, exclusive bool) *Validation
 | 
				
			||||||
		code:    MinFailCode,
 | 
							code:    MinFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
		Value:   min,
 | 
							Value:   value,
 | 
				
			||||||
		message: message,
 | 
							message: message,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ExceedsMinimum error for when maxinum validation fails
 | 
					// ExceedsMinimum error for when minimum validation fails
 | 
				
			||||||
func ExceedsMinimum(name, in string, min float64, exclusive bool) *Validation {
 | 
					func ExceedsMinimum(name, in string, min float64, exclusive bool, value interface{}) *Validation {
 | 
				
			||||||
	var message string
 | 
						var message string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		m := minIncFailNoIn
 | 
							m := minIncFailNoIn
 | 
				
			||||||
| 
						 | 
					@ -441,13 +443,13 @@ func ExceedsMinimum(name, in string, min float64, exclusive bool) *Validation {
 | 
				
			||||||
		code:    MinFailCode,
 | 
							code:    MinFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
		Value:   min,
 | 
							Value:   value,
 | 
				
			||||||
		message: message,
 | 
							message: message,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NotMultipleOf error for when multiple of validation fails
 | 
					// NotMultipleOf error for when multiple of validation fails
 | 
				
			||||||
func NotMultipleOf(name, in string, multiple interface{}) *Validation {
 | 
					func NotMultipleOf(name, in string, multiple, value interface{}) *Validation {
 | 
				
			||||||
	var msg string
 | 
						var msg string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		msg = fmt.Sprintf(multipleOfFailNoIn, name, multiple)
 | 
							msg = fmt.Sprintf(multipleOfFailNoIn, name, multiple)
 | 
				
			||||||
| 
						 | 
					@ -458,7 +460,7 @@ func NotMultipleOf(name, in string, multiple interface{}) *Validation {
 | 
				
			||||||
		code:    MultipleOfFailCode,
 | 
							code:    MultipleOfFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
		Value:   multiple,
 | 
							Value:   value,
 | 
				
			||||||
		message: msg,
 | 
							message: msg,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -483,7 +485,7 @@ func EnumFail(name, in string, value interface{}, values []interface{}) *Validat
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Required error for when a value is missing
 | 
					// Required error for when a value is missing
 | 
				
			||||||
func Required(name, in string) *Validation {
 | 
					func Required(name, in string, value interface{}) *Validation {
 | 
				
			||||||
	var msg string
 | 
						var msg string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		msg = fmt.Sprintf(requiredFailNoIn, name)
 | 
							msg = fmt.Sprintf(requiredFailNoIn, name)
 | 
				
			||||||
| 
						 | 
					@ -494,12 +496,13 @@ func Required(name, in string) *Validation {
 | 
				
			||||||
		code:    RequiredFailCode,
 | 
							code:    RequiredFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
 | 
							Value:   value,
 | 
				
			||||||
		message: msg,
 | 
							message: msg,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TooLong error for when a string is too long
 | 
					// TooLong error for when a string is too long
 | 
				
			||||||
func TooLong(name, in string, max int64) *Validation {
 | 
					func TooLong(name, in string, max int64, value interface{}) *Validation {
 | 
				
			||||||
	var msg string
 | 
						var msg string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		msg = fmt.Sprintf(tooLongMessageNoIn, name, max)
 | 
							msg = fmt.Sprintf(tooLongMessageNoIn, name, max)
 | 
				
			||||||
| 
						 | 
					@ -510,12 +513,13 @@ func TooLong(name, in string, max int64) *Validation {
 | 
				
			||||||
		code:    TooLongFailCode,
 | 
							code:    TooLongFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
 | 
							Value:   value,
 | 
				
			||||||
		message: msg,
 | 
							message: msg,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TooShort error for when a string is too short
 | 
					// TooShort error for when a string is too short
 | 
				
			||||||
func TooShort(name, in string, min int64) *Validation {
 | 
					func TooShort(name, in string, min int64, value interface{}) *Validation {
 | 
				
			||||||
	var msg string
 | 
						var msg string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		msg = fmt.Sprintf(tooShortMessageNoIn, name, min)
 | 
							msg = fmt.Sprintf(tooShortMessageNoIn, name, min)
 | 
				
			||||||
| 
						 | 
					@ -527,13 +531,14 @@ func TooShort(name, in string, min int64) *Validation {
 | 
				
			||||||
		code:    TooShortFailCode,
 | 
							code:    TooShortFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
 | 
							Value:   value,
 | 
				
			||||||
		message: msg,
 | 
							message: msg,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FailedPattern error for when a string fails a regex pattern match
 | 
					// FailedPattern error for when a string fails a regex pattern match
 | 
				
			||||||
// the pattern that is returned is the ECMA syntax version of the pattern not the golang version.
 | 
					// the pattern that is returned is the ECMA syntax version of the pattern not the golang version.
 | 
				
			||||||
func FailedPattern(name, in, pattern string) *Validation {
 | 
					func FailedPattern(name, in, pattern string, value interface{}) *Validation {
 | 
				
			||||||
	var msg string
 | 
						var msg string
 | 
				
			||||||
	if in == "" {
 | 
						if in == "" {
 | 
				
			||||||
		msg = fmt.Sprintf(patternFailNoIn, name, pattern)
 | 
							msg = fmt.Sprintf(patternFailNoIn, name, pattern)
 | 
				
			||||||
| 
						 | 
					@ -545,6 +550,7 @@ func FailedPattern(name, in, pattern string) *Validation {
 | 
				
			||||||
		code:    PatternFailCode,
 | 
							code:    PatternFailCode,
 | 
				
			||||||
		Name:    name,
 | 
							Name:    name,
 | 
				
			||||||
		In:      in,
 | 
							In:      in,
 | 
				
			||||||
 | 
							Value:   value,
 | 
				
			||||||
		message: msg,
 | 
							message: msg,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
An implementation of JSON Reference - Go language
 | 
					An implementation of JSON Reference - Go language
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Status
 | 
					## Status
 | 
				
			||||||
Work in progress ( 90% done )
 | 
					Feature complete. Stable API
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Dependencies
 | 
					## Dependencies
 | 
				
			||||||
https://github.com/go-openapi/jsonpointer
 | 
					https://github.com/go-openapi/jsonpointer
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@ require (
 | 
				
			||||||
	github.com/go-openapi/jsonpointer v0.19.3
 | 
						github.com/go-openapi/jsonpointer v0.19.3
 | 
				
			||||||
	github.com/stretchr/testify v1.3.0
 | 
						github.com/stretchr/testify v1.3.0
 | 
				
			||||||
	golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect
 | 
						golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect
 | 
				
			||||||
	golang.org/x/text v0.3.2 // indirect
 | 
						golang.org/x/text v0.3.3 // indirect
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.13
 | 
					go 1.13
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,12 +5,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko
 | 
				
			||||||
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/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
 | 
					github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 | 
					github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
					 | 
				
			||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					 | 
				
			||||||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
					github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
					github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
				
			||||||
| 
						 | 
					@ -28,14 +24,12 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
 | 
				
			||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
					github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
					golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
 | 
				
			||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
					golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
				
			||||||
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=
 | 
				
			||||||
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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,10 @@
 | 
				
			||||||
after_success:
 | 
					after_success:
 | 
				
			||||||
- bash <(curl -s https://codecov.io/bash)
 | 
					- bash <(curl -s https://codecov.io/bash)
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
- 1.11.x
 | 
					- 1.13.x
 | 
				
			||||||
- 1.12.x
 | 
					- 1.14.x
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
					- go get -u gotest.tools/gotestsum
 | 
				
			||||||
env:
 | 
					 | 
				
			||||||
- GO111MODULE=on
 | 
					 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  slack:
 | 
					  slack:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,11 @@
 | 
				
			||||||
module github.com/go-openapi/loads
 | 
					module github.com/go-openapi/loads
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/go-openapi/analysis v0.19.5
 | 
						github.com/go-openapi/analysis v0.19.10
 | 
				
			||||||
	github.com/go-openapi/spec v0.19.3
 | 
						github.com/go-openapi/spec v0.19.6
 | 
				
			||||||
	github.com/go-openapi/swag v0.19.5
 | 
						github.com/go-openapi/swag v0.19.7
 | 
				
			||||||
	github.com/stretchr/testify v1.3.0
 | 
						github.com/stretchr/testify v1.3.0
 | 
				
			||||||
	gopkg.in/yaml.v2 v2.2.2
 | 
						gopkg.in/yaml.v2 v2.2.8
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.13
 | 
					go 1.13
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
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=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
					github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
					github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
				
			||||||
| 
						 | 
					@ -6,16 +7,20 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496 h1:zV3ejI06GQ59hwDQAvmK1qxOQGB3WuVTRoY0okPTAv0=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
 | 
				
			||||||
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/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 | 
					github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 | 
				
			||||||
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.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI=
 | 
					github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE=
 | 
				
			||||||
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
 | 
					github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ=
 | 
				
			||||||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
					github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
				
			||||||
github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 | 
					github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 | 
				
			||||||
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
					github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.3 h1:7MGZI1ibQDLasvAz8HuhvYk9eNJbJkCOXWsSjjMS+Zc=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
					github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
					github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 | 
					github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 | 
				
			||||||
| 
						 | 
					@ -24,25 +29,63 @@ github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
					github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
 | 
					github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
					github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
					github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 | 
					github.com/go-openapi/spec v0.19.6 h1:rMMMj8cV38KVXK7SFc+I2MWClbEfbK705+j+dyqun5g=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 | 
					github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
					github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA=
 | 
					github.com/go-openapi/strfmt v0.19.4 h1:eRvaqAhpL0IL6Trh5fDsGnGhiXndzHFuA05w6sXH6/g=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
					github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
				
			||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
					github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
					github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.7 h1:VRuXN2EnMSsZdauzdss6JBC29YotDqG59BZ+tdlIL1s=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
					github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
					github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
				
			||||||
 | 
					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.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
 | 
				
			||||||
 | 
					github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
 | 
				
			||||||
 | 
					github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 | 
				
			||||||
 | 
					github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
				
			||||||
 | 
					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 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 | 
				
			||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
					github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
				
			||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
 | 
					github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
				
			||||||
 | 
					github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 | 
				
			||||||
 | 
					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/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
				
			||||||
 | 
					github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
					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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
				
			||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
					github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
				
			||||||
| 
						 | 
					@ -54,23 +97,45 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
 | 
					github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
 | 
				
			||||||
 | 
					github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
 | 
				
			||||||
 | 
					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/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
					github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
				
			||||||
 | 
					github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 | 
				
			||||||
github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
					github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
				
			||||||
 | 
					github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
 | 
				
			||||||
 | 
					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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
 | 
					github.com/rogpeppe/go-internal v1.1.0/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/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
				
			||||||
 | 
					github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
				
			||||||
 | 
					github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
 | 
					github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
					github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
				
			||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
					github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
				
			||||||
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/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
 | 
				
			||||||
 | 
					github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU=
 | 
					go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs=
 | 
					go.mongodb.org/mongo-driver v1.3.0 h1:ew6uUIeJOo+qdUUv7LxFCUhtWmVv7ZV/Xuy4FAUsw2E=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20181005035420-146acd28ed58/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-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
| 
						 | 
					@ -79,18 +144,37 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK
 | 
				
			||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
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.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
					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/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
				
			||||||
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-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-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
 | 
					gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
					gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2/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 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,10 @@
 | 
				
			||||||
after_success:
 | 
					after_success:
 | 
				
			||||||
- bash <(curl -s https://codecov.io/bash)
 | 
					- bash <(curl -s https://codecov.io/bash)
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
- 1.11.x
 | 
					- 1.13.x
 | 
				
			||||||
- 1.12.x
 | 
					- 1.14.x
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
					- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
				
			||||||
env:
 | 
					 | 
				
			||||||
- GO111MODULE=on
 | 
					 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  slack:
 | 
					  slack:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,7 +41,7 @@ type ClientRequestWriter interface {
 | 
				
			||||||
// add information to a swagger client request
 | 
					// add information to a swagger client request
 | 
				
			||||||
type ClientRequest interface {
 | 
					type ClientRequest interface {
 | 
				
			||||||
	SetHeaderParam(string, ...string) error
 | 
						SetHeaderParam(string, ...string) error
 | 
				
			||||||
	
 | 
					
 | 
				
			||||||
	GetHeaderParams() http.Header
 | 
						GetHeaderParams() http.Header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	SetQueryParam(string, ...string) error
 | 
						SetQueryParam(string, ...string) error
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,8 @@ package runtime
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"io"
 | 
						"io"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// A ClientResponse represents a client response
 | 
					// A ClientResponse represents a client response
 | 
				
			||||||
| 
						 | 
					@ -59,5 +61,10 @@ type APIError struct {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (a *APIError) Error() string {
 | 
					func (a *APIError) Error() string {
 | 
				
			||||||
	return fmt.Sprintf("%s (status %d): %+v ", a.OperationName, a.Code, a.Response)
 | 
						resp, _ := json.Marshal(a.Response)
 | 
				
			||||||
 | 
						return fmt.Sprintf("%s (status %d): %s", a.OperationName, a.Code, resp)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (a *APIError) String() string {
 | 
				
			||||||
 | 
						return a.Error()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,15 +2,16 @@ module github.com/go-openapi/runtime
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/docker/go-units v0.4.0
 | 
						github.com/docker/go-units v0.4.0
 | 
				
			||||||
	github.com/go-openapi/analysis v0.19.5
 | 
						github.com/go-openapi/analysis v0.19.10
 | 
				
			||||||
	github.com/go-openapi/errors v0.19.2
 | 
						github.com/go-openapi/errors v0.19.6
 | 
				
			||||||
	github.com/go-openapi/loads v0.19.3
 | 
						github.com/go-openapi/loads v0.19.5
 | 
				
			||||||
	github.com/go-openapi/spec v0.19.3
 | 
						github.com/go-openapi/spec v0.19.8
 | 
				
			||||||
	github.com/go-openapi/strfmt v0.19.3
 | 
						github.com/go-openapi/strfmt v0.19.5
 | 
				
			||||||
	github.com/go-openapi/swag v0.19.5
 | 
						github.com/go-openapi/swag v0.19.9
 | 
				
			||||||
	github.com/go-openapi/validate v0.19.3
 | 
						github.com/go-openapi/validate v0.19.10
 | 
				
			||||||
	github.com/stretchr/testify v1.4.0
 | 
						github.com/stretchr/testify v1.6.1
 | 
				
			||||||
	gopkg.in/yaml.v2 v2.2.2
 | 
						gopkg.in/yaml.v2 v2.3.0
 | 
				
			||||||
 | 
						gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.13
 | 
					go 1.13
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
 | 
					github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
 | 
				
			||||||
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=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
					github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
				
			||||||
| 
						 | 
					@ -8,6 +9,10 @@ github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzs
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
 | 
				
			||||||
 | 
					github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
				
			||||||
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=
 | 
				
			||||||
| 
						 | 
					@ -26,10 +31,15 @@ github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9sn
 | 
				
			||||||
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
 | 
					github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
 | 
				
			||||||
github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI=
 | 
					github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI=
 | 
				
			||||||
github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
 | 
					github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
 | 
				
			||||||
 | 
					github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE=
 | 
				
			||||||
 | 
					github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ=
 | 
				
			||||||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
					github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
				
			||||||
github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
					github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
				
			||||||
github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 | 
					github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 | 
				
			||||||
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
					github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
					github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
					github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
					github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
				
			||||||
| 
						 | 
					@ -40,6 +50,8 @@ github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
					github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
 | 
					github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
					github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
 | 
				
			||||||
github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
| 
						 | 
					@ -47,15 +59,21 @@ github.com/go-openapi/loads v0.19.2 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFR
 | 
				
			||||||
github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
 | 
					github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.3 h1:jwIoahqCmaA5OBoc/B+1+Mu2L0Gr8xYQnbeyQEo/7b0=
 | 
					github.com/go-openapi/loads v0.19.3 h1:jwIoahqCmaA5OBoc/B+1+Mu2L0Gr8xYQnbeyQEo/7b0=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI=
 | 
					github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI=
 | 
				
			||||||
 | 
					github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls=
 | 
				
			||||||
 | 
					github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY=
 | 
				
			||||||
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
 | 
					github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
 | 
				
			||||||
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
 | 
					github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
 | 
				
			||||||
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
 | 
					github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
 | 
				
			||||||
 | 
					github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo=
 | 
				
			||||||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
					github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
				
			||||||
github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
					github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE=
 | 
					github.com/go-openapi/spec v0.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
 | 
					github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 | 
					github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 | 
					github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
					github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
					github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.0 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk=
 | 
					github.com/go-openapi/strfmt v0.19.0 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk=
 | 
				
			||||||
| 
						 | 
					@ -63,30 +81,74 @@ github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+Z
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
					github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA=
 | 
					github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
					github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
				
			||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
					github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
					github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
 | 
				
			||||||
github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
 | 
					github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
 | 
				
			||||||
github.com/go-openapi/validate v0.19.2 h1:ky5l57HjyVRrsJfd2+Ro5Z9PjGuKbsmftwyMtk8H7js=
 | 
					github.com/go-openapi/validate v0.19.2 h1:ky5l57HjyVRrsJfd2+Ro5Z9PjGuKbsmftwyMtk8H7js=
 | 
				
			||||||
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
 | 
					github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
 | 
				
			||||||
github.com/go-openapi/validate v0.19.3 h1:PAH/2DylwWcIU1s0Y7k3yNmeAgWOcKrNE2Q7Ww/kCg4=
 | 
					github.com/go-openapi/validate v0.19.3 h1:PAH/2DylwWcIU1s0Y7k3yNmeAgWOcKrNE2Q7Ww/kCg4=
 | 
				
			||||||
github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo=
 | 
					github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo=
 | 
				
			||||||
 | 
					github.com/go-openapi/validate v0.19.10 h1:tG3SZ5DC5KF4cyt7nqLVcQXGj5A7mpaYkAcNPlDK+Yk=
 | 
				
			||||||
 | 
					github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
					github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
					github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
				
			||||||
 | 
					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.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
 | 
				
			||||||
 | 
					github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
 | 
				
			||||||
 | 
					github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 | 
				
			||||||
 | 
					github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
				
			||||||
 | 
					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 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 | 
				
			||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
					github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
				
			||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
 | 
					github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
				
			||||||
 | 
					github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 | 
				
			||||||
 | 
					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/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
				
			||||||
 | 
					github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
					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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
				
			||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
					github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
				
			||||||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 | 
					github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 | 
				
			||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 | 
					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.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/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic=
 | 
					github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe h1:W/GaMY0y69G4cFlmsC6B9sbuo2fP8OFP1ABjt4kPz+w=
 | 
					github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe h1:W/GaMY0y69G4cFlmsC6B9sbuo2fP8OFP1ABjt4kPz+w=
 | 
				
			||||||
| 
						 | 
					@ -95,11 +157,31 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
 | 
					github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
 | 
				
			||||||
 | 
					github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
 | 
				
			||||||
 | 
					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/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
					github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
				
			||||||
 | 
					github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg=
 | 
				
			||||||
 | 
					github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
				
			||||||
 | 
					github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 | 
				
			||||||
 | 
					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/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
					github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
				
			||||||
 | 
					github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
 | 
				
			||||||
 | 
					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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
 | 
					github.com/rogpeppe/go-internal v1.1.0/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/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
				
			||||||
 | 
					github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
				
			||||||
 | 
					github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
					github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
				
			||||||
| 
						 | 
					@ -109,13 +191,23 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0
 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
				
			||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
					github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
				
			||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
					github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
				
			||||||
 | 
					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/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/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
 | 
				
			||||||
 | 
					github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs=
 | 
					go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
				
			||||||
| 
						 | 
					@ -127,21 +219,50 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowK
 | 
				
			||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/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-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 | 
					golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 | 
				
			||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
					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/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
				
			||||||
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-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-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/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-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
					gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2/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 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 | 
				
			||||||
 | 
					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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,5 +8,13 @@ type Logger interface {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DebugEnabled() bool {
 | 
					func DebugEnabled() bool {
 | 
				
			||||||
	return os.Getenv("SWAGGER_DEBUG") != "" || os.Getenv("DEBUG") != ""
 | 
						d := os.Getenv("SWAGGER_DEBUG")
 | 
				
			||||||
 | 
						if d != "" && d != "false" && d != "0" {
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						d = os.Getenv("DEBUG")
 | 
				
			||||||
 | 
						if d != "" && d != "false" && d != "0" {
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,16 +21,16 @@ import (
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-openapi/runtime/security"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/go-openapi/analysis"
 | 
						"github.com/go-openapi/analysis"
 | 
				
			||||||
	"github.com/go-openapi/errors"
 | 
						"github.com/go-openapi/errors"
 | 
				
			||||||
	"github.com/go-openapi/loads"
 | 
						"github.com/go-openapi/loads"
 | 
				
			||||||
 | 
						"github.com/go-openapi/spec"
 | 
				
			||||||
 | 
						"github.com/go-openapi/strfmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-openapi/runtime"
 | 
						"github.com/go-openapi/runtime"
 | 
				
			||||||
	"github.com/go-openapi/runtime/logger"
 | 
						"github.com/go-openapi/runtime/logger"
 | 
				
			||||||
	"github.com/go-openapi/runtime/middleware/untyped"
 | 
						"github.com/go-openapi/runtime/middleware/untyped"
 | 
				
			||||||
	"github.com/go-openapi/spec"
 | 
						"github.com/go-openapi/runtime/security"
 | 
				
			||||||
	"github.com/go-openapi/strfmt"
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Debug when true turns on verbose logging
 | 
					// Debug when true turns on verbose logging
 | 
				
			||||||
| 
						 | 
					@ -280,8 +280,8 @@ func (c *Context) RequiredProduces() []string {
 | 
				
			||||||
// if the request is not valid an error will be returned
 | 
					// if the request is not valid an error will be returned
 | 
				
			||||||
func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, binder RequestBinder) error {
 | 
					func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, binder RequestBinder) error {
 | 
				
			||||||
	var res []error
 | 
						var res []error
 | 
				
			||||||
 | 
						var requestContentType string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	requestContentType := "*/*"
 | 
					 | 
				
			||||||
	// check and validate content type, select consumer
 | 
						// check and validate content type, select consumer
 | 
				
			||||||
	if runtime.HasBody(request) {
 | 
						if runtime.HasBody(request) {
 | 
				
			||||||
		ct, _, err := runtime.ContentType(request.Header)
 | 
							ct, _, err := runtime.ContentType(request.Header)
 | 
				
			||||||
| 
						 | 
					@ -304,7 +304,13 @@ func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, b
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// check and validate the response format
 | 
						// check and validate the response format
 | 
				
			||||||
	if len(res) == 0 && runtime.HasBody(request) {
 | 
						if len(res) == 0 {
 | 
				
			||||||
 | 
							// if the route does not provide Produces and a default contentType could not be identified
 | 
				
			||||||
 | 
							// based on a body, typical for GET and DELETE requests, then default contentType to.
 | 
				
			||||||
 | 
							if len(route.Produces) == 0 && requestContentType == "" {
 | 
				
			||||||
 | 
								requestContentType = "*/*"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if str := NegotiateContentType(request, route.Produces, requestContentType); str == "" {
 | 
							if str := NegotiateContentType(request, route.Produces, requestContentType); str == "" {
 | 
				
			||||||
			res = append(res, errors.InvalidResponseFormat(request.Header.Get(runtime.HeaderAccept), route.Produces))
 | 
								res = append(res, errors.InvalidResponseFormat(request.Header.Get(runtime.HeaderAccept), route.Produces))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -433,6 +439,8 @@ func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (interfa
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rCtx = request.Context()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rCtx = stdContext.WithValue(rCtx, ctxSecurityPrincipal, usr)
 | 
						rCtx = stdContext.WithValue(rCtx, ctxSecurityPrincipal, usr)
 | 
				
			||||||
	rCtx = stdContext.WithValue(rCtx, ctxSecurityScopes, route.Authenticator.AllScopes())
 | 
						rCtx = stdContext.WithValue(rCtx, ctxSecurityScopes, route.Authenticator.AllScopes())
 | 
				
			||||||
	return usr, request.WithContext(rCtx), nil
 | 
						return usr, request.WithContext(rCtx), nil
 | 
				
			||||||
| 
						 | 
					@ -559,6 +567,26 @@ func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []st
 | 
				
			||||||
	c.api.ServeErrorFor(route.Operation.ID)(rw, r, errors.New(http.StatusInternalServerError, "can't produce response"))
 | 
						c.api.ServeErrorFor(route.Operation.ID)(rw, r, errors.New(http.StatusInternalServerError, "can't produce response"))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *Context) APIHandlerSwaggerUI(builder Builder) http.Handler {
 | 
				
			||||||
 | 
						b := builder
 | 
				
			||||||
 | 
						if b == nil {
 | 
				
			||||||
 | 
							b = PassthroughBuilder
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var title string
 | 
				
			||||||
 | 
						sp := c.spec.Spec()
 | 
				
			||||||
 | 
						if sp != nil && sp.Info != nil && sp.Info.Title != "" {
 | 
				
			||||||
 | 
							title = sp.Info.Title
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						swaggerUIOpts := SwaggerUIOpts{
 | 
				
			||||||
 | 
							BasePath: c.BasePath(),
 | 
				
			||||||
 | 
							Title:    title,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return Spec("", c.spec.Raw(), SwaggerUI(swaggerUIOpts, c.RoutesHandler(b)))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// APIHandler returns a handler to serve the API, this includes a swagger spec, router and the contract defined in the swagger spec
 | 
					// APIHandler returns a handler to serve the API, this includes a swagger spec, router and the contract defined in the swagger spec
 | 
				
			||||||
func (c *Context) APIHandler(builder Builder) http.Handler {
 | 
					func (c *Context) APIHandler(builder Builder) http.Handler {
 | 
				
			||||||
	b := builder
 | 
						b := builder
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,9 @@ const (
 | 
				
			||||||
	// TerminationCharacter is a special character for end of path.
 | 
						// TerminationCharacter is a special character for end of path.
 | 
				
			||||||
	TerminationCharacter = '#'
 | 
						TerminationCharacter = '#'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// SeparatorCharacter separates path segments.
 | 
				
			||||||
 | 
						SeparatorCharacter = '/'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// MaxSize is max size of records and internal slice.
 | 
						// MaxSize is max size of records and internal slice.
 | 
				
			||||||
	MaxSize = (1 << 22) - 1
 | 
						MaxSize = (1 << 22) - 1
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -420,10 +423,11 @@ type record struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// makeRecords returns the records that use to build Double-Arrays.
 | 
					// makeRecords returns the records that use to build Double-Arrays.
 | 
				
			||||||
func makeRecords(srcs []Record) (statics, params []*record) {
 | 
					func makeRecords(srcs []Record) (statics, params []*record) {
 | 
				
			||||||
	spChars := string([]byte{ParamCharacter, WildcardCharacter})
 | 
					 | 
				
			||||||
	termChar := string(TerminationCharacter)
 | 
						termChar := string(TerminationCharacter)
 | 
				
			||||||
 | 
						paramPrefix := string(SeparatorCharacter) + string(ParamCharacter)
 | 
				
			||||||
 | 
						wildcardPrefix := string(SeparatorCharacter) + string(WildcardCharacter)
 | 
				
			||||||
	for _, r := range srcs {
 | 
						for _, r := range srcs {
 | 
				
			||||||
		if strings.ContainsAny(r.Key, spChars) {
 | 
							if strings.Contains(r.Key, paramPrefix) || strings.Contains(r.Key, wildcardPrefix) {
 | 
				
			||||||
			r.Key += termChar
 | 
								r.Key += termChar
 | 
				
			||||||
			params = append(params, &record{Record: r})
 | 
								params = append(params, &record{Record: r})
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,11 +38,30 @@ func (e *errorResp) WriteResponse(rw http.ResponseWriter, producer runtime.Produ
 | 
				
			||||||
		rw.WriteHeader(http.StatusInternalServerError)
 | 
							rw.WriteHeader(http.StatusInternalServerError)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := producer.Produce(rw, e.response); err != nil {
 | 
						if err := producer.Produce(rw, e.response); err != nil {
 | 
				
			||||||
		panic(err)
 | 
							Logger.Printf("failed to write error response: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NotImplemented the error response when the response is not implemented
 | 
					// NotImplemented the error response when the response is not implemented
 | 
				
			||||||
func NotImplemented(message string) Responder {
 | 
					func NotImplemented(message string) Responder {
 | 
				
			||||||
	return &errorResp{http.StatusNotImplemented, message, make(http.Header)}
 | 
						return Error(http.StatusNotImplemented, message)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Error creates a generic responder for returning errors, the data will be serialized
 | 
				
			||||||
 | 
					// with the matching producer for the request
 | 
				
			||||||
 | 
					func Error(code int, data interface{}, headers ...http.Header) Responder {
 | 
				
			||||||
 | 
						var hdr http.Header
 | 
				
			||||||
 | 
						for _, h := range headers {
 | 
				
			||||||
 | 
							for k, v := range h {
 | 
				
			||||||
 | 
								if hdr == nil {
 | 
				
			||||||
 | 
									hdr = make(http.Header)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								hdr[k] = v
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &errorResp{
 | 
				
			||||||
 | 
							code:     code,
 | 
				
			||||||
 | 
							response: data,
 | 
				
			||||||
 | 
							headers:  hdr,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,11 +24,12 @@ import (
 | 
				
			||||||
	"strconv"
 | 
						"strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-openapi/errors"
 | 
						"github.com/go-openapi/errors"
 | 
				
			||||||
	"github.com/go-openapi/runtime"
 | 
					 | 
				
			||||||
	"github.com/go-openapi/spec"
 | 
						"github.com/go-openapi/spec"
 | 
				
			||||||
	"github.com/go-openapi/strfmt"
 | 
						"github.com/go-openapi/strfmt"
 | 
				
			||||||
	"github.com/go-openapi/swag"
 | 
						"github.com/go-openapi/swag"
 | 
				
			||||||
	"github.com/go-openapi/validate"
 | 
						"github.com/go-openapi/validate"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-openapi/runtime"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const defaultMaxMemory = 32 << 20
 | 
					const defaultMaxMemory = 32 << 20
 | 
				
			||||||
| 
						 | 
					@ -275,7 +276,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!hasKey || (!p.parameter.AllowEmptyValue && data == "")) && p.parameter.Required && p.parameter.Default == nil {
 | 
						if (!hasKey || (!p.parameter.AllowEmptyValue && data == "")) && p.parameter.Required && p.parameter.Default == nil {
 | 
				
			||||||
		return errors.Required(p.Name, p.parameter.In)
 | 
							return errors.Required(p.Name, p.parameter.In, data)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ok, err := p.tryUnmarshaler(target, defaultValue, data)
 | 
						ok, err := p.tryUnmarshaler(target, defaultValue, data)
 | 
				
			||||||
| 
						 | 
					@ -450,7 +451,7 @@ func (p *untypedParamBinder) readFormattedSliceFieldValue(data string, target re
 | 
				
			||||||
func (p *untypedParamBinder) setSliceFieldValue(target reflect.Value, defaultValue interface{}, data []string, hasKey bool) error {
 | 
					func (p *untypedParamBinder) setSliceFieldValue(target reflect.Value, defaultValue interface{}, data []string, hasKey bool) error {
 | 
				
			||||||
	sz := len(data)
 | 
						sz := len(data)
 | 
				
			||||||
	if (!hasKey || (!p.parameter.AllowEmptyValue && (sz == 0 || (sz == 1 && data[0] == "")))) && p.parameter.Required && defaultValue == nil {
 | 
						if (!hasKey || (!p.parameter.AllowEmptyValue && (sz == 0 || (sz == 1 && data[0] == "")))) && p.parameter.Required && defaultValue == nil {
 | 
				
			||||||
		return errors.Required(p.Name, p.parameter.In)
 | 
							return errors.Required(p.Name, p.parameter.In, data)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	defVal := reflect.Zero(target.Type())
 | 
						defVal := reflect.Zero(target.Type())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@ type RedocOpts struct {
 | 
				
			||||||
	Path string
 | 
						Path string
 | 
				
			||||||
	// SpecURL the url to find the spec for
 | 
						// SpecURL the url to find the spec for
 | 
				
			||||||
	SpecURL string
 | 
						SpecURL string
 | 
				
			||||||
	// RedocURL for the js that generates the redoc site, defaults to: https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js
 | 
						// RedocURL for the js that generates the redoc site, defaults to: https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js
 | 
				
			||||||
	RedocURL string
 | 
						RedocURL string
 | 
				
			||||||
	// Title for the documentation site, default to: API documentation
 | 
						// Title for the documentation site, default to: API documentation
 | 
				
			||||||
	Title string
 | 
						Title string
 | 
				
			||||||
| 
						 | 
					@ -74,13 +74,15 @@ func Redoc(opts RedocOpts, next http.Handler) http.Handler {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	redocLatest   = "https://rebilly.github.io/ReDoc/releases/latest/redoc.min.js"
 | 
						redocLatest   = "https://cdn.jsdelivr.net/npm/redoc/bundles/redoc.standalone.js"
 | 
				
			||||||
	redocTemplate = `<!DOCTYPE html>
 | 
						redocTemplate = `<!DOCTYPE html>
 | 
				
			||||||
<html>
 | 
					<html>
 | 
				
			||||||
  <head>
 | 
					  <head>
 | 
				
			||||||
    <title>{{ .Title }}</title>
 | 
					    <title>{{ .Title }}</title>
 | 
				
			||||||
    <!-- needed for adaptive design -->
 | 
							<!-- needed for adaptive design -->
 | 
				
			||||||
    <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
							<meta charset="utf-8"/>
 | 
				
			||||||
 | 
							<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
				
			||||||
 | 
							<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <!--
 | 
					    <!--
 | 
				
			||||||
    ReDoc doesn't change outer page styles
 | 
					    ReDoc doesn't change outer page styles
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,26 +19,27 @@ import (
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-openapi/errors"
 | 
						"github.com/go-openapi/errors"
 | 
				
			||||||
	"github.com/go-openapi/runtime"
 | 
					 | 
				
			||||||
	"github.com/go-openapi/spec"
 | 
						"github.com/go-openapi/spec"
 | 
				
			||||||
	"github.com/go-openapi/strfmt"
 | 
						"github.com/go-openapi/strfmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-openapi/runtime"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RequestBinder binds and validates the data from a http request
 | 
					// UntypedRequestBinder binds and validates the data from a http request
 | 
				
			||||||
type untypedRequestBinder struct {
 | 
					type UntypedRequestBinder struct {
 | 
				
			||||||
	Spec         *spec.Swagger
 | 
						Spec         *spec.Swagger
 | 
				
			||||||
	Parameters   map[string]spec.Parameter
 | 
						Parameters   map[string]spec.Parameter
 | 
				
			||||||
	Formats      strfmt.Registry
 | 
						Formats      strfmt.Registry
 | 
				
			||||||
	paramBinders map[string]*untypedParamBinder
 | 
						paramBinders map[string]*untypedParamBinder
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewRequestBinder creates a new binder for reading a request.
 | 
					// NewUntypedRequestBinder creates a new binder for reading a request.
 | 
				
			||||||
func newUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Swagger, formats strfmt.Registry) *untypedRequestBinder {
 | 
					func NewUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Swagger, formats strfmt.Registry) *UntypedRequestBinder {
 | 
				
			||||||
	binders := make(map[string]*untypedParamBinder)
 | 
						binders := make(map[string]*untypedParamBinder)
 | 
				
			||||||
	for fieldName, param := range parameters {
 | 
						for fieldName, param := range parameters {
 | 
				
			||||||
		binders[fieldName] = newUntypedParamBinder(param, spec, formats)
 | 
							binders[fieldName] = newUntypedParamBinder(param, spec, formats)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return &untypedRequestBinder{
 | 
						return &UntypedRequestBinder{
 | 
				
			||||||
		Parameters:   parameters,
 | 
							Parameters:   parameters,
 | 
				
			||||||
		paramBinders: binders,
 | 
							paramBinders: binders,
 | 
				
			||||||
		Spec:         spec,
 | 
							Spec:         spec,
 | 
				
			||||||
| 
						 | 
					@ -47,7 +48,7 @@ func newUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Sw
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Bind perform the databinding and validation
 | 
					// Bind perform the databinding and validation
 | 
				
			||||||
func (o *untypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data interface{}) error {
 | 
					func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data interface{}) error {
 | 
				
			||||||
	val := reflect.Indirect(reflect.ValueOf(data))
 | 
						val := reflect.Indirect(reflect.ValueOf(data))
 | 
				
			||||||
	isMap := val.Kind() == reflect.Map
 | 
						isMap := val.Kind() == reflect.Map
 | 
				
			||||||
	var result []error
 | 
						var result []error
 | 
				
			||||||
| 
						 | 
					@ -71,7 +72,6 @@ func (o *untypedRequestBinder) Bind(request *http.Request, routeParams RoutePara
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			target = reflect.Indirect(reflect.New(tpe))
 | 
								target = reflect.Indirect(reflect.New(tpe))
 | 
				
			||||||
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if !target.IsValid() {
 | 
							if !target.IsValid() {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,10 +26,11 @@ import (
 | 
				
			||||||
	"github.com/go-openapi/analysis"
 | 
						"github.com/go-openapi/analysis"
 | 
				
			||||||
	"github.com/go-openapi/errors"
 | 
						"github.com/go-openapi/errors"
 | 
				
			||||||
	"github.com/go-openapi/loads"
 | 
						"github.com/go-openapi/loads"
 | 
				
			||||||
	"github.com/go-openapi/runtime"
 | 
					 | 
				
			||||||
	"github.com/go-openapi/runtime/middleware/denco"
 | 
					 | 
				
			||||||
	"github.com/go-openapi/spec"
 | 
						"github.com/go-openapi/spec"
 | 
				
			||||||
	"github.com/go-openapi/strfmt"
 | 
						"github.com/go-openapi/strfmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-openapi/runtime"
 | 
				
			||||||
 | 
						"github.com/go-openapi/runtime/middleware/denco"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RouteParam is a object to capture route params in a framework agnostic way.
 | 
					// RouteParam is a object to capture route params in a framework agnostic way.
 | 
				
			||||||
| 
						 | 
					@ -290,7 +291,7 @@ type routeEntry struct {
 | 
				
			||||||
	Parameters     map[string]spec.Parameter
 | 
						Parameters     map[string]spec.Parameter
 | 
				
			||||||
	Handler        http.Handler
 | 
						Handler        http.Handler
 | 
				
			||||||
	Formats        strfmt.Registry
 | 
						Formats        strfmt.Registry
 | 
				
			||||||
	Binder         *untypedRequestBinder
 | 
						Binder         *UntypedRequestBinder
 | 
				
			||||||
	Authenticators RouteAuthenticators
 | 
						Authenticators RouteAuthenticators
 | 
				
			||||||
	Authorizer     runtime.Authorizer
 | 
						Authorizer     runtime.Authorizer
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -428,7 +429,7 @@ func (d *defaultRouteBuilder) AddRoute(method, path string, operation *spec.Oper
 | 
				
			||||||
			Producers:      d.api.ProducersFor(normalizeOffers(produces)),
 | 
								Producers:      d.api.ProducersFor(normalizeOffers(produces)),
 | 
				
			||||||
			Parameters:     parameters,
 | 
								Parameters:     parameters,
 | 
				
			||||||
			Formats:        d.api.Formats(),
 | 
								Formats:        d.api.Formats(),
 | 
				
			||||||
			Binder:         newUntypedRequestBinder(parameters, d.spec.Spec(), d.api.Formats()),
 | 
								Binder:         NewUntypedRequestBinder(parameters, d.spec.Spec(), d.api.Formats()),
 | 
				
			||||||
			Authenticators: d.buildAuthenticators(operation),
 | 
								Authenticators: d.buildAuthenticators(operation),
 | 
				
			||||||
			Authorizer:     d.api.Authorizer(),
 | 
								Authorizer:     d.api.Authorizer(),
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,162 @@
 | 
				
			||||||
 | 
					package middleware
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"html/template"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"path"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SwaggerUIOpts configures the Swaggerui middlewares
 | 
				
			||||||
 | 
					type SwaggerUIOpts struct {
 | 
				
			||||||
 | 
						// BasePath for the UI path, defaults to: /
 | 
				
			||||||
 | 
						BasePath string
 | 
				
			||||||
 | 
						// Path combines with BasePath for the full UI path, defaults to: docs
 | 
				
			||||||
 | 
						Path string
 | 
				
			||||||
 | 
						// SpecURL the url to find the spec for
 | 
				
			||||||
 | 
						SpecURL string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// The three components needed to embed swagger-ui
 | 
				
			||||||
 | 
						SwaggerURL       string
 | 
				
			||||||
 | 
						SwaggerPresetURL string
 | 
				
			||||||
 | 
						SwaggerStylesURL string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Favicon32 string
 | 
				
			||||||
 | 
						Favicon16 string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Title for the documentation site, default to: API documentation
 | 
				
			||||||
 | 
						Title string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// EnsureDefaults in case some options are missing
 | 
				
			||||||
 | 
					func (r *SwaggerUIOpts) EnsureDefaults() {
 | 
				
			||||||
 | 
						if r.BasePath == "" {
 | 
				
			||||||
 | 
							r.BasePath = "/"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if r.Path == "" {
 | 
				
			||||||
 | 
							r.Path = "docs"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if r.SpecURL == "" {
 | 
				
			||||||
 | 
							r.SpecURL = "/swagger.json"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if r.SwaggerURL == "" {
 | 
				
			||||||
 | 
							r.SwaggerURL = swaggerLatest
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if r.SwaggerPresetURL == "" {
 | 
				
			||||||
 | 
							r.SwaggerPresetURL = swaggerPresetLatest
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if r.SwaggerStylesURL == "" {
 | 
				
			||||||
 | 
							r.SwaggerStylesURL = swaggerStylesLatest
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if r.Favicon16 == "" {
 | 
				
			||||||
 | 
							r.Favicon16 = swaggerFavicon16Latest
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if r.Favicon32 == "" {
 | 
				
			||||||
 | 
							r.Favicon32 = swaggerFavicon32Latest
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if r.Title == "" {
 | 
				
			||||||
 | 
							r.Title = "API documentation"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SwaggerUI creates a middleware to serve a documentation site for a swagger spec.
 | 
				
			||||||
 | 
					// This allows for altering the spec before starting the http listener.
 | 
				
			||||||
 | 
					func SwaggerUI(opts SwaggerUIOpts, next http.Handler) http.Handler {
 | 
				
			||||||
 | 
						opts.EnsureDefaults()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pth := path.Join(opts.BasePath, opts.Path)
 | 
				
			||||||
 | 
						tmpl := template.Must(template.New("swaggerui").Parse(swaggeruiTemplate))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						buf := bytes.NewBuffer(nil)
 | 
				
			||||||
 | 
						_ = tmpl.Execute(buf, &opts)
 | 
				
			||||||
 | 
						b := buf.Bytes()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
 | 
							if r.URL.Path == pth {
 | 
				
			||||||
 | 
								rw.Header().Set("Content-Type", "text/html; charset=utf-8")
 | 
				
			||||||
 | 
								rw.WriteHeader(http.StatusOK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								_, _ = rw.Write(b)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if next == nil {
 | 
				
			||||||
 | 
								rw.Header().Set("Content-Type", "text/plain")
 | 
				
			||||||
 | 
								rw.WriteHeader(http.StatusNotFound)
 | 
				
			||||||
 | 
								_, _ = rw.Write([]byte(fmt.Sprintf("%q not found", pth)))
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							next.ServeHTTP(rw, r)
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						swaggerLatest          = "https://unpkg.com/swagger-ui-dist/swagger-ui-bundle.js"
 | 
				
			||||||
 | 
						swaggerPresetLatest    = "https://unpkg.com/swagger-ui-dist/swagger-ui-standalone-preset.js"
 | 
				
			||||||
 | 
						swaggerStylesLatest    = "https://unpkg.com/swagger-ui-dist/swagger-ui.css"
 | 
				
			||||||
 | 
						swaggerFavicon32Latest = "https://unpkg.com/swagger-ui-dist/favicon-32x32.png"
 | 
				
			||||||
 | 
						swaggerFavicon16Latest = "https://unpkg.com/swagger-ui-dist/favicon-16x16.png"
 | 
				
			||||||
 | 
						swaggeruiTemplate      = `
 | 
				
			||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html lang="en">
 | 
				
			||||||
 | 
					  <head>
 | 
				
			||||||
 | 
					    <meta charset="UTF-8">
 | 
				
			||||||
 | 
							<title>{{ .Title }}</title>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <link rel="stylesheet" type="text/css" href="{{ .SwaggerStylesURL }}" >
 | 
				
			||||||
 | 
					    <link rel="icon" type="image/png" href="{{ .Favicon32 }}" sizes="32x32" />
 | 
				
			||||||
 | 
					    <link rel="icon" type="image/png" href="{{ .Favicon16 }}" sizes="16x16" />
 | 
				
			||||||
 | 
					    <style>
 | 
				
			||||||
 | 
					      html
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        box-sizing: border-box;
 | 
				
			||||||
 | 
					        overflow: -moz-scrollbars-vertical;
 | 
				
			||||||
 | 
					        overflow-y: scroll;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      *,
 | 
				
			||||||
 | 
					      *:before,
 | 
				
			||||||
 | 
					      *:after
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        box-sizing: inherit;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      body
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        margin:0;
 | 
				
			||||||
 | 
					        background: #fafafa;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					  </head>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <body>
 | 
				
			||||||
 | 
					    <div id="swagger-ui"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <script src="{{ .SwaggerURL }}"> </script>
 | 
				
			||||||
 | 
					    <script src="{{ .SwaggerPresetURL }}"> </script>
 | 
				
			||||||
 | 
					    <script>
 | 
				
			||||||
 | 
					    window.onload = function() {
 | 
				
			||||||
 | 
					      // Begin Swagger UI call region
 | 
				
			||||||
 | 
					      const ui = SwaggerUIBundle({
 | 
				
			||||||
 | 
					        url: '{{ .SpecURL }}',
 | 
				
			||||||
 | 
					        dom_id: '#swagger-ui',
 | 
				
			||||||
 | 
					        deepLinking: true,
 | 
				
			||||||
 | 
					        presets: [
 | 
				
			||||||
 | 
					          SwaggerUIBundle.presets.apis,
 | 
				
			||||||
 | 
					          SwaggerUIStandalonePreset
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        plugins: [
 | 
				
			||||||
 | 
					          SwaggerUIBundle.plugins.DownloadUrl
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        layout: "StandaloneLayout"
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      // End Swagger UI call region
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      window.ui = ui
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  </script>
 | 
				
			||||||
 | 
					  </body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -23,9 +23,10 @@ import (
 | 
				
			||||||
	"github.com/go-openapi/analysis"
 | 
						"github.com/go-openapi/analysis"
 | 
				
			||||||
	"github.com/go-openapi/errors"
 | 
						"github.com/go-openapi/errors"
 | 
				
			||||||
	"github.com/go-openapi/loads"
 | 
						"github.com/go-openapi/loads"
 | 
				
			||||||
	"github.com/go-openapi/runtime"
 | 
					 | 
				
			||||||
	"github.com/go-openapi/spec"
 | 
						"github.com/go-openapi/spec"
 | 
				
			||||||
	"github.com/go-openapi/strfmt"
 | 
						"github.com/go-openapi/strfmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-openapi/runtime"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewAPI creates the default untyped API
 | 
					// NewAPI creates the default untyped API
 | 
				
			||||||
| 
						 | 
					@ -244,7 +245,6 @@ func (d *API) validate() error {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (d *API) verify(name string, registrations []string, expectations []string) error {
 | 
					func (d *API) verify(name string, registrations []string, expectations []string) error {
 | 
				
			||||||
 | 
					 | 
				
			||||||
	sort.Strings(registrations)
 | 
						sort.Strings(registrations)
 | 
				
			||||||
	sort.Strings(expectations)
 | 
						sort.Strings(expectations)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,8 +20,9 @@ import (
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-openapi/errors"
 | 
						"github.com/go-openapi/errors"
 | 
				
			||||||
	"github.com/go-openapi/runtime"
 | 
					 | 
				
			||||||
	"github.com/go-openapi/swag"
 | 
						"github.com/go-openapi/swag"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-openapi/runtime"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type validation struct {
 | 
					type validation struct {
 | 
				
			||||||
| 
						 | 
					@ -115,7 +116,10 @@ func (v *validation) contentType() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (v *validation) responseFormat() {
 | 
					func (v *validation) responseFormat() {
 | 
				
			||||||
	if str, rCtx := v.context.ResponseFormat(v.request, v.route.Produces); str == "" && runtime.HasBody(v.request) {
 | 
						// if the route provides values for Produces and no format could be identify then return an error.
 | 
				
			||||||
 | 
						// if the route does not specify values for Produces then treat request as valid since the API designer
 | 
				
			||||||
 | 
						// choose not to specify the format for responses.
 | 
				
			||||||
 | 
						if str, rCtx := v.context.ResponseFormat(v.request, v.route.Produces); str == "" && len(v.route.Produces) > 0 {
 | 
				
			||||||
		v.request = rCtx
 | 
							v.request = rCtx
 | 
				
			||||||
		v.result = append(v.result, errors.InvalidResponseFormat(v.request.Header.Get(runtime.HeaderAccept), v.route.Produces))
 | 
							v.result = append(v.result, errors.InvalidResponseFormat(v.request.Header.Get(runtime.HeaderAccept), v.route.Produces))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@ import (
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-openapi/errors"
 | 
						"github.com/go-openapi/errors"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-openapi/runtime"
 | 
						"github.com/go-openapi/runtime"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,3 +21,8 @@ linters:
 | 
				
			||||||
    - lll
 | 
					    - lll
 | 
				
			||||||
    - gochecknoinits
 | 
					    - gochecknoinits
 | 
				
			||||||
    - gochecknoglobals
 | 
					    - gochecknoglobals
 | 
				
			||||||
 | 
					    - funlen
 | 
				
			||||||
 | 
					    - godox
 | 
				
			||||||
 | 
					    - gocognit
 | 
				
			||||||
 | 
					    - whitespace
 | 
				
			||||||
 | 
					    - wsl
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,10 @@
 | 
				
			||||||
after_success:
 | 
					after_success:
 | 
				
			||||||
- bash <(curl -s https://codecov.io/bash)
 | 
					- bash <(curl -s https://codecov.io/bash)
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
- 1.11.x
 | 
					- 1.13.x
 | 
				
			||||||
- 1.12.x
 | 
					- 1.14.x
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
					- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
				
			||||||
env:
 | 
					 | 
				
			||||||
- GO111MODULE=on
 | 
					 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  slack:
 | 
					  slack:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
						 | 
					@ -14,11 +14,41 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package spec
 | 
					package spec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-openapi/swag"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ContactInfo contact information for the exposed API.
 | 
					// ContactInfo contact information for the exposed API.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// For more information: http://goo.gl/8us55a#contactObject
 | 
					// For more information: http://goo.gl/8us55a#contactObject
 | 
				
			||||||
type ContactInfo struct {
 | 
					type ContactInfo struct {
 | 
				
			||||||
 | 
						ContactInfoProps
 | 
				
			||||||
 | 
						VendorExtensible
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ContactInfoProps struct {
 | 
				
			||||||
	Name  string `json:"name,omitempty"`
 | 
						Name  string `json:"name,omitempty"`
 | 
				
			||||||
	URL   string `json:"url,omitempty"`
 | 
						URL   string `json:"url,omitempty"`
 | 
				
			||||||
	Email string `json:"email,omitempty"`
 | 
						Email string `json:"email,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *ContactInfo) UnmarshalJSON(data []byte) error {
 | 
				
			||||||
 | 
						if err := json.Unmarshal(data, &c.ContactInfoProps); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return json.Unmarshal(data, &c.VendorExtensible)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c ContactInfo) MarshalJSON() ([]byte, error) {
 | 
				
			||||||
 | 
						b1, err := json.Marshal(c.ContactInfoProps)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b2, err := json.Marshal(c.VendorExtensible)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return swag.ConcatJSON(b1, b2), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -200,11 +200,11 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const rootBase = "root"
 | 
				
			||||||
// baseForRoot loads in the cache the root document and produces a fake "root" base path entry
 | 
					// baseForRoot loads in the cache the root document and produces a fake "root" base path entry
 | 
				
			||||||
// for further $ref resolution
 | 
					// for further $ref resolution
 | 
				
			||||||
func baseForRoot(root interface{}, cache ResolutionCache) string {
 | 
					func baseForRoot(root interface{}, cache ResolutionCache) string {
 | 
				
			||||||
	// cache the root document to resolve $ref's
 | 
						// cache the root document to resolve $ref's
 | 
				
			||||||
	const rootBase = "root"
 | 
					 | 
				
			||||||
	if root != nil {
 | 
						if root != nil {
 | 
				
			||||||
		base, _ := absPath(rootBase)
 | 
							base, _ := absPath(rootBase)
 | 
				
			||||||
		normalizedBase := normalizeAbsPath(base)
 | 
							normalizedBase := normalizeAbsPath(base)
 | 
				
			||||||
| 
						 | 
					@ -452,11 +452,12 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string)
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if pathItem.Ref.String() != "" {
 | 
						if pathItem.Ref.String() != "" {
 | 
				
			||||||
		var err error
 | 
							transitiveResolver, err := resolver.transitiveResolver(basePath, pathItem.Ref)
 | 
				
			||||||
		resolver, err = resolver.transitiveResolver(basePath, pathItem.Ref)
 | 
							if transitiveResolver.shouldStopOnError(err) {
 | 
				
			||||||
		if resolver.shouldStopOnError(err) {
 | 
					 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							basePath = transitiveResolver.updateBasePath(resolver, basePath)
 | 
				
			||||||
 | 
							resolver = transitiveResolver
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	pathItem.Ref = Ref{}
 | 
						pathItem.Ref = Ref{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,14 +4,9 @@ require (
 | 
				
			||||||
	github.com/go-openapi/jsonpointer v0.19.3
 | 
						github.com/go-openapi/jsonpointer v0.19.3
 | 
				
			||||||
	github.com/go-openapi/jsonreference v0.19.2
 | 
						github.com/go-openapi/jsonreference v0.19.2
 | 
				
			||||||
	github.com/go-openapi/swag v0.19.5
 | 
						github.com/go-openapi/swag v0.19.5
 | 
				
			||||||
	github.com/kr/pty v1.1.5 // indirect
 | 
					 | 
				
			||||||
	github.com/stretchr/objx v0.2.0 // indirect
 | 
					 | 
				
			||||||
	github.com/stretchr/testify v1.3.0
 | 
						github.com/stretchr/testify v1.3.0
 | 
				
			||||||
	golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect
 | 
					 | 
				
			||||||
	golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect
 | 
						golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect
 | 
				
			||||||
	golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect
 | 
						gopkg.in/yaml.v2 v2.2.4
 | 
				
			||||||
	golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59 // indirect
 | 
					 | 
				
			||||||
	gopkg.in/yaml.v2 v2.2.2
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.13
 | 
					go 1.13
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,3 @@
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.0 h1:rmGxhojJlM0tuKtfdvliR84CFHljx9ag64t2xmVkjK4=
 | 
					 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
					 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
					github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
					github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
				
			||||||
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 | 
					github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
 | 
				
			||||||
| 
						 | 
					@ -7,20 +5,12 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko
 | 
				
			||||||
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/go-openapi/jsonpointer v0.17.0 h1:nH6xp8XdXHx8dqveo0ZuJBluCO2qGrPbDNZ0dwoRHP0=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.0 h1:FTUMcX77w5rQkClIzDtTxvn6Bsa894CcrzNj2MMfeg8=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
					github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 | 
					github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
 | 
					github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 | 
					github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.0 h1:BqWKpV1dFd+AuiKlgtddwVIFQsuMpxfBDBHGfM2yNpk=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
 | 
					github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
					github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
				
			||||||
github.com/go-openapi/swag v0.17.0 h1:iqrgMg7Q7SvtbWLlltPrkMs0UBJI6oTSs79JFRUi880=
 | 
					 | 
				
			||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					 | 
				
			||||||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
					github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
					github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
				
			||||||
| 
						 | 
					@ -28,11 +18,8 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh
 | 
				
			||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
					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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
				
			||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
					github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
				
			||||||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 | 
					 | 
				
			||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 | 
					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.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329 h1:2gxZ0XQIU/5z3Z3bUBu+FXuk2pFbkN6tcwi/pjyaDic=
 | 
					 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4=
 | 
					github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 | 
				
			||||||
| 
						 | 
					@ -40,35 +27,23 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN
 | 
				
			||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
					github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58 h1:otZG8yDCO4LVps5+9bxOeNiCvgmOyt96J3roHTYs7oE=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/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-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
 | 
					golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/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-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-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					 | 
				
			||||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 | 
					golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
 | 
				
			||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
					golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
					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/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
				
			||||||
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-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					 | 
				
			||||||
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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
					gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2/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 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,10 +14,40 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package spec
 | 
					package spec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/go-openapi/swag"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// License information for the exposed API.
 | 
					// License information for the exposed API.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// For more information: http://goo.gl/8us55a#licenseObject
 | 
					// For more information: http://goo.gl/8us55a#licenseObject
 | 
				
			||||||
type License struct {
 | 
					type License struct {
 | 
				
			||||||
 | 
						LicenseProps
 | 
				
			||||||
 | 
						VendorExtensible
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type LicenseProps struct {
 | 
				
			||||||
	Name string `json:"name,omitempty"`
 | 
						Name string `json:"name,omitempty"`
 | 
				
			||||||
	URL  string `json:"url,omitempty"`
 | 
						URL  string `json:"url,omitempty"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (l *License) UnmarshalJSON(data []byte) error {
 | 
				
			||||||
 | 
						if err := json.Unmarshal(data, &l.LicenseProps); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return json.Unmarshal(data, &l.VendorExtensible)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (l License) MarshalJSON() ([]byte, error) {
 | 
				
			||||||
 | 
						b1, err := json.Marshal(l.LicenseProps)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b2, err := json.Marshal(l.VendorExtensible)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return swag.ConcatJSON(b1, b2), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,10 +68,12 @@ func (r *Ref) IsValidURI(basepaths ...string) bool {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if r.HasFullURL {
 | 
						if r.HasFullURL {
 | 
				
			||||||
 | 
							//#nosec
 | 
				
			||||||
		rr, err := http.Get(v)
 | 
							rr, err := http.Get(v)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return false
 | 
								return false
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							defer rr.Body.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return rr.StatusCode/100 == 2
 | 
							return rr.StatusCode/100 == 2
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,12 +86,7 @@ func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) (*schemaLoad
 | 
				
			||||||
	newOptions := r.options
 | 
						newOptions := r.options
 | 
				
			||||||
	newOptions.RelativeBase = rootURL.String()
 | 
						newOptions.RelativeBase = rootURL.String()
 | 
				
			||||||
	debugLog("setting new root: %s", newOptions.RelativeBase)
 | 
						debugLog("setting new root: %s", newOptions.RelativeBase)
 | 
				
			||||||
	resolver, err := defaultSchemaLoader(root, newOptions, r.cache, r.context)
 | 
						return defaultSchemaLoader(root, newOptions, r.cache, r.context)
 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return resolver, nil
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string {
 | 
					func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string {
 | 
				
			||||||
| 
						 | 
					@ -154,7 +149,15 @@ func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error)
 | 
				
			||||||
	toFetch := *refURL
 | 
						toFetch := *refURL
 | 
				
			||||||
	toFetch.Fragment = ""
 | 
						toFetch.Fragment = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	normalized := normalizeAbsPath(toFetch.String())
 | 
						var err error
 | 
				
			||||||
 | 
						path := toFetch.String()
 | 
				
			||||||
 | 
						if path == rootBase {
 | 
				
			||||||
 | 
							path, err = absPath(rootBase)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, url.URL{}, false, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						normalized := normalizeAbsPath(path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	data, fromCache := r.cache.Get(normalized)
 | 
						data, fromCache := r.cache.Get(normalized)
 | 
				
			||||||
	if !fromCache {
 | 
						if !fromCache {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,11 @@ linters:
 | 
				
			||||||
    - lll
 | 
					    - lll
 | 
				
			||||||
    - gochecknoinits
 | 
					    - gochecknoinits
 | 
				
			||||||
    - gochecknoglobals
 | 
					    - gochecknoglobals
 | 
				
			||||||
 | 
					    - godox
 | 
				
			||||||
 | 
					    - gocognit
 | 
				
			||||||
 | 
					    - whitespace
 | 
				
			||||||
 | 
					    - wsl
 | 
				
			||||||
 | 
					    - funlen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
issues:
 | 
					issues:
 | 
				
			||||||
  exclude-rules:
 | 
					  exclude-rules:
 | 
				
			||||||
| 
						 | 
					@ -27,4 +32,5 @@ issues:
 | 
				
			||||||
      text: "should be .*ObjectID"
 | 
					      text: "should be .*ObjectID"
 | 
				
			||||||
      linters:
 | 
					      linters:
 | 
				
			||||||
        - golint
 | 
					        - golint
 | 
				
			||||||
 | 
					        - stylecheck
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -43,6 +43,19 @@ It also provides convenient extensions to go-openapi users.
 | 
				
			||||||
> It does not provide validation for numerical values with swagger format extension for JSON types "number" or
 | 
					> It does not provide validation for numerical values with swagger format extension for JSON types "number" or
 | 
				
			||||||
> "integer" (e.g. float, double, int32...).
 | 
					> "integer" (e.g. float, double, int32...).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Type conversion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					All types defined here are stringers and may be converted to strings with `.String()`.
 | 
				
			||||||
 | 
					Note that most types defined by this package may be converted directly to string like `string(Email{})`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`Date` and `DateTime` may be converted directly to `time.Time` like `time.Time(Time{})`.
 | 
				
			||||||
 | 
					Similarly, you can convert `Duration` to `time.Duration` as in `time.Duration(Duration{})`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Using pointers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The `conv` subpackage provides helpers to convert the types to and from pointers, just like `go-openapi/swag` does
 | 
				
			||||||
 | 
					with primitive types.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Format types
 | 
					## Format types
 | 
				
			||||||
Types defined in strfmt expose marshaling and validation capabilities.
 | 
					Types defined in strfmt expose marshaling and validation capabilities.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,3 +151,32 @@ func (d *Date) DeepCopy() *Date {
 | 
				
			||||||
	d.DeepCopyInto(out)
 | 
						d.DeepCopyInto(out)
 | 
				
			||||||
	return out
 | 
						return out
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GobEncode implements the gob.GobEncoder interface.
 | 
				
			||||||
 | 
					func (d Date) GobEncode() ([]byte, error) {
 | 
				
			||||||
 | 
						return d.MarshalBinary()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GobDecode implements the gob.GobDecoder interface.
 | 
				
			||||||
 | 
					func (d *Date) GobDecode(data []byte) error {
 | 
				
			||||||
 | 
						return d.UnmarshalBinary(data)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MarshalBinary implements the encoding.BinaryMarshaler interface.
 | 
				
			||||||
 | 
					func (d Date) MarshalBinary() ([]byte, error) {
 | 
				
			||||||
 | 
						return time.Time(d).MarshalBinary()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface.
 | 
				
			||||||
 | 
					func (d *Date) UnmarshalBinary(data []byte) error {
 | 
				
			||||||
 | 
						var original time.Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := original.UnmarshalBinary(data)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*d = Date(original)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,3 +11,5 @@ require (
 | 
				
			||||||
	github.com/tidwall/pretty v1.0.0 // indirect
 | 
						github.com/tidwall/pretty v1.0.0 // indirect
 | 
				
			||||||
	go.mongodb.org/mongo-driver v1.0.3
 | 
						go.mongodb.org/mongo-driver v1.0.3
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.13
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
// you may not use this file except in compliance with the License.
 | 
					// you may not use this file except in compliance with the License.
 | 
				
			||||||
// You may obtain a copy of the License at
 | 
					// You may obtain a copy of the License at
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
//    http://www.apache.org/licenses/LICENSE-2.0
 | 
					//	http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Unless required by applicable law or agreed to in writing, software
 | 
					// Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
					// distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
| 
						 | 
					@ -16,14 +16,16 @@ package strfmt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"database/sql/driver"
 | 
						"database/sql/driver"
 | 
				
			||||||
 | 
						"encoding/binary"
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"go.mongodb.org/mongo-driver/bson"
 | 
						"go.mongodb.org/mongo-driver/bson"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"go.mongodb.org/mongo-driver/bson/bsontype"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
| 
						 | 
					@ -57,12 +59,16 @@ const (
 | 
				
			||||||
	RFC3339Micro = "2006-01-02T15:04:05.000000Z07:00"
 | 
						RFC3339Micro = "2006-01-02T15:04:05.000000Z07:00"
 | 
				
			||||||
	// ISO8601LocalTime represents a ISO8601 format to ISO8601 in local time (no timezone)
 | 
						// ISO8601LocalTime represents a ISO8601 format to ISO8601 in local time (no timezone)
 | 
				
			||||||
	ISO8601LocalTime = "2006-01-02T15:04:05"
 | 
						ISO8601LocalTime = "2006-01-02T15:04:05"
 | 
				
			||||||
 | 
						// ISO8601TimeWithReducedPrecision represents a ISO8601 format with reduced precision (dropped secs)
 | 
				
			||||||
 | 
						ISO8601TimeWithReducedPrecision = "2006-01-02T15:04Z"
 | 
				
			||||||
 | 
						// ISO8601TimeWithReducedPrecision represents a ISO8601 format with reduced precision and no timezone (dropped seconds + no timezone)
 | 
				
			||||||
 | 
						ISO8601TimeWithReducedPrecisionLocaltime = "2006-01-02T15:04"
 | 
				
			||||||
	// DateTimePattern pattern to match for the date-time format from http://tools.ietf.org/html/rfc3339#section-5.6
 | 
						// DateTimePattern pattern to match for the date-time format from http://tools.ietf.org/html/rfc3339#section-5.6
 | 
				
			||||||
	DateTimePattern = `^([0-9]{2}):([0-9]{2}):([0-9]{2})(.[0-9]+)?(z|([+-][0-9]{2}:[0-9]{2}))$`
 | 
						DateTimePattern = `^([0-9]{2}):([0-9]{2}):([0-9]{2})(.[0-9]+)?(z|([+-][0-9]{2}:[0-9]{2}))$`
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	dateTimeFormats = []string{RFC3339Micro, RFC3339Millis, time.RFC3339, time.RFC3339Nano, ISO8601LocalTime}
 | 
						dateTimeFormats = []string{RFC3339Micro, RFC3339Millis, time.RFC3339, time.RFC3339Nano, ISO8601LocalTime, ISO8601TimeWithReducedPrecision, ISO8601TimeWithReducedPrecisionLocaltime}
 | 
				
			||||||
	rxDateTime      = regexp.MustCompile(DateTimePattern)
 | 
						rxDateTime      = regexp.MustCompile(DateTimePattern)
 | 
				
			||||||
	// MarshalFormat sets the time resolution format used for marshaling time (set to milliseconds)
 | 
						// MarshalFormat sets the time resolution format used for marshaling time (set to milliseconds)
 | 
				
			||||||
	MarshalFormat = RFC3339Millis
 | 
						MarshalFormat = RFC3339Millis
 | 
				
			||||||
| 
						 | 
					@ -165,26 +171,51 @@ func (t *DateTime) UnmarshalJSON(data []byte) error {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MarshalBSON renders the DateTime as a BSON document
 | 
				
			||||||
func (t DateTime) MarshalBSON() ([]byte, error) {
 | 
					func (t DateTime) MarshalBSON() ([]byte, error) {
 | 
				
			||||||
	return bson.Marshal(bson.M{"data": t.String()})
 | 
						return bson.Marshal(bson.M{"data": t})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnmarshalBSON reads the DateTime from a BSON document
 | 
				
			||||||
func (t *DateTime) UnmarshalBSON(data []byte) error {
 | 
					func (t *DateTime) UnmarshalBSON(data []byte) error {
 | 
				
			||||||
	var m bson.M
 | 
						var obj struct {
 | 
				
			||||||
	if err := bson.Unmarshal(data, &m); err != nil {
 | 
							Data DateTime
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if err := bson.Unmarshal(data, &obj); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if data, ok := m["data"].(string); ok {
 | 
						*t = obj.Data
 | 
				
			||||||
		rd, err := ParseDateTime(data)
 | 
					 | 
				
			||||||
		if err != nil {
 | 
					 | 
				
			||||||
			return err
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		*t = rd
 | 
					 | 
				
			||||||
		return nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return errors.New("couldn't unmarshal bson bytes value as Date")
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MarshalBSONValue is an interface implemented by types that can marshal themselves
 | 
				
			||||||
 | 
					// into a BSON document represented as bytes. The bytes returned must be a valid
 | 
				
			||||||
 | 
					// BSON document if the error is nil.
 | 
				
			||||||
 | 
					// Marshals a DateTime as a bsontype.DateTime, an int64 representing
 | 
				
			||||||
 | 
					// milliseconds since epoch.
 | 
				
			||||||
 | 
					func (t DateTime) MarshalBSONValue() (bsontype.Type, []byte, error) {
 | 
				
			||||||
 | 
						// UnixNano cannot be used, the result of calling UnixNano on the zero
 | 
				
			||||||
 | 
						// Time is undefined.
 | 
				
			||||||
 | 
						i64 := time.Time(t).Unix() * 1000
 | 
				
			||||||
 | 
						buf := make([]byte, 8)
 | 
				
			||||||
 | 
						binary.LittleEndian.PutUint64(buf, uint64(i64))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return bsontype.DateTime, buf, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnmarshalBSONValue is an interface implemented by types that can unmarshal a
 | 
				
			||||||
 | 
					// BSON value representation of themselves. The BSON bytes and type can be
 | 
				
			||||||
 | 
					// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it
 | 
				
			||||||
 | 
					// wishes to retain the data after returning.
 | 
				
			||||||
 | 
					func (t *DateTime) UnmarshalBSONValue(tpe bsontype.Type, data []byte) error {
 | 
				
			||||||
 | 
						i64 := int64(binary.LittleEndian.Uint64(data))
 | 
				
			||||||
 | 
						// TODO: Use bsonprim.DateTime.Time() method
 | 
				
			||||||
 | 
						*t = DateTime(time.Unix(i64/1000, i64%1000*1000000))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DeepCopyInto copies the receiver and writes its value into out.
 | 
					// DeepCopyInto copies the receiver and writes its value into out.
 | 
				
			||||||
| 
						 | 
					@ -201,3 +232,32 @@ func (t *DateTime) DeepCopy() *DateTime {
 | 
				
			||||||
	t.DeepCopyInto(out)
 | 
						t.DeepCopyInto(out)
 | 
				
			||||||
	return out
 | 
						return out
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GobEncode implements the gob.GobEncoder interface.
 | 
				
			||||||
 | 
					func (t DateTime) GobEncode() ([]byte, error) {
 | 
				
			||||||
 | 
						return t.MarshalBinary()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GobDecode implements the gob.GobDecoder interface.
 | 
				
			||||||
 | 
					func (t *DateTime) GobDecode(data []byte) error {
 | 
				
			||||||
 | 
						return t.UnmarshalBinary(data)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MarshalBinary implements the encoding.BinaryMarshaler interface.
 | 
				
			||||||
 | 
					func (t DateTime) MarshalBinary() ([]byte, error) {
 | 
				
			||||||
 | 
						return time.Time(t).MarshalBinary()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface.
 | 
				
			||||||
 | 
					func (t *DateTime) UnmarshalBinary(data []byte) error {
 | 
				
			||||||
 | 
						var original time.Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := original.UnmarshalBinary(data)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*t = DateTime(original)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,10 @@
 | 
				
			||||||
after_success:
 | 
					after_success:
 | 
				
			||||||
- bash <(curl -s https://codecov.io/bash)
 | 
					- bash <(curl -s https://codecov.io/bash)
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
- 1.11.x
 | 
					- 1.13.x
 | 
				
			||||||
- 1.12.x
 | 
					- 1.14.x
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
					- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
				
			||||||
env:
 | 
					 | 
				
			||||||
- GO111MODULE=on
 | 
					 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  slack:
 | 
					  slack:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,7 +88,7 @@ func ConvertFloat64(str string) (float64, error) {
 | 
				
			||||||
	return strconv.ParseFloat(str, 64)
 | 
						return strconv.ParseFloat(str, 64)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ConvertInt8 turn a string into int8 boolean
 | 
					// ConvertInt8 turn a string into an int8
 | 
				
			||||||
func ConvertInt8(str string) (int8, error) {
 | 
					func ConvertInt8(str string) (int8, error) {
 | 
				
			||||||
	i, err := strconv.ParseInt(str, 10, 8)
 | 
						i, err := strconv.ParseInt(str, 10, 8)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -97,7 +97,7 @@ func ConvertInt8(str string) (int8, error) {
 | 
				
			||||||
	return int8(i), nil
 | 
						return int8(i), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ConvertInt16 turn a string into a int16
 | 
					// ConvertInt16 turn a string into an int16
 | 
				
			||||||
func ConvertInt16(str string) (int16, error) {
 | 
					func ConvertInt16(str string) (int16, error) {
 | 
				
			||||||
	i, err := strconv.ParseInt(str, 10, 16)
 | 
						i, err := strconv.ParseInt(str, 10, 16)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -106,7 +106,7 @@ func ConvertInt16(str string) (int16, error) {
 | 
				
			||||||
	return int16(i), nil
 | 
						return int16(i), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ConvertInt32 turn a string into a int32
 | 
					// ConvertInt32 turn a string into an int32
 | 
				
			||||||
func ConvertInt32(str string) (int32, error) {
 | 
					func ConvertInt32(str string) (int32, error) {
 | 
				
			||||||
	i, err := strconv.ParseInt(str, 10, 32)
 | 
						i, err := strconv.ParseInt(str, 10, 32)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -115,12 +115,12 @@ func ConvertInt32(str string) (int32, error) {
 | 
				
			||||||
	return int32(i), nil
 | 
						return int32(i), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ConvertInt64 turn a string into a int64
 | 
					// ConvertInt64 turn a string into an int64
 | 
				
			||||||
func ConvertInt64(str string) (int64, error) {
 | 
					func ConvertInt64(str string) (int64, error) {
 | 
				
			||||||
	return strconv.ParseInt(str, 10, 64)
 | 
						return strconv.ParseInt(str, 10, 64)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ConvertUint8 turn a string into a uint8
 | 
					// ConvertUint8 turn a string into an uint8
 | 
				
			||||||
func ConvertUint8(str string) (uint8, error) {
 | 
					func ConvertUint8(str string) (uint8, error) {
 | 
				
			||||||
	i, err := strconv.ParseUint(str, 10, 8)
 | 
						i, err := strconv.ParseUint(str, 10, 8)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -129,7 +129,7 @@ func ConvertUint8(str string) (uint8, error) {
 | 
				
			||||||
	return uint8(i), nil
 | 
						return uint8(i), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ConvertUint16 turn a string into a uint16
 | 
					// ConvertUint16 turn a string into an uint16
 | 
				
			||||||
func ConvertUint16(str string) (uint16, error) {
 | 
					func ConvertUint16(str string) (uint16, error) {
 | 
				
			||||||
	i, err := strconv.ParseUint(str, 10, 16)
 | 
						i, err := strconv.ParseUint(str, 10, 16)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -138,7 +138,7 @@ func ConvertUint16(str string) (uint16, error) {
 | 
				
			||||||
	return uint16(i), nil
 | 
						return uint16(i), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ConvertUint32 turn a string into a uint32
 | 
					// ConvertUint32 turn a string into an uint32
 | 
				
			||||||
func ConvertUint32(str string) (uint32, error) {
 | 
					func ConvertUint32(str string) (uint32, error) {
 | 
				
			||||||
	i, err := strconv.ParseUint(str, 10, 32)
 | 
						i, err := strconv.ParseUint(str, 10, 32)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -147,7 +147,7 @@ func ConvertUint32(str string) (uint32, error) {
 | 
				
			||||||
	return uint32(i), nil
 | 
						return uint32(i), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ConvertUint64 turn a string into a uint64
 | 
					// ConvertUint64 turn a string into an uint64
 | 
				
			||||||
func ConvertUint64(str string) (uint64, error) {
 | 
					func ConvertUint64(str string) (uint64, error) {
 | 
				
			||||||
	return strconv.ParseUint(str, 10, 64)
 | 
						return strconv.ParseUint(str, 10, 64)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -181,12 +181,12 @@ func IntValueMap(src map[string]*int) map[string]int {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Int32 returns a pointer to of the int64 value passed in.
 | 
					// Int32 returns a pointer to of the int32 value passed in.
 | 
				
			||||||
func Int32(v int32) *int32 {
 | 
					func Int32(v int32) *int32 {
 | 
				
			||||||
	return &v
 | 
						return &v
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Int32Value returns the value of the int64 pointer passed in or
 | 
					// Int32Value returns the value of the int32 pointer passed in or
 | 
				
			||||||
// 0 if the pointer is nil.
 | 
					// 0 if the pointer is nil.
 | 
				
			||||||
func Int32Value(v *int32) int32 {
 | 
					func Int32Value(v *int32) int32 {
 | 
				
			||||||
	if v != nil {
 | 
						if v != nil {
 | 
				
			||||||
| 
						 | 
					@ -195,7 +195,7 @@ func Int32Value(v *int32) int32 {
 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Int32Slice converts a slice of int64 values into a slice of
 | 
					// Int32Slice converts a slice of int32 values into a slice of
 | 
				
			||||||
// int32 pointers
 | 
					// int32 pointers
 | 
				
			||||||
func Int32Slice(src []int32) []*int32 {
 | 
					func Int32Slice(src []int32) []*int32 {
 | 
				
			||||||
	dst := make([]*int32, len(src))
 | 
						dst := make([]*int32, len(src))
 | 
				
			||||||
| 
						 | 
					@ -299,13 +299,80 @@ func Int64ValueMap(src map[string]*int64) map[string]int64 {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint returns a pouinter to of the uint value passed in.
 | 
					// Uint16 returns a pointer to of the uint16 value passed in.
 | 
				
			||||||
 | 
					func Uint16(v uint16) *uint16 {
 | 
				
			||||||
 | 
						return &v
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Uint16Value returns the value of the uint16 pointer passed in or
 | 
				
			||||||
 | 
					// 0 if the pointer is nil.
 | 
				
			||||||
 | 
					func Uint16Value(v *uint16) uint16 {
 | 
				
			||||||
 | 
						if v != nil {
 | 
				
			||||||
 | 
							return *v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Uint16Slice converts a slice of uint16 values into a slice of
 | 
				
			||||||
 | 
					// uint16 pointers
 | 
				
			||||||
 | 
					func Uint16Slice(src []uint16) []*uint16 {
 | 
				
			||||||
 | 
						dst := make([]*uint16, len(src))
 | 
				
			||||||
 | 
						for i := 0; i < len(src); i++ {
 | 
				
			||||||
 | 
							dst[i] = &(src[i])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return dst
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Uint16ValueSlice converts a slice of uint16 pointers into a slice of
 | 
				
			||||||
 | 
					// uint16 values
 | 
				
			||||||
 | 
					func Uint16ValueSlice(src []*uint16) []uint16 {
 | 
				
			||||||
 | 
						dst := make([]uint16, len(src))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := 0; i < len(src); i++ {
 | 
				
			||||||
 | 
							if src[i] != nil {
 | 
				
			||||||
 | 
								dst[i] = *(src[i])
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return dst
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Uint16Map converts a string map of uint16 values into a string
 | 
				
			||||||
 | 
					// map of uint16 pointers
 | 
				
			||||||
 | 
					func Uint16Map(src map[string]uint16) map[string]*uint16 {
 | 
				
			||||||
 | 
						dst := make(map[string]*uint16)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for k, val := range src {
 | 
				
			||||||
 | 
							v := val
 | 
				
			||||||
 | 
							dst[k] = &v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return dst
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Uint16ValueMap converts a string map of uint16 pointers into a string
 | 
				
			||||||
 | 
					// map of uint16 values
 | 
				
			||||||
 | 
					func Uint16ValueMap(src map[string]*uint16) map[string]uint16 {
 | 
				
			||||||
 | 
						dst := make(map[string]uint16)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for k, val := range src {
 | 
				
			||||||
 | 
							if val != nil {
 | 
				
			||||||
 | 
								dst[k] = *val
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return dst
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Uint returns a pointer to of the uint value passed in.
 | 
				
			||||||
func Uint(v uint) *uint {
 | 
					func Uint(v uint) *uint {
 | 
				
			||||||
	return &v
 | 
						return &v
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UintValue returns the value of the uint pouinter passed in or
 | 
					// UintValue returns the value of the uint pointer passed in or
 | 
				
			||||||
// 0 if the pouinter is nil.
 | 
					// 0 if the pointer is nil.
 | 
				
			||||||
func UintValue(v *uint) uint {
 | 
					func UintValue(v *uint) uint {
 | 
				
			||||||
	if v != nil {
 | 
						if v != nil {
 | 
				
			||||||
		return *v
 | 
							return *v
 | 
				
			||||||
| 
						 | 
					@ -313,8 +380,8 @@ func UintValue(v *uint) uint {
 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UintSlice converts a slice of uint values uinto a slice of
 | 
					// UintSlice converts a slice of uint values into a slice of
 | 
				
			||||||
// uint pouinters
 | 
					// uint pointers
 | 
				
			||||||
func UintSlice(src []uint) []*uint {
 | 
					func UintSlice(src []uint) []*uint {
 | 
				
			||||||
	dst := make([]*uint, len(src))
 | 
						dst := make([]*uint, len(src))
 | 
				
			||||||
	for i := 0; i < len(src); i++ {
 | 
						for i := 0; i < len(src); i++ {
 | 
				
			||||||
| 
						 | 
					@ -323,7 +390,7 @@ func UintSlice(src []uint) []*uint {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UintValueSlice converts a slice of uint pouinters uinto a slice of
 | 
					// UintValueSlice converts a slice of uint pointers into a slice of
 | 
				
			||||||
// uint values
 | 
					// uint values
 | 
				
			||||||
func UintValueSlice(src []*uint) []uint {
 | 
					func UintValueSlice(src []*uint) []uint {
 | 
				
			||||||
	dst := make([]uint, len(src))
 | 
						dst := make([]uint, len(src))
 | 
				
			||||||
| 
						 | 
					@ -335,8 +402,8 @@ func UintValueSlice(src []*uint) []uint {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UintMap converts a string map of uint values uinto a string
 | 
					// UintMap converts a string map of uint values into a string
 | 
				
			||||||
// map of uint pouinters
 | 
					// map of uint pointers
 | 
				
			||||||
func UintMap(src map[string]uint) map[string]*uint {
 | 
					func UintMap(src map[string]uint) map[string]*uint {
 | 
				
			||||||
	dst := make(map[string]*uint)
 | 
						dst := make(map[string]*uint)
 | 
				
			||||||
	for k, val := range src {
 | 
						for k, val := range src {
 | 
				
			||||||
| 
						 | 
					@ -346,7 +413,7 @@ func UintMap(src map[string]uint) map[string]*uint {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// UintValueMap converts a string map of uint pouinters uinto a string
 | 
					// UintValueMap converts a string map of uint pointers into a string
 | 
				
			||||||
// map of uint values
 | 
					// map of uint values
 | 
				
			||||||
func UintValueMap(src map[string]*uint) map[string]uint {
 | 
					func UintValueMap(src map[string]*uint) map[string]uint {
 | 
				
			||||||
	dst := make(map[string]uint)
 | 
						dst := make(map[string]uint)
 | 
				
			||||||
| 
						 | 
					@ -358,13 +425,13 @@ func UintValueMap(src map[string]*uint) map[string]uint {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint32 returns a pouinter to of the uint64 value passed in.
 | 
					// Uint32 returns a pointer to of the uint32 value passed in.
 | 
				
			||||||
func Uint32(v uint32) *uint32 {
 | 
					func Uint32(v uint32) *uint32 {
 | 
				
			||||||
	return &v
 | 
						return &v
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint32Value returns the value of the uint64 pouinter passed in or
 | 
					// Uint32Value returns the value of the uint32 pointer passed in or
 | 
				
			||||||
// 0 if the pouinter is nil.
 | 
					// 0 if the pointer is nil.
 | 
				
			||||||
func Uint32Value(v *uint32) uint32 {
 | 
					func Uint32Value(v *uint32) uint32 {
 | 
				
			||||||
	if v != nil {
 | 
						if v != nil {
 | 
				
			||||||
		return *v
 | 
							return *v
 | 
				
			||||||
| 
						 | 
					@ -372,8 +439,8 @@ func Uint32Value(v *uint32) uint32 {
 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint32Slice converts a slice of uint64 values uinto a slice of
 | 
					// Uint32Slice converts a slice of uint32 values into a slice of
 | 
				
			||||||
// uint32 pouinters
 | 
					// uint32 pointers
 | 
				
			||||||
func Uint32Slice(src []uint32) []*uint32 {
 | 
					func Uint32Slice(src []uint32) []*uint32 {
 | 
				
			||||||
	dst := make([]*uint32, len(src))
 | 
						dst := make([]*uint32, len(src))
 | 
				
			||||||
	for i := 0; i < len(src); i++ {
 | 
						for i := 0; i < len(src); i++ {
 | 
				
			||||||
| 
						 | 
					@ -382,7 +449,7 @@ func Uint32Slice(src []uint32) []*uint32 {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint32ValueSlice converts a slice of uint32 pouinters uinto a slice of
 | 
					// Uint32ValueSlice converts a slice of uint32 pointers into a slice of
 | 
				
			||||||
// uint32 values
 | 
					// uint32 values
 | 
				
			||||||
func Uint32ValueSlice(src []*uint32) []uint32 {
 | 
					func Uint32ValueSlice(src []*uint32) []uint32 {
 | 
				
			||||||
	dst := make([]uint32, len(src))
 | 
						dst := make([]uint32, len(src))
 | 
				
			||||||
| 
						 | 
					@ -394,8 +461,8 @@ func Uint32ValueSlice(src []*uint32) []uint32 {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint32Map converts a string map of uint32 values uinto a string
 | 
					// Uint32Map converts a string map of uint32 values into a string
 | 
				
			||||||
// map of uint32 pouinters
 | 
					// map of uint32 pointers
 | 
				
			||||||
func Uint32Map(src map[string]uint32) map[string]*uint32 {
 | 
					func Uint32Map(src map[string]uint32) map[string]*uint32 {
 | 
				
			||||||
	dst := make(map[string]*uint32)
 | 
						dst := make(map[string]*uint32)
 | 
				
			||||||
	for k, val := range src {
 | 
						for k, val := range src {
 | 
				
			||||||
| 
						 | 
					@ -405,7 +472,7 @@ func Uint32Map(src map[string]uint32) map[string]*uint32 {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint32ValueMap converts a string map of uint32 pouinters uinto a string
 | 
					// Uint32ValueMap converts a string map of uint32 pointers into a string
 | 
				
			||||||
// map of uint32 values
 | 
					// map of uint32 values
 | 
				
			||||||
func Uint32ValueMap(src map[string]*uint32) map[string]uint32 {
 | 
					func Uint32ValueMap(src map[string]*uint32) map[string]uint32 {
 | 
				
			||||||
	dst := make(map[string]uint32)
 | 
						dst := make(map[string]uint32)
 | 
				
			||||||
| 
						 | 
					@ -417,13 +484,13 @@ func Uint32ValueMap(src map[string]*uint32) map[string]uint32 {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint64 returns a pouinter to of the uint64 value passed in.
 | 
					// Uint64 returns a pointer to of the uint64 value passed in.
 | 
				
			||||||
func Uint64(v uint64) *uint64 {
 | 
					func Uint64(v uint64) *uint64 {
 | 
				
			||||||
	return &v
 | 
						return &v
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint64Value returns the value of the uint64 pouinter passed in or
 | 
					// Uint64Value returns the value of the uint64 pointer passed in or
 | 
				
			||||||
// 0 if the pouinter is nil.
 | 
					// 0 if the pointer is nil.
 | 
				
			||||||
func Uint64Value(v *uint64) uint64 {
 | 
					func Uint64Value(v *uint64) uint64 {
 | 
				
			||||||
	if v != nil {
 | 
						if v != nil {
 | 
				
			||||||
		return *v
 | 
							return *v
 | 
				
			||||||
| 
						 | 
					@ -431,8 +498,8 @@ func Uint64Value(v *uint64) uint64 {
 | 
				
			||||||
	return 0
 | 
						return 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint64Slice converts a slice of uint64 values uinto a slice of
 | 
					// Uint64Slice converts a slice of uint64 values into a slice of
 | 
				
			||||||
// uint64 pouinters
 | 
					// uint64 pointers
 | 
				
			||||||
func Uint64Slice(src []uint64) []*uint64 {
 | 
					func Uint64Slice(src []uint64) []*uint64 {
 | 
				
			||||||
	dst := make([]*uint64, len(src))
 | 
						dst := make([]*uint64, len(src))
 | 
				
			||||||
	for i := 0; i < len(src); i++ {
 | 
						for i := 0; i < len(src); i++ {
 | 
				
			||||||
| 
						 | 
					@ -441,7 +508,7 @@ func Uint64Slice(src []uint64) []*uint64 {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint64ValueSlice converts a slice of uint64 pouinters uinto a slice of
 | 
					// Uint64ValueSlice converts a slice of uint64 pointers into a slice of
 | 
				
			||||||
// uint64 values
 | 
					// uint64 values
 | 
				
			||||||
func Uint64ValueSlice(src []*uint64) []uint64 {
 | 
					func Uint64ValueSlice(src []*uint64) []uint64 {
 | 
				
			||||||
	dst := make([]uint64, len(src))
 | 
						dst := make([]uint64, len(src))
 | 
				
			||||||
| 
						 | 
					@ -453,8 +520,8 @@ func Uint64ValueSlice(src []*uint64) []uint64 {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint64Map converts a string map of uint64 values uinto a string
 | 
					// Uint64Map converts a string map of uint64 values into a string
 | 
				
			||||||
// map of uint64 pouinters
 | 
					// map of uint64 pointers
 | 
				
			||||||
func Uint64Map(src map[string]uint64) map[string]*uint64 {
 | 
					func Uint64Map(src map[string]uint64) map[string]*uint64 {
 | 
				
			||||||
	dst := make(map[string]*uint64)
 | 
						dst := make(map[string]*uint64)
 | 
				
			||||||
	for k, val := range src {
 | 
						for k, val := range src {
 | 
				
			||||||
| 
						 | 
					@ -464,7 +531,7 @@ func Uint64Map(src map[string]uint64) map[string]*uint64 {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Uint64ValueMap converts a string map of uint64 pouinters uinto a string
 | 
					// Uint64ValueMap converts a string map of uint64 pointers into a string
 | 
				
			||||||
// map of uint64 values
 | 
					// map of uint64 values
 | 
				
			||||||
func Uint64ValueMap(src map[string]*uint64) map[string]uint64 {
 | 
					func Uint64ValueMap(src map[string]*uint64) map[string]uint64 {
 | 
				
			||||||
	dst := make(map[string]uint64)
 | 
						dst := make(map[string]uint64)
 | 
				
			||||||
| 
						 | 
					@ -476,6 +543,74 @@ func Uint64ValueMap(src map[string]*uint64) map[string]uint64 {
 | 
				
			||||||
	return dst
 | 
						return dst
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Float32 returns a pointer to of the float32 value passed in.
 | 
				
			||||||
 | 
					func Float32(v float32) *float32 {
 | 
				
			||||||
 | 
						return &v
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Float32Value returns the value of the float32 pointer passed in or
 | 
				
			||||||
 | 
					// 0 if the pointer is nil.
 | 
				
			||||||
 | 
					func Float32Value(v *float32) float32 {
 | 
				
			||||||
 | 
						if v != nil {
 | 
				
			||||||
 | 
							return *v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Float32Slice converts a slice of float32 values into a slice of
 | 
				
			||||||
 | 
					// float32 pointers
 | 
				
			||||||
 | 
					func Float32Slice(src []float32) []*float32 {
 | 
				
			||||||
 | 
						dst := make([]*float32, len(src))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := 0; i < len(src); i++ {
 | 
				
			||||||
 | 
							dst[i] = &(src[i])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return dst
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Float32ValueSlice converts a slice of float32 pointers into a slice of
 | 
				
			||||||
 | 
					// float32 values
 | 
				
			||||||
 | 
					func Float32ValueSlice(src []*float32) []float32 {
 | 
				
			||||||
 | 
						dst := make([]float32, len(src))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := 0; i < len(src); i++ {
 | 
				
			||||||
 | 
							if src[i] != nil {
 | 
				
			||||||
 | 
								dst[i] = *(src[i])
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return dst
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Float32Map converts a string map of float32 values into a string
 | 
				
			||||||
 | 
					// map of float32 pointers
 | 
				
			||||||
 | 
					func Float32Map(src map[string]float32) map[string]*float32 {
 | 
				
			||||||
 | 
						dst := make(map[string]*float32)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for k, val := range src {
 | 
				
			||||||
 | 
							v := val
 | 
				
			||||||
 | 
							dst[k] = &v
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return dst
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Float32ValueMap converts a string map of float32 pointers into a string
 | 
				
			||||||
 | 
					// map of float32 values
 | 
				
			||||||
 | 
					func Float32ValueMap(src map[string]*float32) map[string]float32 {
 | 
				
			||||||
 | 
						dst := make(map[string]float32)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for k, val := range src {
 | 
				
			||||||
 | 
							if val != nil {
 | 
				
			||||||
 | 
								dst[k] = *val
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return dst
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Float64 returns a pointer to of the float64 value passed in.
 | 
					// Float64 returns a pointer to of the float64 value passed in.
 | 
				
			||||||
func Float64(v float64) *float64 {
 | 
					func Float64(v float64) *float64 {
 | 
				
			||||||
	return &v
 | 
						return &v
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,9 +6,11 @@ require (
 | 
				
			||||||
	github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63
 | 
						github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63
 | 
				
			||||||
	github.com/stretchr/testify v1.3.0
 | 
						github.com/stretchr/testify v1.3.0
 | 
				
			||||||
	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
 | 
						gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
 | 
				
			||||||
	gopkg.in/yaml.v2 v2.2.2
 | 
						gopkg.in/yaml.v2 v2.2.4
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422
 | 
					replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422
 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1
 | 
					replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.13
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,5 +16,5 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
 | 
				
			||||||
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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
					gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 | 
				
			||||||
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=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,7 @@ type ejUnmarshaler interface {
 | 
				
			||||||
	UnmarshalEasyJSON(w *jlexer.Lexer)
 | 
						UnmarshalEasyJSON(w *jlexer.Lexer)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaller
 | 
					// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaler
 | 
				
			||||||
// so it takes the fastest option available.
 | 
					// so it takes the fastest option available.
 | 
				
			||||||
func WriteJSON(data interface{}) ([]byte, error) {
 | 
					func WriteJSON(data interface{}) ([]byte, error) {
 | 
				
			||||||
	if d, ok := data.(ejMarshaler); ok {
 | 
						if d, ok := data.(ejMarshaler); ok {
 | 
				
			||||||
| 
						 | 
					@ -65,8 +65,8 @@ func WriteJSON(data interface{}) ([]byte, error) {
 | 
				
			||||||
	return json.Marshal(data)
 | 
						return json.Marshal(data)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller
 | 
					// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler
 | 
				
			||||||
// so it takes the fastes option available
 | 
					// so it takes the fastest option available
 | 
				
			||||||
func ReadJSON(data []byte, value interface{}) error {
 | 
					func ReadJSON(data []byte, value interface{}) error {
 | 
				
			||||||
	trimmedData := bytes.Trim(data, "\x00")
 | 
						trimmedData := bytes.Trim(data, "\x00")
 | 
				
			||||||
	if d, ok := value.(ejUnmarshaler); ok {
 | 
						if d, ok := value.(ejUnmarshaler); ok {
 | 
				
			||||||
| 
						 | 
					@ -189,7 +189,7 @@ func FromDynamicJSON(data, target interface{}) error {
 | 
				
			||||||
	return json.Unmarshal(b, target)
 | 
						return json.Unmarshal(b, target)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NameProvider represents an object capabale of translating from go property names
 | 
					// NameProvider represents an object capable of translating from go property names
 | 
				
			||||||
// to json property names
 | 
					// to json property names
 | 
				
			||||||
// This type is thread-safe.
 | 
					// This type is thread-safe.
 | 
				
			||||||
type NameProvider struct {
 | 
					type NameProvider struct {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,15 @@ import (
 | 
				
			||||||
// LoadHTTPTimeout the default timeout for load requests
 | 
					// LoadHTTPTimeout the default timeout for load requests
 | 
				
			||||||
var LoadHTTPTimeout = 30 * time.Second
 | 
					var LoadHTTPTimeout = 30 * time.Second
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// LoadHTTPBasicAuthUsername the username to use when load requests require basic auth
 | 
				
			||||||
 | 
					var LoadHTTPBasicAuthUsername = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// LoadHTTPBasicAuthPassword the password to use when load requests require basic auth
 | 
				
			||||||
 | 
					var LoadHTTPBasicAuthPassword = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// LoadHTTPCustomHeaders an optional collection of custom HTTP headers for load requests
 | 
				
			||||||
 | 
					var LoadHTTPCustomHeaders = map[string]string{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in
 | 
					// LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in
 | 
				
			||||||
func LoadFromFileOrHTTP(path string) ([]byte, error) {
 | 
					func LoadFromFileOrHTTP(path string) ([]byte, error) {
 | 
				
			||||||
	return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path)
 | 
						return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path)
 | 
				
			||||||
| 
						 | 
					@ -59,6 +68,15 @@ func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) {
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			return nil, err
 | 
								return nil, err
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if LoadHTTPBasicAuthUsername != "" && LoadHTTPBasicAuthPassword != "" {
 | 
				
			||||||
 | 
								req.SetBasicAuth(LoadHTTPBasicAuthUsername, LoadHTTPBasicAuthPassword)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for key, val := range LoadHTTPCustomHeaders {
 | 
				
			||||||
 | 
								req.Header.Set(key, val)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		resp, err := client.Do(req)
 | 
							resp, err := client.Do(req)
 | 
				
			||||||
		defer func() {
 | 
							defer func() {
 | 
				
			||||||
			if resp != nil {
 | 
								if resp != nil {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,17 +4,25 @@ linters-settings:
 | 
				
			||||||
  golint:
 | 
					  golint:
 | 
				
			||||||
    min-confidence: 0
 | 
					    min-confidence: 0
 | 
				
			||||||
  gocyclo:
 | 
					  gocyclo:
 | 
				
			||||||
    min-complexity: 25
 | 
					    min-complexity: 50
 | 
				
			||||||
  maligned:
 | 
					  maligned:
 | 
				
			||||||
    suggest-new: true
 | 
					    suggest-new: true
 | 
				
			||||||
  dupl:
 | 
					  dupl:
 | 
				
			||||||
    threshold: 100
 | 
					    threshold: 100
 | 
				
			||||||
  goconst:
 | 
					  goconst:
 | 
				
			||||||
    min-len: 2
 | 
					    min-len: 2
 | 
				
			||||||
    min-occurrences: 2
 | 
					    min-occurrences: 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
linters:
 | 
					linters:
 | 
				
			||||||
  enable-all: true
 | 
					  enable-all: true
 | 
				
			||||||
  disable:
 | 
					  disable:
 | 
				
			||||||
    - maligned
 | 
					    - maligned
 | 
				
			||||||
    - lll
 | 
					    - lll
 | 
				
			||||||
 | 
					    - godox
 | 
				
			||||||
 | 
					    - gocognit
 | 
				
			||||||
 | 
					    - whitespace
 | 
				
			||||||
 | 
					    - wsl
 | 
				
			||||||
 | 
					    - funlen
 | 
				
			||||||
 | 
					    - gochecknoglobals
 | 
				
			||||||
 | 
					    - gochecknoinits
 | 
				
			||||||
 | 
					    - scopelint
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,10 @@
 | 
				
			||||||
after_success:
 | 
					after_success:
 | 
				
			||||||
- bash <(curl -s https://codecov.io/bash)
 | 
					- bash <(curl -s https://codecov.io/bash)
 | 
				
			||||||
go:
 | 
					go:
 | 
				
			||||||
- 1.11.x
 | 
					- 1.13.x
 | 
				
			||||||
- 1.12.x
 | 
					- 1.14.x
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
					- GO111MODULE=off go get -u gotest.tools/gotestsum
 | 
				
			||||||
env:
 | 
					 | 
				
			||||||
- GO111MODULE=on
 | 
					 | 
				
			||||||
language: go
 | 
					language: go
 | 
				
			||||||
notifications:
 | 
					notifications:
 | 
				
			||||||
  slack:
 | 
					  slack:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,14 +33,8 @@ func (d *defaultValidator) resetVisited() {
 | 
				
			||||||
	d.visitedSchemas = map[string]bool{}
 | 
						d.visitedSchemas = map[string]bool{}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// beingVisited asserts a schema is being visited
 | 
					func isVisited(path string, visitedSchemas map[string]bool) bool {
 | 
				
			||||||
func (d *defaultValidator) beingVisited(path string) {
 | 
						found := visitedSchemas[path]
 | 
				
			||||||
	d.visitedSchemas[path] = true
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// isVisited tells if a path has already been visited
 | 
					 | 
				
			||||||
func (d *defaultValidator) isVisited(path string) bool {
 | 
					 | 
				
			||||||
	found := d.visitedSchemas[path]
 | 
					 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		// search for overlapping paths
 | 
							// search for overlapping paths
 | 
				
			||||||
		frags := strings.Split(path, ".")
 | 
							frags := strings.Split(path, ".")
 | 
				
			||||||
| 
						 | 
					@ -70,6 +64,16 @@ func (d *defaultValidator) isVisited(path string) bool {
 | 
				
			||||||
	return found
 | 
						return found
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// beingVisited asserts a schema is being visited
 | 
				
			||||||
 | 
					func (d *defaultValidator) beingVisited(path string) {
 | 
				
			||||||
 | 
						d.visitedSchemas[path] = true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// isVisited tells if a path has already been visited
 | 
				
			||||||
 | 
					func (d *defaultValidator) isVisited(path string) bool {
 | 
				
			||||||
 | 
						return isVisited(path, d.visitedSchemas)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Validate validates the default values declared in the swagger spec
 | 
					// Validate validates the default values declared in the swagger spec
 | 
				
			||||||
func (d *defaultValidator) Validate() (errs *Result) {
 | 
					func (d *defaultValidator) Validate() (errs *Result) {
 | 
				
			||||||
	errs = new(Result)
 | 
						errs = new(Result)
 | 
				
			||||||
| 
						 | 
					@ -89,64 +93,60 @@ func (d *defaultValidator) validateDefaultValueValidAgainstSchema() *Result {
 | 
				
			||||||
	s := d.SpecValidator
 | 
						s := d.SpecValidator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for method, pathItem := range s.analyzer.Operations() {
 | 
						for method, pathItem := range s.analyzer.Operations() {
 | 
				
			||||||
		if pathItem != nil { // Safeguard
 | 
							for path, op := range pathItem {
 | 
				
			||||||
			for path, op := range pathItem {
 | 
								// parameters
 | 
				
			||||||
				// parameters
 | 
								for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) {
 | 
				
			||||||
				for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) {
 | 
									if param.Default != nil && param.Required {
 | 
				
			||||||
					if param.Default != nil && param.Required {
 | 
										res.AddWarnings(requiredHasDefaultMsg(param.Name, param.In))
 | 
				
			||||||
						res.AddWarnings(requiredHasDefaultMsg(param.Name, param.In))
 | 
									}
 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// reset explored schemas to get depth-first recursive-proof exploration
 | 
									// reset explored schemas to get depth-first recursive-proof exploration
 | 
				
			||||||
					d.resetVisited()
 | 
									d.resetVisited()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// Check simple parameters first
 | 
									// Check simple parameters first
 | 
				
			||||||
					// default values provided must validate against their inline definition (no explicit schema)
 | 
									// default values provided must validate against their inline definition (no explicit schema)
 | 
				
			||||||
					if param.Default != nil && param.Schema == nil {
 | 
									if param.Default != nil && param.Schema == nil {
 | 
				
			||||||
						// check param default value is valid
 | 
										// check param default value is valid
 | 
				
			||||||
						red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Default)
 | 
										red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Default)
 | 
				
			||||||
						if red.HasErrorsOrWarnings() {
 | 
										if red.HasErrorsOrWarnings() {
 | 
				
			||||||
							res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In))
 | 
											res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In))
 | 
				
			||||||
							res.Merge(red)
 | 
											res.Merge(red)
 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					// Recursively follows Items and Schemas
 | 
					 | 
				
			||||||
					if param.Items != nil {
 | 
					 | 
				
			||||||
						red := d.validateDefaultValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items)
 | 
					 | 
				
			||||||
						if red.HasErrorsOrWarnings() {
 | 
					 | 
				
			||||||
							res.AddErrors(defaultValueItemsDoesNotValidateMsg(param.Name, param.In))
 | 
					 | 
				
			||||||
							res.Merge(red)
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if param.Schema != nil {
 | 
					 | 
				
			||||||
						// Validate default value against schema
 | 
					 | 
				
			||||||
						red := d.validateDefaultValueSchemaAgainstSchema(param.Name, param.In, param.Schema)
 | 
					 | 
				
			||||||
						if red.HasErrorsOrWarnings() {
 | 
					 | 
				
			||||||
							res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In))
 | 
					 | 
				
			||||||
							res.Merge(red)
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if op.Responses != nil {
 | 
									// Recursively follows Items and Schemas
 | 
				
			||||||
					if op.Responses.Default != nil {
 | 
									if param.Items != nil {
 | 
				
			||||||
						// Same constraint on default Response
 | 
										red := d.validateDefaultValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items)
 | 
				
			||||||
						res.Merge(d.validateDefaultInResponse(op.Responses.Default, "default", path, 0, op.ID))
 | 
										if red.HasErrorsOrWarnings() {
 | 
				
			||||||
					}
 | 
											res.AddErrors(defaultValueItemsDoesNotValidateMsg(param.Name, param.In))
 | 
				
			||||||
					// Same constraint on regular Responses
 | 
											res.Merge(red)
 | 
				
			||||||
					if op.Responses.StatusCodeResponses != nil { // Safeguard
 | 
					 | 
				
			||||||
						for code, r := range op.Responses.StatusCodeResponses {
 | 
					 | 
				
			||||||
							res.Merge(d.validateDefaultInResponse(&r, "response", path, code, op.ID))
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					// Empty op.ID means there is no meaningful operation: no need to report a specific message
 | 
					 | 
				
			||||||
					if op.ID != "" {
 | 
					 | 
				
			||||||
						res.AddErrors(noValidResponseMsg(op.ID))
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if param.Schema != nil {
 | 
				
			||||||
 | 
										// Validate default value against schema
 | 
				
			||||||
 | 
										red := d.validateDefaultValueSchemaAgainstSchema(param.Name, param.In, param.Schema)
 | 
				
			||||||
 | 
										if red.HasErrorsOrWarnings() {
 | 
				
			||||||
 | 
											res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In))
 | 
				
			||||||
 | 
											res.Merge(red)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if op.Responses != nil {
 | 
				
			||||||
 | 
									if op.Responses.Default != nil {
 | 
				
			||||||
 | 
										// Same constraint on default Response
 | 
				
			||||||
 | 
										res.Merge(d.validateDefaultInResponse(op.Responses.Default, jsonDefault, path, 0, op.ID))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									// Same constraint on regular Responses
 | 
				
			||||||
 | 
									if op.Responses.StatusCodeResponses != nil { // Safeguard
 | 
				
			||||||
 | 
										for code, r := range op.Responses.StatusCodeResponses {
 | 
				
			||||||
 | 
											res.Merge(d.validateDefaultInResponse(&r, "response", path, code, op.ID))
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else if op.ID != "" {
 | 
				
			||||||
 | 
									// Empty op.ID means there is no meaningful operation: no need to report a specific message
 | 
				
			||||||
 | 
									res.AddErrors(noValidResponseMsg(op.ID))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -170,6 +170,7 @@ func (d *defaultValidator) validateDefaultInResponse(resp *spec.Response, respon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode)
 | 
						responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// nolint: dupl
 | 
				
			||||||
	if response.Headers != nil { // Safeguard
 | 
						if response.Headers != nil { // Safeguard
 | 
				
			||||||
		for nm, h := range response.Headers {
 | 
							for nm, h := range response.Headers {
 | 
				
			||||||
			// reset explored schemas to get depth-first recursive-proof exploration
 | 
								// reset explored schemas to get depth-first recursive-proof exploration
 | 
				
			||||||
| 
						 | 
					@ -223,7 +224,7 @@ func (d *defaultValidator) validateDefaultValueSchemaAgainstSchema(path, in stri
 | 
				
			||||||
	s := d.SpecValidator
 | 
						s := d.SpecValidator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if schema.Default != nil {
 | 
						if schema.Default != nil {
 | 
				
			||||||
		res.Merge(NewSchemaValidator(schema, s.spec.Spec(), path+".default", s.KnownFormats).Validate(schema.Default))
 | 
							res.Merge(NewSchemaValidator(schema, s.spec.Spec(), path+".default", s.KnownFormats, SwaggerSchema(true)).Validate(schema.Default))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if schema.Items != nil {
 | 
						if schema.Items != nil {
 | 
				
			||||||
		if schema.Items.Schema != nil {
 | 
							if schema.Items.Schema != nil {
 | 
				
			||||||
| 
						 | 
					@ -260,6 +261,8 @@ func (d *defaultValidator) validateDefaultValueSchemaAgainstSchema(path, in stri
 | 
				
			||||||
	return res
 | 
						return res
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: Temporary duplicated code. Need to refactor with examples
 | 
				
			||||||
 | 
					// nolint: dupl
 | 
				
			||||||
func (d *defaultValidator) validateDefaultValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result {
 | 
					func (d *defaultValidator) validateDefaultValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result {
 | 
				
			||||||
	res := new(Result)
 | 
						res := new(Result)
 | 
				
			||||||
	s := d.SpecValidator
 | 
						s := d.SpecValidator
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,6 @@ package validate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"strings"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/go-openapi/spec"
 | 
						"github.com/go-openapi/spec"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -39,34 +38,7 @@ func (ex *exampleValidator) beingVisited(path string) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// isVisited tells if a path has already been visited
 | 
					// isVisited tells if a path has already been visited
 | 
				
			||||||
func (ex *exampleValidator) isVisited(path string) bool {
 | 
					func (ex *exampleValidator) isVisited(path string) bool {
 | 
				
			||||||
	found := ex.visitedSchemas[path]
 | 
						return isVisited(path, ex.visitedSchemas)
 | 
				
			||||||
	if !found {
 | 
					 | 
				
			||||||
		// search for overlapping paths
 | 
					 | 
				
			||||||
		frags := strings.Split(path, ".")
 | 
					 | 
				
			||||||
		if len(frags) < 2 {
 | 
					 | 
				
			||||||
			// shortcut exit on smaller paths
 | 
					 | 
				
			||||||
			return found
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		last := len(frags) - 1
 | 
					 | 
				
			||||||
		var currentFragStr, parent string
 | 
					 | 
				
			||||||
		for i := range frags {
 | 
					 | 
				
			||||||
			if i == 0 {
 | 
					 | 
				
			||||||
				currentFragStr = frags[last]
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				currentFragStr = strings.Join([]string{frags[last-i], currentFragStr}, ".")
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if i < last {
 | 
					 | 
				
			||||||
				parent = strings.Join(frags[0:last-i], ".")
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				parent = ""
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if strings.HasSuffix(parent, currentFragStr) {
 | 
					 | 
				
			||||||
				found = true
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return found
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Validate validates the example values declared in the swagger spec
 | 
					// Validate validates the example values declared in the swagger spec
 | 
				
			||||||
| 
						 | 
					@ -97,64 +69,60 @@ func (ex *exampleValidator) validateExampleValueValidAgainstSchema() *Result {
 | 
				
			||||||
	s := ex.SpecValidator
 | 
						s := ex.SpecValidator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for method, pathItem := range s.analyzer.Operations() {
 | 
						for method, pathItem := range s.analyzer.Operations() {
 | 
				
			||||||
		if pathItem != nil { // Safeguard
 | 
							for path, op := range pathItem {
 | 
				
			||||||
			for path, op := range pathItem {
 | 
								// parameters
 | 
				
			||||||
				// parameters
 | 
								for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) {
 | 
				
			||||||
				for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) {
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// As of swagger 2.0, Examples are not supported in simple parameters
 | 
									// As of swagger 2.0, Examples are not supported in simple parameters
 | 
				
			||||||
					// However, it looks like it is supported by go-openapi
 | 
									// However, it looks like it is supported by go-openapi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// reset explored schemas to get depth-first recursive-proof exploration
 | 
									// reset explored schemas to get depth-first recursive-proof exploration
 | 
				
			||||||
					ex.resetVisited()
 | 
									ex.resetVisited()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// Check simple parameters first
 | 
									// Check simple parameters first
 | 
				
			||||||
					// default values provided must validate against their inline definition (no explicit schema)
 | 
									// default values provided must validate against their inline definition (no explicit schema)
 | 
				
			||||||
					if param.Example != nil && param.Schema == nil {
 | 
									if param.Example != nil && param.Schema == nil {
 | 
				
			||||||
						// check param default value is valid
 | 
										// check param default value is valid
 | 
				
			||||||
						red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Example)
 | 
										red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Example)
 | 
				
			||||||
						if red.HasErrorsOrWarnings() {
 | 
										if red.HasErrorsOrWarnings() {
 | 
				
			||||||
							res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In))
 | 
											res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In))
 | 
				
			||||||
							res.MergeAsWarnings(red)
 | 
											res.MergeAsWarnings(red)
 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					// Recursively follows Items and Schemas
 | 
					 | 
				
			||||||
					if param.Items != nil {
 | 
					 | 
				
			||||||
						red := ex.validateExampleValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items)
 | 
					 | 
				
			||||||
						if red.HasErrorsOrWarnings() {
 | 
					 | 
				
			||||||
							res.AddWarnings(exampleValueItemsDoesNotValidateMsg(param.Name, param.In))
 | 
					 | 
				
			||||||
							res.Merge(red)
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if param.Schema != nil {
 | 
					 | 
				
			||||||
						// Validate example value against schema
 | 
					 | 
				
			||||||
						red := ex.validateExampleValueSchemaAgainstSchema(param.Name, param.In, param.Schema)
 | 
					 | 
				
			||||||
						if red.HasErrorsOrWarnings() {
 | 
					 | 
				
			||||||
							res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In))
 | 
					 | 
				
			||||||
							res.Merge(red)
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if op.Responses != nil {
 | 
									// Recursively follows Items and Schemas
 | 
				
			||||||
					if op.Responses.Default != nil {
 | 
									if param.Items != nil {
 | 
				
			||||||
						// Same constraint on default Response
 | 
										red := ex.validateExampleValueItemsAgainstSchema(param.Name, param.In, ¶m, param.Items)
 | 
				
			||||||
						res.Merge(ex.validateExampleInResponse(op.Responses.Default, "default", path, 0, op.ID))
 | 
										if red.HasErrorsOrWarnings() {
 | 
				
			||||||
					}
 | 
											res.AddWarnings(exampleValueItemsDoesNotValidateMsg(param.Name, param.In))
 | 
				
			||||||
					// Same constraint on regular Responses
 | 
											res.Merge(red)
 | 
				
			||||||
					if op.Responses.StatusCodeResponses != nil { // Safeguard
 | 
					 | 
				
			||||||
						for code, r := range op.Responses.StatusCodeResponses {
 | 
					 | 
				
			||||||
							res.Merge(ex.validateExampleInResponse(&r, "response", path, code, op.ID))
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					// Empty op.ID means there is no meaningful operation: no need to report a specific message
 | 
					 | 
				
			||||||
					if op.ID != "" {
 | 
					 | 
				
			||||||
						res.AddErrors(noValidResponseMsg(op.ID))
 | 
					 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if param.Schema != nil {
 | 
				
			||||||
 | 
										// Validate example value against schema
 | 
				
			||||||
 | 
										red := ex.validateExampleValueSchemaAgainstSchema(param.Name, param.In, param.Schema)
 | 
				
			||||||
 | 
										if red.HasErrorsOrWarnings() {
 | 
				
			||||||
 | 
											res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In))
 | 
				
			||||||
 | 
											res.Merge(red)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if op.Responses != nil {
 | 
				
			||||||
 | 
									if op.Responses.Default != nil {
 | 
				
			||||||
 | 
										// Same constraint on default Response
 | 
				
			||||||
 | 
										res.Merge(ex.validateExampleInResponse(op.Responses.Default, jsonDefault, path, 0, op.ID))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									// Same constraint on regular Responses
 | 
				
			||||||
 | 
									if op.Responses.StatusCodeResponses != nil { // Safeguard
 | 
				
			||||||
 | 
										for code, r := range op.Responses.StatusCodeResponses {
 | 
				
			||||||
 | 
											res.Merge(ex.validateExampleInResponse(&r, "response", path, code, op.ID))
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else if op.ID != "" {
 | 
				
			||||||
 | 
									// Empty op.ID means there is no meaningful operation: no need to report a specific message
 | 
				
			||||||
 | 
									res.AddErrors(noValidResponseMsg(op.ID))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -178,6 +146,7 @@ func (ex *exampleValidator) validateExampleInResponse(resp *spec.Response, respo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode)
 | 
						responseName, responseCodeAsStr := responseHelp.responseMsgVariants(responseType, responseCode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// nolint: dupl
 | 
				
			||||||
	if response.Headers != nil { // Safeguard
 | 
						if response.Headers != nil { // Safeguard
 | 
				
			||||||
		for nm, h := range response.Headers {
 | 
							for nm, h := range response.Headers {
 | 
				
			||||||
			// reset explored schemas to get depth-first recursive-proof exploration
 | 
								// reset explored schemas to get depth-first recursive-proof exploration
 | 
				
			||||||
| 
						 | 
					@ -222,7 +191,7 @@ func (ex *exampleValidator) validateExampleInResponse(resp *spec.Response, respo
 | 
				
			||||||
	if response.Examples != nil {
 | 
						if response.Examples != nil {
 | 
				
			||||||
		if response.Schema != nil {
 | 
							if response.Schema != nil {
 | 
				
			||||||
			if example, ok := response.Examples["application/json"]; ok {
 | 
								if example, ok := response.Examples["application/json"]; ok {
 | 
				
			||||||
				res.MergeAsWarnings(NewSchemaValidator(response.Schema, s.spec.Spec(), path, s.KnownFormats).Validate(example))
 | 
									res.MergeAsWarnings(NewSchemaValidator(response.Schema, s.spec.Spec(), path+".examples", s.KnownFormats, SwaggerSchema(true)).Validate(example))
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				// TODO: validate other media types too
 | 
									// TODO: validate other media types too
 | 
				
			||||||
				res.AddWarnings(examplesMimeNotSupportedMsg(operationID, responseName))
 | 
									res.AddWarnings(examplesMimeNotSupportedMsg(operationID, responseName))
 | 
				
			||||||
| 
						 | 
					@ -244,7 +213,7 @@ func (ex *exampleValidator) validateExampleValueSchemaAgainstSchema(path, in str
 | 
				
			||||||
	res := new(Result)
 | 
						res := new(Result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if schema.Example != nil {
 | 
						if schema.Example != nil {
 | 
				
			||||||
		res.MergeAsWarnings(NewSchemaValidator(schema, s.spec.Spec(), path+".example", s.KnownFormats).Validate(schema.Example))
 | 
							res.MergeAsWarnings(NewSchemaValidator(schema, s.spec.Spec(), path+".example", s.KnownFormats, SwaggerSchema(true)).Validate(schema.Example))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if schema.Items != nil {
 | 
						if schema.Items != nil {
 | 
				
			||||||
		if schema.Items.Schema != nil {
 | 
							if schema.Items.Schema != nil {
 | 
				
			||||||
| 
						 | 
					@ -281,6 +250,8 @@ func (ex *exampleValidator) validateExampleValueSchemaAgainstSchema(path, in str
 | 
				
			||||||
	return res
 | 
						return res
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: Temporary duplicated code. Need to refactor with examples
 | 
				
			||||||
 | 
					// nolint: dupl
 | 
				
			||||||
func (ex *exampleValidator) validateExampleValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result {
 | 
					func (ex *exampleValidator) validateExampleValueItemsAgainstSchema(path, in string, root interface{}, items *spec.Items) *Result {
 | 
				
			||||||
	res := new(Result)
 | 
						res := new(Result)
 | 
				
			||||||
	s := ex.SpecValidator
 | 
						s := ex.SpecValidator
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,19 +37,15 @@ func (f *formatValidator) Applies(source interface{}, kind reflect.Kind) bool {
 | 
				
			||||||
		if source == nil {
 | 
							if source == nil {
 | 
				
			||||||
			return false
 | 
								return false
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		switch source.(type) {
 | 
							switch source := source.(type) {
 | 
				
			||||||
		case *spec.Items:
 | 
							case *spec.Items:
 | 
				
			||||||
			it := source.(*spec.Items)
 | 
								return kind == reflect.String && f.KnownFormats.ContainsName(source.Format)
 | 
				
			||||||
			return kind == reflect.String && f.KnownFormats.ContainsName(it.Format)
 | 
					 | 
				
			||||||
		case *spec.Parameter:
 | 
							case *spec.Parameter:
 | 
				
			||||||
			par := source.(*spec.Parameter)
 | 
								return kind == reflect.String && f.KnownFormats.ContainsName(source.Format)
 | 
				
			||||||
			return kind == reflect.String && f.KnownFormats.ContainsName(par.Format)
 | 
					 | 
				
			||||||
		case *spec.Schema:
 | 
							case *spec.Schema:
 | 
				
			||||||
			sch := source.(*spec.Schema)
 | 
								return kind == reflect.String && f.KnownFormats.ContainsName(source.Format)
 | 
				
			||||||
			return kind == reflect.String && f.KnownFormats.ContainsName(sch.Format)
 | 
					 | 
				
			||||||
		case *spec.Header:
 | 
							case *spec.Header:
 | 
				
			||||||
			hdr := source.(*spec.Header)
 | 
								return kind == reflect.String && f.KnownFormats.ContainsName(source.Format)
 | 
				
			||||||
			return kind == reflect.String && f.KnownFormats.ContainsName(hdr.Format)
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,17 +1,21 @@
 | 
				
			||||||
module github.com/go-openapi/validate
 | 
					module github.com/go-openapi/validate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					go 1.14
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/go-openapi/analysis v0.19.4
 | 
						github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect
 | 
				
			||||||
	github.com/go-openapi/errors v0.19.2
 | 
						github.com/go-openapi/analysis v0.19.10
 | 
				
			||||||
 | 
						github.com/go-openapi/errors v0.19.6
 | 
				
			||||||
	github.com/go-openapi/jsonpointer v0.19.3
 | 
						github.com/go-openapi/jsonpointer v0.19.3
 | 
				
			||||||
	github.com/go-openapi/loads v0.19.2
 | 
						github.com/go-openapi/loads v0.19.5
 | 
				
			||||||
	github.com/go-openapi/runtime v0.19.4
 | 
						github.com/go-openapi/runtime v0.19.15
 | 
				
			||||||
	github.com/go-openapi/spec v0.19.3
 | 
						github.com/go-openapi/spec v0.19.8
 | 
				
			||||||
	github.com/go-openapi/strfmt v0.19.2
 | 
						github.com/go-openapi/strfmt v0.19.5
 | 
				
			||||||
	github.com/go-openapi/swag v0.19.5
 | 
						github.com/go-openapi/swag v0.19.9
 | 
				
			||||||
	github.com/stretchr/testify v1.4.0
 | 
						github.com/mitchellh/mapstructure v1.3.2 // indirect
 | 
				
			||||||
	go.mongodb.org/mongo-driver v1.1.1 // indirect
 | 
						github.com/stretchr/testify v1.6.1
 | 
				
			||||||
	gopkg.in/yaml.v2 v2.2.2
 | 
						go.mongodb.org/mongo-driver v1.3.4 // indirect
 | 
				
			||||||
 | 
						golang.org/x/net v0.0.0-20200602114024-627f9648deb9 // indirect
 | 
				
			||||||
 | 
						gopkg.in/yaml.v2 v2.3.0
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
go 1.13
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,4 @@
 | 
				
			||||||
 | 
					github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 | 
				
			||||||
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=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
					github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
 | 
				
			||||||
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
					github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 | 
				
			||||||
| 
						 | 
					@ -6,130 +7,233 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
 | 
				
			||||||
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
					github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY=
 | 
				
			||||||
 | 
					github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
 | 
				
			||||||
 | 
					github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
				
			||||||
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/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
					github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
				
			||||||
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
					github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 | 
				
			||||||
github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 | 
					github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 | 
				
			||||||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is=
 | 
					 | 
				
			||||||
github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 | 
					github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
 | 
				
			||||||
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=
 | 
				
			||||||
github.com/go-openapi/analysis v0.19.2 h1:ophLETFestFZHk3ji7niPEL4d466QjW+0Tdg5VyDq7E=
 | 
					 | 
				
			||||||
github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
 | 
					github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
 | 
				
			||||||
github.com/go-openapi/analysis v0.19.4 h1:1TjOzrWkj+9BrjnM1yPAICbaoC0FyfD49oVkTBrSSa0=
 | 
					 | 
				
			||||||
github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
 | 
					github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
 | 
				
			||||||
 | 
					github.com/go-openapi/analysis v0.19.5 h1:8b2ZgKfKIUTVQpTb77MoRDIMEIwvDVw40o3aOXdfYzI=
 | 
				
			||||||
 | 
					github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU=
 | 
				
			||||||
 | 
					github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE=
 | 
				
			||||||
 | 
					github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ=
 | 
				
			||||||
github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
					github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
				
			||||||
github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
					github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
 | 
				
			||||||
github.com/go-openapi/errors v0.19.2 h1:a2kIyV3w+OS3S97zxUndRVD46+FhGOUBDFY7nmu4CsY=
 | 
					 | 
				
			||||||
github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
					github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys=
 | 
				
			||||||
 | 
					github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
					github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
					github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 | 
					github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
 | 
					github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w=
 | 
				
			||||||
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 | 
					github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
					github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
					github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w=
 | 
					 | 
				
			||||||
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
					github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o=
 | 
				
			||||||
 | 
					github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
 | 
				
			||||||
github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.0 h1:wCOBNscACI8L93tt5tvB2zOMkJ098XCw3fP0BY2ybDA=
 | 
					 | 
				
			||||||
github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
					github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
 | 
				
			||||||
github.com/go-openapi/loads v0.19.2 h1:rf5ArTHmIJxyV5Oiks+Su0mUens1+AjpkPoWr5xFRcI=
 | 
					 | 
				
			||||||
github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
 | 
					github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
 | 
				
			||||||
 | 
					github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI=
 | 
				
			||||||
 | 
					github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls=
 | 
				
			||||||
 | 
					github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY=
 | 
				
			||||||
github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
 | 
					github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
 | 
				
			||||||
github.com/go-openapi/runtime v0.19.0 h1:sU6pp4dSV2sGlNKKyHxZzi1m1kG4WnYtWcJ+HYbygjE=
 | 
					 | 
				
			||||||
github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
 | 
					github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
 | 
				
			||||||
github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI=
 | 
					github.com/go-openapi/runtime v0.19.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI=
 | 
				
			||||||
github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
 | 
					github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4=
 | 
				
			||||||
 | 
					github.com/go-openapi/runtime v0.19.15 h1:2GIefxs9Rx1vCDNghRtypRq+ig8KSLrjHbAYI/gCLCM=
 | 
				
			||||||
 | 
					github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo=
 | 
				
			||||||
github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
					github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
				
			||||||
github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
					github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE=
 | 
					 | 
				
			||||||
github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
 | 
					github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 | 
					github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc=
 | 
				
			||||||
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 | 
					github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg=
 | 
				
			||||||
 | 
					github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
					github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
					github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.0 h1:0Dn9qy1G9+UJfRU7TR8bmdGxb4uifB7HNrJjOnV0yPk=
 | 
					 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
 | 
					github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.2 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncCRnE=
 | 
					 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
					github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.3 h1:eRfyY5SkaNJCAwmmMcADjY31ow9+N7MCLW7oRkbsINA=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM=
 | 
				
			||||||
 | 
					github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
				
			||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE=
 | 
					 | 
				
			||||||
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
					github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY=
 | 
				
			||||||
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
					github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE=
 | 
				
			||||||
 | 
					github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY=
 | 
				
			||||||
github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
 | 
					github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
 | 
				
			||||||
github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
 | 
					github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
 | 
				
			||||||
 | 
					github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
					github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
 | 
				
			||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
					github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
				
			||||||
 | 
					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.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
 | 
				
			||||||
 | 
					github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
 | 
				
			||||||
 | 
					github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
 | 
				
			||||||
 | 
					github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
 | 
				
			||||||
 | 
					github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
 | 
				
			||||||
 | 
					github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 | 
				
			||||||
 | 
					github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
				
			||||||
 | 
					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 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
 | 
				
			||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
					github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
				
			||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
					github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
 | 
				
			||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
 | 
					github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
				
			||||||
 | 
					github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 | 
				
			||||||
 | 
					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/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
				
			||||||
 | 
					github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
 | 
					github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
				
			||||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 | 
					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.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 | 
				
			||||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
					github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 | 
				
			||||||
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 | 
					github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
 | 
				
			||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 | 
					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.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/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4=
 | 
					 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8=
 | 
					 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
 | 
					github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8=
 | 
				
			||||||
 | 
					github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
 | 
				
			||||||
 | 
					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/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
					github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
				
			||||||
 | 
					github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg=
 | 
				
			||||||
 | 
					github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
				
			||||||
 | 
					github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 | 
				
			||||||
 | 
					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/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
					github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
 | 
				
			||||||
 | 
					github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo=
 | 
				
			||||||
 | 
					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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
					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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
				
			||||||
 | 
					github.com/rogpeppe/go-internal v1.1.0/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/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 | 
				
			||||||
 | 
					github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
				
			||||||
 | 
					github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
					github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
				
			||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
					github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 | 
				
			||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
					github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
				
			||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 | 
					 | 
				
			||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
					github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
				
			||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
					github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 | 
				
			||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
					github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 | 
				
			||||||
 | 
					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/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=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.0.3 h1:GKoji1ld3tw2aC+GX1wbr/J2fX13yNacEYoJ8Nhr0yU=
 | 
					github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
 | 
				
			||||||
 | 
					github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs=
 | 
					 | 
				
			||||||
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
					go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.4 h1:zs/dKNwX0gYUtzwrN9lLiR15hCO0nDwQj5xXx+vjCdE=
 | 
				
			||||||
 | 
					go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
					golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 | 
				
			||||||
 | 
					golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
					golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
				
			||||||
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
					golang.org/x/net v0.0.0-20181005035420-146acd28ed58/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-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
					golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
 | 
				
			||||||
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
					golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/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-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20190412183630-56d357773e84/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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
					golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
				
			||||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 | 
					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/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
				
			||||||
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-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-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 | 
				
			||||||
 | 
					golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/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-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
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/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 | 
				
			||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
					gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v2 v2.2.2/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 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
 | 
				
			||||||
 | 
					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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo=
 | 
				
			||||||
 | 
					gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,8 +26,67 @@ import (
 | 
				
			||||||
	"github.com/go-openapi/spec"
 | 
						"github.com/go-openapi/spec"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const swaggerBody = "body"
 | 
					const (
 | 
				
			||||||
const objectType = "object"
 | 
						swaggerBody     = "body"
 | 
				
			||||||
 | 
						swaggerExample  = "example"
 | 
				
			||||||
 | 
						swaggerExamples = "examples"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						objectType  = "object"
 | 
				
			||||||
 | 
						arrayType   = "array"
 | 
				
			||||||
 | 
						stringType  = "string"
 | 
				
			||||||
 | 
						integerType = "integer"
 | 
				
			||||||
 | 
						numberType  = "number"
 | 
				
			||||||
 | 
						booleanType = "boolean"
 | 
				
			||||||
 | 
						fileType    = "file"
 | 
				
			||||||
 | 
						nullType    = "null"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						jsonProperties = "properties"
 | 
				
			||||||
 | 
						jsonItems      = "items"
 | 
				
			||||||
 | 
						jsonType       = "type"
 | 
				
			||||||
 | 
						//jsonSchema     = "schema"
 | 
				
			||||||
 | 
						jsonDefault = "default"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						stringFormatDate     = "date"
 | 
				
			||||||
 | 
						stringFormatDateTime = "date-time"
 | 
				
			||||||
 | 
						stringFormatPassword = "password"
 | 
				
			||||||
 | 
						stringFormatByte     = "byte"
 | 
				
			||||||
 | 
						//stringFormatBinary       = "binary"
 | 
				
			||||||
 | 
						stringFormatCreditCard   = "creditcard"
 | 
				
			||||||
 | 
						stringFormatDuration     = "duration"
 | 
				
			||||||
 | 
						stringFormatEmail        = "email"
 | 
				
			||||||
 | 
						stringFormatHexColor     = "hexcolor"
 | 
				
			||||||
 | 
						stringFormatHostname     = "hostname"
 | 
				
			||||||
 | 
						stringFormatIPv4         = "ipv4"
 | 
				
			||||||
 | 
						stringFormatIPv6         = "ipv6"
 | 
				
			||||||
 | 
						stringFormatISBN         = "isbn"
 | 
				
			||||||
 | 
						stringFormatISBN10       = "isbn10"
 | 
				
			||||||
 | 
						stringFormatISBN13       = "isbn13"
 | 
				
			||||||
 | 
						stringFormatMAC          = "mac"
 | 
				
			||||||
 | 
						stringFormatBSONObjectID = "bsonobjectid"
 | 
				
			||||||
 | 
						stringFormatRGBColor     = "rgbcolor"
 | 
				
			||||||
 | 
						stringFormatSSN          = "ssn"
 | 
				
			||||||
 | 
						stringFormatURI          = "uri"
 | 
				
			||||||
 | 
						stringFormatUUID         = "uuid"
 | 
				
			||||||
 | 
						stringFormatUUID3        = "uuid3"
 | 
				
			||||||
 | 
						stringFormatUUID4        = "uuid4"
 | 
				
			||||||
 | 
						stringFormatUUID5        = "uuid5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						integerFormatInt32  = "int32"
 | 
				
			||||||
 | 
						integerFormatInt64  = "int64"
 | 
				
			||||||
 | 
						integerFormatUInt32 = "uint32"
 | 
				
			||||||
 | 
						integerFormatUInt64 = "uint64"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						numberFormatFloat32 = "float32"
 | 
				
			||||||
 | 
						numberFormatFloat64 = "float64"
 | 
				
			||||||
 | 
						numberFormatFloat   = "float"
 | 
				
			||||||
 | 
						numberFormatDouble  = "double"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Helpers available at the package level
 | 
					// Helpers available at the package level
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
| 
						 | 
					@ -205,7 +264,8 @@ func (h *paramHelper) checkExpandedParam(pr *spec.Parameter, path, in, operation
 | 
				
			||||||
	res := new(Result)
 | 
						res := new(Result)
 | 
				
			||||||
	simpleZero := spec.SimpleSchema{}
 | 
						simpleZero := spec.SimpleSchema{}
 | 
				
			||||||
	// Try to explain why... best guess
 | 
						// Try to explain why... best guess
 | 
				
			||||||
	if pr.In == swaggerBody && (pr.SimpleSchema != simpleZero && pr.SimpleSchema.Type != objectType) {
 | 
						switch {
 | 
				
			||||||
 | 
						case pr.In == swaggerBody && (pr.SimpleSchema != simpleZero && pr.SimpleSchema.Type != objectType):
 | 
				
			||||||
		if isRef {
 | 
							if isRef {
 | 
				
			||||||
			// Most likely, a $ref with a sibling is an unwanted situation: in itself this is a warning...
 | 
								// Most likely, a $ref with a sibling is an unwanted situation: in itself this is a warning...
 | 
				
			||||||
			// but we detect it because of the following error:
 | 
								// but we detect it because of the following error:
 | 
				
			||||||
| 
						 | 
					@ -213,13 +273,12 @@ func (h *paramHelper) checkExpandedParam(pr *spec.Parameter, path, in, operation
 | 
				
			||||||
			res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation))
 | 
								res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		res.AddErrors(invalidParameterDefinitionMsg(path, in, operation))
 | 
							res.AddErrors(invalidParameterDefinitionMsg(path, in, operation))
 | 
				
			||||||
	} else if pr.In != swaggerBody && pr.Schema != nil {
 | 
						case pr.In != swaggerBody && pr.Schema != nil:
 | 
				
			||||||
		if isRef {
 | 
							if isRef {
 | 
				
			||||||
			res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation))
 | 
								res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		res.AddErrors(invalidParameterDefinitionAsSchemaMsg(path, in, operation))
 | 
							res.AddErrors(invalidParameterDefinitionAsSchemaMsg(path, in, operation))
 | 
				
			||||||
	} else if (pr.In == swaggerBody && pr.Schema == nil) ||
 | 
						case (pr.In == swaggerBody && pr.Schema == nil) || (pr.In != swaggerBody && pr.SimpleSchema == simpleZero):
 | 
				
			||||||
		(pr.In != swaggerBody && pr.SimpleSchema == simpleZero) { // Safeguard
 | 
					 | 
				
			||||||
		// Other unexpected mishaps
 | 
							// Other unexpected mishaps
 | 
				
			||||||
		res.AddErrors(invalidParameterDefinitionMsg(path, in, operation))
 | 
							res.AddErrors(invalidParameterDefinitionMsg(path, in, operation))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -254,8 +313,8 @@ func (r *responseHelper) responseMsgVariants(
 | 
				
			||||||
	responseType string,
 | 
						responseType string,
 | 
				
			||||||
	responseCode int) (responseName, responseCodeAsStr string) {
 | 
						responseCode int) (responseName, responseCodeAsStr string) {
 | 
				
			||||||
	// Path variants for messages
 | 
						// Path variants for messages
 | 
				
			||||||
	if responseType == "default" {
 | 
						if responseType == jsonDefault {
 | 
				
			||||||
		responseCodeAsStr = "default"
 | 
							responseCodeAsStr = jsonDefault
 | 
				
			||||||
		responseName = "default response"
 | 
							responseName = "default response"
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		responseCodeAsStr = strconv.Itoa(responseCode)
 | 
							responseCodeAsStr = strconv.Itoa(responseCode)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,40 +51,54 @@ func (o *objectValidator) Applies(source interface{}, kind reflect.Kind) bool {
 | 
				
			||||||
	return r
 | 
						return r
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *objectValidator) isPropertyName() bool {
 | 
					func (o *objectValidator) isProperties() bool {
 | 
				
			||||||
	p := strings.Split(o.Path, ".")
 | 
						p := strings.Split(o.Path, ".")
 | 
				
			||||||
	return p[len(p)-1] == "properties" && p[len(p)-2] != "properties"
 | 
						return len(p) > 1 && p[len(p)-1] == jsonProperties && p[len(p)-2] != jsonProperties
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o *objectValidator) isDefault() bool {
 | 
				
			||||||
 | 
						p := strings.Split(o.Path, ".")
 | 
				
			||||||
 | 
						return len(p) > 1 && p[len(p)-1] == jsonDefault && p[len(p)-2] != jsonDefault
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (o *objectValidator) isExample() bool {
 | 
				
			||||||
 | 
						p := strings.Split(o.Path, ".")
 | 
				
			||||||
 | 
						return len(p) > 1 && (p[len(p)-1] == swaggerExample || p[len(p)-1] == swaggerExamples) && p[len(p)-2] != swaggerExample
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *objectValidator) checkArrayMustHaveItems(res *Result, val map[string]interface{}) {
 | 
					func (o *objectValidator) checkArrayMustHaveItems(res *Result, val map[string]interface{}) {
 | 
				
			||||||
	if t, typeFound := val["type"]; typeFound {
 | 
						// for swagger 2.0 schemas, there is an additional constraint to have array items defined explicitly.
 | 
				
			||||||
		if tpe, ok := t.(string); ok && tpe == "array" {
 | 
						// with pure jsonschema draft 4, one may have arrays with undefined items (i.e. any type).
 | 
				
			||||||
			if _, itemsKeyFound := val["items"]; !itemsKeyFound {
 | 
						if t, typeFound := val[jsonType]; typeFound {
 | 
				
			||||||
				res.AddErrors(errors.Required("items", o.Path))
 | 
							if tpe, ok := t.(string); ok && tpe == arrayType {
 | 
				
			||||||
 | 
								if item, itemsKeyFound := val[jsonItems]; !itemsKeyFound {
 | 
				
			||||||
 | 
									res.AddErrors(errors.Required(jsonItems, o.Path, item))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *objectValidator) checkItemsMustBeTypeArray(res *Result, val map[string]interface{}) {
 | 
					func (o *objectValidator) checkItemsMustBeTypeArray(res *Result, val map[string]interface{}) {
 | 
				
			||||||
	if !o.isPropertyName() {
 | 
						if !o.isProperties() && !o.isDefault() && !o.isExample() {
 | 
				
			||||||
		if _, itemsKeyFound := val["items"]; itemsKeyFound {
 | 
							if _, itemsKeyFound := val[jsonItems]; itemsKeyFound {
 | 
				
			||||||
			t, typeFound := val["type"]
 | 
								t, typeFound := val[jsonType]
 | 
				
			||||||
			if typeFound {
 | 
								if typeFound {
 | 
				
			||||||
				if tpe, ok := t.(string); !ok || tpe != "array" {
 | 
									if tpe, ok := t.(string); !ok || tpe != arrayType {
 | 
				
			||||||
					res.AddErrors(errors.InvalidType(o.Path, o.In, "array", nil))
 | 
										res.AddErrors(errors.InvalidType(o.Path, o.In, arrayType, nil))
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				// there is no type
 | 
									// there is no type
 | 
				
			||||||
				res.AddErrors(errors.Required("type", o.Path))
 | 
									res.AddErrors(errors.Required(jsonType, o.Path, t))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (o *objectValidator) precheck(res *Result, val map[string]interface{}) {
 | 
					func (o *objectValidator) precheck(res *Result, val map[string]interface{}) {
 | 
				
			||||||
	o.checkArrayMustHaveItems(res, val)
 | 
						if o.Options.EnableArrayMustHaveItemsCheck {
 | 
				
			||||||
	if !o.Options.DisableObjectArrayTypeCheck {
 | 
							o.checkArrayMustHaveItems(res, val)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if o.Options.EnableObjectArrayTypeCheck {
 | 
				
			||||||
		o.checkItemsMustBeTypeArray(res, val)
 | 
							o.checkItemsMustBeTypeArray(res, val)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -134,21 +148,18 @@ func (o *objectValidator) Validate(data interface{}) *Result {
 | 
				
			||||||
				// NOTE: prefix your messages here by "IMPORTANT!" so there are not filtered
 | 
									// NOTE: prefix your messages here by "IMPORTANT!" so there are not filtered
 | 
				
			||||||
				// by higher level callers (the IMPORTANT! tag will be eventually
 | 
									// by higher level callers (the IMPORTANT! tag will be eventually
 | 
				
			||||||
				// removed).
 | 
									// removed).
 | 
				
			||||||
				switch k {
 | 
									if k == "headers" && val[k] != nil {
 | 
				
			||||||
				// $ref is forbidden in header
 | 
										// $ref is forbidden in header
 | 
				
			||||||
				case "headers":
 | 
										if headers, mapOk := val[k].(map[string]interface{}); mapOk {
 | 
				
			||||||
					if val[k] != nil {
 | 
											for headerKey, headerBody := range headers {
 | 
				
			||||||
						if headers, mapOk := val[k].(map[string]interface{}); mapOk {
 | 
												if headerBody != nil {
 | 
				
			||||||
							for headerKey, headerBody := range headers {
 | 
													if headerSchema, mapOfMapOk := headerBody.(map[string]interface{}); mapOfMapOk {
 | 
				
			||||||
								if headerBody != nil {
 | 
														if _, found := headerSchema["$ref"]; found {
 | 
				
			||||||
									if headerSchema, mapOfMapOk := headerBody.(map[string]interface{}); mapOfMapOk {
 | 
															var msg string
 | 
				
			||||||
										if _, found := headerSchema["$ref"]; found {
 | 
															if refString, stringOk := headerSchema["$ref"].(string); stringOk {
 | 
				
			||||||
											var msg string
 | 
																msg = strings.Join([]string{", one may not use $ref=\":", refString, "\""}, "")
 | 
				
			||||||
											if refString, stringOk := headerSchema["$ref"].(string); stringOk {
 | 
					 | 
				
			||||||
												msg = strings.Join([]string{", one may not use $ref=\":", refString, "\""}, "")
 | 
					 | 
				
			||||||
											}
 | 
					 | 
				
			||||||
											res.AddErrors(refNotAllowedInHeaderMsg(o.Path, headerKey, msg))
 | 
					 | 
				
			||||||
										}
 | 
															}
 | 
				
			||||||
 | 
															res.AddErrors(refNotAllowedInHeaderMsg(o.Path, headerKey, msg))
 | 
				
			||||||
									}
 | 
														}
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
| 
						 | 
					@ -216,8 +227,8 @@ func (o *objectValidator) Validate(data interface{}) *Result {
 | 
				
			||||||
	// Check required properties
 | 
						// Check required properties
 | 
				
			||||||
	if len(o.Required) > 0 {
 | 
						if len(o.Required) > 0 {
 | 
				
			||||||
		for _, k := range o.Required {
 | 
							for _, k := range o.Required {
 | 
				
			||||||
			if _, ok := val[k]; !ok && !createdFromDefaults[k] {
 | 
								if v, ok := val[k]; !ok && !createdFromDefaults[k] {
 | 
				
			||||||
				res.AddErrors(errors.Required(o.Path+"."+k, o.In))
 | 
									res.AddErrors(errors.Required(o.Path+"."+k, o.In, v))
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -132,6 +132,7 @@ func (r *Result) RootObjectSchemata() []*spec.Schema {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// FieldSchemata returns the schemata which apply to fields in objects.
 | 
					// FieldSchemata returns the schemata which apply to fields in objects.
 | 
				
			||||||
 | 
					// nolint: dupl
 | 
				
			||||||
func (r *Result) FieldSchemata() map[FieldKey][]*spec.Schema {
 | 
					func (r *Result) FieldSchemata() map[FieldKey][]*spec.Schema {
 | 
				
			||||||
	if r.cachedFieldSchemta != nil {
 | 
						if r.cachedFieldSchemta != nil {
 | 
				
			||||||
		return r.cachedFieldSchemta
 | 
							return r.cachedFieldSchemta
 | 
				
			||||||
| 
						 | 
					@ -151,6 +152,7 @@ func (r *Result) FieldSchemata() map[FieldKey][]*spec.Schema {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ItemSchemata returns the schemata which apply to items in slices.
 | 
					// ItemSchemata returns the schemata which apply to items in slices.
 | 
				
			||||||
 | 
					// nolint: dupl
 | 
				
			||||||
func (r *Result) ItemSchemata() map[ItemKey][]*spec.Schema {
 | 
					func (r *Result) ItemSchemata() map[ItemKey][]*spec.Schema {
 | 
				
			||||||
	if r.cachedItemSchemata != nil {
 | 
						if r.cachedItemSchemata != nil {
 | 
				
			||||||
		return r.cachedItemSchemata
 | 
							return r.cachedItemSchemata
 | 
				
			||||||
| 
						 | 
					@ -175,6 +177,7 @@ func (r *Result) resetCaches() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// mergeForField merges other into r, assigning other's root schemata to the given Object and field name.
 | 
					// mergeForField merges other into r, assigning other's root schemata to the given Object and field name.
 | 
				
			||||||
 | 
					// nolint: unparam
 | 
				
			||||||
func (r *Result) mergeForField(obj map[string]interface{}, field string, other *Result) *Result {
 | 
					func (r *Result) mergeForField(obj map[string]interface{}, field string, other *Result) *Result {
 | 
				
			||||||
	if other == nil {
 | 
						if other == nil {
 | 
				
			||||||
		return r
 | 
							return r
 | 
				
			||||||
| 
						 | 
					@ -196,6 +199,7 @@ func (r *Result) mergeForField(obj map[string]interface{}, field string, other *
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// mergeForSlice merges other into r, assigning other's root schemata to the given slice and index.
 | 
					// mergeForSlice merges other into r, assigning other's root schemata to the given slice and index.
 | 
				
			||||||
 | 
					// nolint: unparam
 | 
				
			||||||
func (r *Result) mergeForSlice(slice reflect.Value, i int, other *Result) *Result {
 | 
					func (r *Result) mergeForSlice(slice reflect.Value, i int, other *Result) *Result {
 | 
				
			||||||
	if other == nil {
 | 
						if other == nil {
 | 
				
			||||||
		return r
 | 
							return r
 | 
				
			||||||
| 
						 | 
					@ -231,6 +235,7 @@ func (r *Result) addPropertySchemata(obj map[string]interface{}, fld string, sch
 | 
				
			||||||
	r.fieldSchemata = append(r.fieldSchemata, fieldSchemata{obj: obj, field: fld, schemata: schemata{one: schema}})
 | 
						r.fieldSchemata = append(r.fieldSchemata, fieldSchemata{obj: obj, field: fld, schemata: schemata{one: schema}})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
// addSliceSchemata adds the given schemata for the slice and index.
 | 
					// addSliceSchemata adds the given schemata for the slice and index.
 | 
				
			||||||
// The slice schemata might be reused. I.e. do not modify it after being added to a result.
 | 
					// The slice schemata might be reused. I.e. do not modify it after being added to a result.
 | 
				
			||||||
func (r *Result) addSliceSchemata(slice reflect.Value, i int, schema *spec.Schema) {
 | 
					func (r *Result) addSliceSchemata(slice reflect.Value, i int, schema *spec.Schema) {
 | 
				
			||||||
| 
						 | 
					@ -239,6 +244,7 @@ func (r *Result) addSliceSchemata(slice reflect.Value, i int, schema *spec.Schem
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	r.itemSchemata = append(r.itemSchemata, itemSchemata{slice: slice, index: i, schemata: schemata{one: schema}})
 | 
						r.itemSchemata = append(r.itemSchemata, itemSchemata{slice: slice, index: i, schemata: schemata{one: schema}})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// mergeWithoutRootSchemata merges other into r, ignoring the rootObject schemata.
 | 
					// mergeWithoutRootSchemata merges other into r, ignoring the rootObject schemata.
 | 
				
			||||||
func (r *Result) mergeWithoutRootSchemata(other *Result) {
 | 
					func (r *Result) mergeWithoutRootSchemata(other *Result) {
 | 
				
			||||||
| 
						 | 
					@ -251,9 +257,7 @@ func (r *Result) mergeWithoutRootSchemata(other *Result) {
 | 
				
			||||||
		if r.fieldSchemata == nil {
 | 
							if r.fieldSchemata == nil {
 | 
				
			||||||
			r.fieldSchemata = other.fieldSchemata
 | 
								r.fieldSchemata = other.fieldSchemata
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			for _, x := range other.fieldSchemata {
 | 
								r.fieldSchemata = append(r.fieldSchemata, other.fieldSchemata...)
 | 
				
			||||||
				r.fieldSchemata = append(r.fieldSchemata, x)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -261,9 +265,7 @@ func (r *Result) mergeWithoutRootSchemata(other *Result) {
 | 
				
			||||||
		if r.itemSchemata == nil {
 | 
							if r.itemSchemata == nil {
 | 
				
			||||||
			r.itemSchemata = other.itemSchemata
 | 
								r.itemSchemata = other.itemSchemata
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			for _, x := range other.itemSchemata {
 | 
								r.itemSchemata = append(r.itemSchemata, other.itemSchemata...)
 | 
				
			||||||
				r.itemSchemata = append(r.itemSchemata, x)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,8 +27,8 @@ import (
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	specSchemaType    = reflect.TypeOf(&spec.Schema{})
 | 
						specSchemaType    = reflect.TypeOf(&spec.Schema{})
 | 
				
			||||||
	specParameterType = reflect.TypeOf(&spec.Parameter{})
 | 
						specParameterType = reflect.TypeOf(&spec.Parameter{})
 | 
				
			||||||
	specItemsType     = reflect.TypeOf(&spec.Items{})
 | 
					 | 
				
			||||||
	specHeaderType    = reflect.TypeOf(&spec.Header{})
 | 
						specHeaderType    = reflect.TypeOf(&spec.Header{})
 | 
				
			||||||
 | 
						//specItemsType     = reflect.TypeOf(&spec.Items{})
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SchemaValidator validates data against a JSON schema
 | 
					// SchemaValidator validates data against a JSON schema
 | 
				
			||||||
| 
						 | 
					@ -39,14 +39,14 @@ type SchemaValidator struct {
 | 
				
			||||||
	validators   []valueValidator
 | 
						validators   []valueValidator
 | 
				
			||||||
	Root         interface{}
 | 
						Root         interface{}
 | 
				
			||||||
	KnownFormats strfmt.Registry
 | 
						KnownFormats strfmt.Registry
 | 
				
			||||||
	Options      *SchemaValidatorOptions
 | 
						Options      SchemaValidatorOptions
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AgainstSchema validates the specified data against the provided schema, using a registry of supported formats.
 | 
					// AgainstSchema validates the specified data against the provided schema, using a registry of supported formats.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// When no pre-parsed *spec.Schema structure is provided, it uses a JSON schema as default. See example.
 | 
					// When no pre-parsed *spec.Schema structure is provided, it uses a JSON schema as default. See example.
 | 
				
			||||||
func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registry) error {
 | 
					func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registry, options ...Option) error {
 | 
				
			||||||
	res := NewSchemaValidator(schema, nil, "", formats).Validate(data)
 | 
						res := NewSchemaValidator(schema, nil, "", formats, options...).Validate(data)
 | 
				
			||||||
	if res.HasErrors() {
 | 
						if res.HasErrors() {
 | 
				
			||||||
		return errors.CompositeValidationError(res.Errors...)
 | 
							return errors.CompositeValidationError(res.Errors...)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -72,9 +72,15 @@ func NewSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string
 | 
				
			||||||
			panic(msg)
 | 
								panic(msg)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	s := SchemaValidator{Path: root, in: "body", Schema: schema, Root: rootSchema, KnownFormats: formats, Options: &SchemaValidatorOptions{}}
 | 
						s := SchemaValidator{
 | 
				
			||||||
 | 
							Path:         root,
 | 
				
			||||||
 | 
							in:           "body",
 | 
				
			||||||
 | 
							Schema:       schema,
 | 
				
			||||||
 | 
							Root:         rootSchema,
 | 
				
			||||||
 | 
							KnownFormats: formats,
 | 
				
			||||||
 | 
							Options:      SchemaValidatorOptions{}}
 | 
				
			||||||
	for _, o := range options {
 | 
						for _, o := range options {
 | 
				
			||||||
		o(s.Options)
 | 
							o(&s.Options)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	s.validators = []valueValidator{
 | 
						s.validators = []valueValidator{
 | 
				
			||||||
		s.typeValidator(),
 | 
							s.typeValidator(),
 | 
				
			||||||
| 
						 | 
					@ -134,9 +140,9 @@ func (s *SchemaValidator) Validate(data interface{}) *Result {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// TODO: this part should be handed over to type validator
 | 
						// TODO: this part should be handed over to type validator
 | 
				
			||||||
	// Handle special case of json.Number data (number marshalled as string)
 | 
						// Handle special case of json.Number data (number marshalled as string)
 | 
				
			||||||
	isnumber := s.Schema.Type.Contains("number") || s.Schema.Type.Contains("integer")
 | 
						isnumber := s.Schema.Type.Contains(numberType) || s.Schema.Type.Contains(integerType)
 | 
				
			||||||
	if num, ok := data.(json.Number); ok && isnumber {
 | 
						if num, ok := data.(json.Number); ok && isnumber {
 | 
				
			||||||
		if s.Schema.Type.Contains("integer") { // avoid lossy conversion
 | 
							if s.Schema.Type.Contains(integerType) { // avoid lossy conversion
 | 
				
			||||||
			in, erri := num.Int64()
 | 
								in, erri := num.Int64()
 | 
				
			||||||
			if erri != nil {
 | 
								if erri != nil {
 | 
				
			||||||
				result.AddErrors(invalidTypeConversionMsg(s.Path, erri))
 | 
									result.AddErrors(invalidTypeConversionMsg(s.Path, erri))
 | 
				
			||||||
| 
						 | 
					@ -196,6 +202,7 @@ func (s *SchemaValidator) sliceValidator() valueValidator {
 | 
				
			||||||
		Items:           s.Schema.Items,
 | 
							Items:           s.Schema.Items,
 | 
				
			||||||
		Root:            s.Root,
 | 
							Root:            s.Root,
 | 
				
			||||||
		KnownFormats:    s.KnownFormats,
 | 
							KnownFormats:    s.KnownFormats,
 | 
				
			||||||
 | 
							Options:         s.Options,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,6 +255,6 @@ func (s *SchemaValidator) objectValidator() valueValidator {
 | 
				
			||||||
		PatternProperties:    s.Schema.PatternProperties,
 | 
							PatternProperties:    s.Schema.PatternProperties,
 | 
				
			||||||
		Root:                 s.Root,
 | 
							Root:                 s.Root,
 | 
				
			||||||
		KnownFormats:         s.KnownFormats,
 | 
							KnownFormats:         s.KnownFormats,
 | 
				
			||||||
		Options:              *s.Options,
 | 
							Options:              s.Options,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,20 +14,41 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
package validate
 | 
					package validate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SchemaValidatorOptions defines optional rules for schema validation
 | 
				
			||||||
type SchemaValidatorOptions struct {
 | 
					type SchemaValidatorOptions struct {
 | 
				
			||||||
	DisableObjectArrayTypeCheck bool
 | 
						EnableObjectArrayTypeCheck    bool
 | 
				
			||||||
 | 
						EnableArrayMustHaveItemsCheck bool
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Option sets optional rules for schema validation
 | 
				
			||||||
type Option func(*SchemaValidatorOptions)
 | 
					type Option func(*SchemaValidatorOptions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DisableObjectArrayTypeCheck(disable bool) Option {
 | 
					// EnableObjectArrayTypeCheck activates the swagger rule: an items must be in type: array
 | 
				
			||||||
 | 
					func EnableObjectArrayTypeCheck(enable bool) Option {
 | 
				
			||||||
	return func(svo *SchemaValidatorOptions) {
 | 
						return func(svo *SchemaValidatorOptions) {
 | 
				
			||||||
		svo.DisableObjectArrayTypeCheck = disable
 | 
							svo.EnableObjectArrayTypeCheck = enable
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (svo SchemaValidatorOptions) Options() []Option {
 | 
					// EnableArrayMustHaveItemsCheck activates the swagger rule: an array must have items defined
 | 
				
			||||||
	return []Option{
 | 
					func EnableArrayMustHaveItemsCheck(enable bool) Option {
 | 
				
			||||||
		DisableObjectArrayTypeCheck(svo.DisableObjectArrayTypeCheck),
 | 
						return func(svo *SchemaValidatorOptions) {
 | 
				
			||||||
 | 
							svo.EnableArrayMustHaveItemsCheck = enable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SwaggerSchema activates swagger schema validation rules
 | 
				
			||||||
 | 
					func SwaggerSchema(enable bool) Option {
 | 
				
			||||||
 | 
						return func(svo *SchemaValidatorOptions) {
 | 
				
			||||||
 | 
							svo.EnableObjectArrayTypeCheck = enable
 | 
				
			||||||
 | 
							svo.EnableArrayMustHaveItemsCheck = enable
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Options returns current options
 | 
				
			||||||
 | 
					func (svo SchemaValidatorOptions) Options() []Option {
 | 
				
			||||||
 | 
						return []Option{
 | 
				
			||||||
 | 
							EnableObjectArrayTypeCheck(svo.EnableObjectArrayTypeCheck),
 | 
				
			||||||
 | 
							EnableArrayMustHaveItemsCheck(svo.EnableArrayMustHaveItemsCheck),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,7 @@ type schemaSliceValidator struct {
 | 
				
			||||||
	Items           *spec.SchemaOrArray
 | 
						Items           *spec.SchemaOrArray
 | 
				
			||||||
	Root            interface{}
 | 
						Root            interface{}
 | 
				
			||||||
	KnownFormats    strfmt.Registry
 | 
						KnownFormats    strfmt.Registry
 | 
				
			||||||
 | 
						Options         SchemaValidatorOptions
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *schemaSliceValidator) SetPath(path string) {
 | 
					func (s *schemaSliceValidator) SetPath(path string) {
 | 
				
			||||||
| 
						 | 
					@ -53,7 +54,7 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result {
 | 
				
			||||||
	size := val.Len()
 | 
						size := val.Len()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if s.Items != nil && s.Items.Schema != nil {
 | 
						if s.Items != nil && s.Items.Schema != nil {
 | 
				
			||||||
		validator := NewSchemaValidator(s.Items.Schema, s.Root, s.Path, s.KnownFormats)
 | 
							validator := NewSchemaValidator(s.Items.Schema, s.Root, s.Path, s.KnownFormats, s.Options.Options()...)
 | 
				
			||||||
		for i := 0; i < size; i++ {
 | 
							for i := 0; i < size; i++ {
 | 
				
			||||||
			validator.SetPath(fmt.Sprintf("%s.%d", s.Path, i))
 | 
								validator.SetPath(fmt.Sprintf("%s.%d", s.Path, i))
 | 
				
			||||||
			value := val.Index(i)
 | 
								value := val.Index(i)
 | 
				
			||||||
| 
						 | 
					@ -65,11 +66,11 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result {
 | 
				
			||||||
	if s.Items != nil && len(s.Items.Schemas) > 0 {
 | 
						if s.Items != nil && len(s.Items.Schemas) > 0 {
 | 
				
			||||||
		itemsSize = len(s.Items.Schemas)
 | 
							itemsSize = len(s.Items.Schemas)
 | 
				
			||||||
		for i := 0; i < itemsSize; i++ {
 | 
							for i := 0; i < itemsSize; i++ {
 | 
				
			||||||
			validator := NewSchemaValidator(&s.Items.Schemas[i], s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats)
 | 
								validator := NewSchemaValidator(&s.Items.Schemas[i], s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats, s.Options.Options()...)
 | 
				
			||||||
			if val.Len() <= i {
 | 
								if val.Len() <= i {
 | 
				
			||||||
				break
 | 
									break
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			result.mergeForSlice(val, int(i), validator.Validate(val.Index(i).Interface()))
 | 
								result.mergeForSlice(val, i, validator.Validate(val.Index(i).Interface()))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if s.AdditionalItems != nil && itemsSize < size {
 | 
						if s.AdditionalItems != nil && itemsSize < size {
 | 
				
			||||||
| 
						 | 
					@ -78,8 +79,8 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if s.AdditionalItems.Schema != nil {
 | 
							if s.AdditionalItems.Schema != nil {
 | 
				
			||||||
			for i := itemsSize; i < size-itemsSize+1; i++ {
 | 
								for i := itemsSize; i < size-itemsSize+1; i++ {
 | 
				
			||||||
				validator := NewSchemaValidator(s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats)
 | 
									validator := NewSchemaValidator(s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats, s.Options.Options()...)
 | 
				
			||||||
				result.mergeForSlice(val, int(i), validator.Validate(val.Index(int(i)).Interface()))
 | 
									result.mergeForSlice(val, i, validator.Validate(val.Index(i).Interface()))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,25 +71,22 @@ func NewSpecValidator(schema *spec.Schema, formats strfmt.Registry) *SpecValidat
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Validate validates the swagger spec
 | 
					// Validate validates the swagger spec
 | 
				
			||||||
func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Result) {
 | 
					func (s *SpecValidator) Validate(data interface{}) (*Result, *Result) {
 | 
				
			||||||
	var sd *loads.Document
 | 
						var sd *loads.Document
 | 
				
			||||||
	errs = new(Result)
 | 
						errs, warnings := new(Result), new(Result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch v := data.(type) {
 | 
						if v, ok := data.(*loads.Document); ok {
 | 
				
			||||||
	case *loads.Document:
 | 
					 | 
				
			||||||
		sd = v
 | 
							sd = v
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if sd == nil {
 | 
						if sd == nil {
 | 
				
			||||||
		errs.AddErrors(invalidDocumentMsg())
 | 
							errs.AddErrors(invalidDocumentMsg())
 | 
				
			||||||
		return
 | 
							return errs, warnings // no point in continuing
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	s.spec = sd
 | 
						s.spec = sd
 | 
				
			||||||
	s.analyzer = analysis.New(sd.Spec())
 | 
						s.analyzer = analysis.New(sd.Spec())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	warnings = new(Result)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Swagger schema validator
 | 
						// Swagger schema validator
 | 
				
			||||||
	schv := NewSchemaValidator(s.schema, nil, "", s.KnownFormats)
 | 
						schv := NewSchemaValidator(s.schema, nil, "", s.KnownFormats, SwaggerSchema(true))
 | 
				
			||||||
	var obj interface{}
 | 
						var obj interface{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Raw spec unmarshalling errors
 | 
						// Raw spec unmarshalling errors
 | 
				
			||||||
| 
						 | 
					@ -109,13 +106,13 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu
 | 
				
			||||||
	errs.Merge(schv.Validate(obj)) // error -
 | 
						errs.Merge(schv.Validate(obj)) // error -
 | 
				
			||||||
	// There may be a point in continuing to try and determine more accurate errors
 | 
						// There may be a point in continuing to try and determine more accurate errors
 | 
				
			||||||
	if !s.Options.ContinueOnErrors && errs.HasErrors() {
 | 
						if !s.Options.ContinueOnErrors && errs.HasErrors() {
 | 
				
			||||||
		return // no point in continuing
 | 
							return errs, warnings // no point in continuing
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	errs.Merge(s.validateReferencesValid()) // error -
 | 
						errs.Merge(s.validateReferencesValid()) // error -
 | 
				
			||||||
	// There may be a point in continuing to try and determine more accurate errors
 | 
						// There may be a point in continuing to try and determine more accurate errors
 | 
				
			||||||
	if !s.Options.ContinueOnErrors && errs.HasErrors() {
 | 
						if !s.Options.ContinueOnErrors && errs.HasErrors() {
 | 
				
			||||||
		return // no point in continuing
 | 
							return errs, warnings // no point in continuing
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	errs.Merge(s.validateDuplicateOperationIDs())
 | 
						errs.Merge(s.validateDuplicateOperationIDs())
 | 
				
			||||||
| 
						 | 
					@ -129,7 +126,7 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// There may be a point in continuing to try and determine more accurate errors
 | 
						// There may be a point in continuing to try and determine more accurate errors
 | 
				
			||||||
	if !s.Options.ContinueOnErrors && errs.HasErrors() {
 | 
						if !s.Options.ContinueOnErrors && errs.HasErrors() {
 | 
				
			||||||
		return // no point in continuing
 | 
							return errs, warnings // no point in continuing
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Values provided as default MUST validate their schema
 | 
						// Values provided as default MUST validate their schema
 | 
				
			||||||
| 
						 | 
					@ -147,7 +144,7 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu
 | 
				
			||||||
	//errs.Merge(s.validateRefNoSibling()) // warning only
 | 
						//errs.Merge(s.validateRefNoSibling()) // warning only
 | 
				
			||||||
	errs.Merge(s.validateReferenced()) // warning only
 | 
						errs.Merge(s.validateReferenced()) // warning only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return
 | 
						return errs, warnings
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *SpecValidator) validateNonEmptyPathParamNames() *Result {
 | 
					func (s *SpecValidator) validateNonEmptyPathParamNames() *Result {
 | 
				
			||||||
| 
						 | 
					@ -172,9 +169,17 @@ func (s *SpecValidator) validateNonEmptyPathParamNames() *Result {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *SpecValidator) validateDuplicateOperationIDs() *Result {
 | 
					func (s *SpecValidator) validateDuplicateOperationIDs() *Result {
 | 
				
			||||||
	// OperationID, if specified, must be unique across the board
 | 
						// OperationID, if specified, must be unique across the board
 | 
				
			||||||
 | 
						var analyzer *analysis.Spec
 | 
				
			||||||
 | 
						if s.expanded != nil {
 | 
				
			||||||
 | 
							// $ref are valid: we can analyze operations on an expanded spec
 | 
				
			||||||
 | 
							analyzer = analysis.New(s.expanded.Spec())
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							// fallback on possible incomplete picture because of previous errors
 | 
				
			||||||
 | 
							analyzer = s.analyzer
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	res := new(Result)
 | 
						res := new(Result)
 | 
				
			||||||
	known := make(map[string]int)
 | 
						known := make(map[string]int)
 | 
				
			||||||
	for _, v := range s.analyzer.OperationIDs() {
 | 
						for _, v := range analyzer.OperationIDs() {
 | 
				
			||||||
		if v != "" {
 | 
							if v != "" {
 | 
				
			||||||
			known[v]++
 | 
								known[v]++
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -336,14 +341,14 @@ func (s *SpecValidator) validateItems() *Result {
 | 
				
			||||||
		for path, op := range pi {
 | 
							for path, op := range pi {
 | 
				
			||||||
			for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) {
 | 
								for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				if param.TypeName() == "array" && param.ItemsTypeName() == "" {
 | 
									if param.TypeName() == arrayType && param.ItemsTypeName() == "" {
 | 
				
			||||||
					res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID))
 | 
										res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID))
 | 
				
			||||||
					continue
 | 
										continue
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if param.In != "body" {
 | 
									if param.In != swaggerBody {
 | 
				
			||||||
					if param.Items != nil {
 | 
										if param.Items != nil {
 | 
				
			||||||
						items := param.Items
 | 
											items := param.Items
 | 
				
			||||||
						for items.TypeName() == "array" {
 | 
											for items.TypeName() == arrayType {
 | 
				
			||||||
							if items.ItemsTypeName() == "" {
 | 
												if items.ItemsTypeName() == "" {
 | 
				
			||||||
								res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID))
 | 
													res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID))
 | 
				
			||||||
								break
 | 
													break
 | 
				
			||||||
| 
						 | 
					@ -374,7 +379,7 @@ func (s *SpecValidator) validateItems() *Result {
 | 
				
			||||||
			for _, resp := range responses {
 | 
								for _, resp := range responses {
 | 
				
			||||||
				// Response headers with array
 | 
									// Response headers with array
 | 
				
			||||||
				for hn, hv := range resp.Headers {
 | 
									for hn, hv := range resp.Headers {
 | 
				
			||||||
					if hv.TypeName() == "array" && hv.ItemsTypeName() == "" {
 | 
										if hv.TypeName() == arrayType && hv.ItemsTypeName() == "" {
 | 
				
			||||||
						res.AddErrors(arrayInHeaderRequiresItemsMsg(hn, op.ID))
 | 
											res.AddErrors(arrayInHeaderRequiresItemsMsg(hn, op.ID))
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					@ -390,7 +395,7 @@ func (s *SpecValidator) validateItems() *Result {
 | 
				
			||||||
// Verifies constraints on array type
 | 
					// Verifies constraints on array type
 | 
				
			||||||
func (s *SpecValidator) validateSchemaItems(schema spec.Schema, prefix, opID string) *Result {
 | 
					func (s *SpecValidator) validateSchemaItems(schema spec.Schema, prefix, opID string) *Result {
 | 
				
			||||||
	res := new(Result)
 | 
						res := new(Result)
 | 
				
			||||||
	if !schema.Type.Contains("array") {
 | 
						if !schema.Type.Contains(arrayType) {
 | 
				
			||||||
		return res
 | 
							return res
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -451,6 +456,7 @@ func (s *SpecValidator) validateReferenced() *Result {
 | 
				
			||||||
	return &res
 | 
						return &res
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// nolint: dupl
 | 
				
			||||||
func (s *SpecValidator) validateReferencedParameters() *Result {
 | 
					func (s *SpecValidator) validateReferencedParameters() *Result {
 | 
				
			||||||
	// Each referenceable definition should have references.
 | 
						// Each referenceable definition should have references.
 | 
				
			||||||
	params := s.spec.Spec().Parameters
 | 
						params := s.spec.Spec().Parameters
 | 
				
			||||||
| 
						 | 
					@ -463,9 +469,7 @@ func (s *SpecValidator) validateReferencedParameters() *Result {
 | 
				
			||||||
		expected["#/parameters/"+jsonpointer.Escape(k)] = struct{}{}
 | 
							expected["#/parameters/"+jsonpointer.Escape(k)] = struct{}{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, k := range s.analyzer.AllParameterReferences() {
 | 
						for _, k := range s.analyzer.AllParameterReferences() {
 | 
				
			||||||
		if _, ok := expected[k]; ok {
 | 
							delete(expected, k)
 | 
				
			||||||
			delete(expected, k)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(expected) == 0 {
 | 
						if len(expected) == 0 {
 | 
				
			||||||
| 
						 | 
					@ -478,6 +482,7 @@ func (s *SpecValidator) validateReferencedParameters() *Result {
 | 
				
			||||||
	return result
 | 
						return result
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// nolint: dupl
 | 
				
			||||||
func (s *SpecValidator) validateReferencedResponses() *Result {
 | 
					func (s *SpecValidator) validateReferencedResponses() *Result {
 | 
				
			||||||
	// Each referenceable definition should have references.
 | 
						// Each referenceable definition should have references.
 | 
				
			||||||
	responses := s.spec.Spec().Responses
 | 
						responses := s.spec.Spec().Responses
 | 
				
			||||||
| 
						 | 
					@ -490,9 +495,7 @@ func (s *SpecValidator) validateReferencedResponses() *Result {
 | 
				
			||||||
		expected["#/responses/"+jsonpointer.Escape(k)] = struct{}{}
 | 
							expected["#/responses/"+jsonpointer.Escape(k)] = struct{}{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, k := range s.analyzer.AllResponseReferences() {
 | 
						for _, k := range s.analyzer.AllResponseReferences() {
 | 
				
			||||||
		if _, ok := expected[k]; ok {
 | 
							delete(expected, k)
 | 
				
			||||||
			delete(expected, k)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(expected) == 0 {
 | 
						if len(expected) == 0 {
 | 
				
			||||||
| 
						 | 
					@ -505,6 +508,7 @@ func (s *SpecValidator) validateReferencedResponses() *Result {
 | 
				
			||||||
	return result
 | 
						return result
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// nolint: dupl
 | 
				
			||||||
func (s *SpecValidator) validateReferencedDefinitions() *Result {
 | 
					func (s *SpecValidator) validateReferencedDefinitions() *Result {
 | 
				
			||||||
	// Each referenceable definition must have references.
 | 
						// Each referenceable definition must have references.
 | 
				
			||||||
	defs := s.spec.Spec().Definitions
 | 
						defs := s.spec.Spec().Definitions
 | 
				
			||||||
| 
						 | 
					@ -517,9 +521,7 @@ func (s *SpecValidator) validateReferencedDefinitions() *Result {
 | 
				
			||||||
		expected["#/definitions/"+jsonpointer.Escape(k)] = struct{}{}
 | 
							expected["#/definitions/"+jsonpointer.Escape(k)] = struct{}{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, k := range s.analyzer.AllDefinitionReferences() {
 | 
						for _, k := range s.analyzer.AllDefinitionReferences() {
 | 
				
			||||||
		if _, ok := expected[k]; ok {
 | 
							delete(expected, k)
 | 
				
			||||||
			delete(expected, k)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(expected) == 0 {
 | 
						if len(expected) == 0 {
 | 
				
			||||||
| 
						 | 
					@ -624,98 +626,114 @@ func (s *SpecValidator) validateParameters() *Result {
 | 
				
			||||||
	rexGarbledPathSegment := mustCompileRegexp(`.*[{}\s]+.*`)
 | 
						rexGarbledPathSegment := mustCompileRegexp(`.*[{}\s]+.*`)
 | 
				
			||||||
	for method, pi := range s.analyzer.Operations() {
 | 
						for method, pi := range s.analyzer.Operations() {
 | 
				
			||||||
		methodPaths := make(map[string]map[string]string)
 | 
							methodPaths := make(map[string]map[string]string)
 | 
				
			||||||
		if pi != nil { // Safeguard
 | 
							for path, op := range pi {
 | 
				
			||||||
			for path, op := range pi {
 | 
								pathToAdd := pathHelp.stripParametersInPath(path)
 | 
				
			||||||
				pathToAdd := pathHelp.stripParametersInPath(path)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// Warn on garbled path afer param stripping
 | 
								// Warn on garbled path afer param stripping
 | 
				
			||||||
				if rexGarbledPathSegment.MatchString(pathToAdd) {
 | 
								if rexGarbledPathSegment.MatchString(pathToAdd) {
 | 
				
			||||||
					res.AddWarnings(pathStrippedParamGarbledMsg(pathToAdd))
 | 
									res.AddWarnings(pathStrippedParamGarbledMsg(pathToAdd))
 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// Check uniqueness of stripped paths
 | 
					 | 
				
			||||||
				if _, found := methodPaths[method][pathToAdd]; found {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					// Sort names for stable, testable output
 | 
					 | 
				
			||||||
					if strings.Compare(path, methodPaths[method][pathToAdd]) < 0 {
 | 
					 | 
				
			||||||
						res.AddErrors(pathOverlapMsg(path, methodPaths[method][pathToAdd]))
 | 
					 | 
				
			||||||
					} else {
 | 
					 | 
				
			||||||
						res.AddErrors(pathOverlapMsg(methodPaths[method][pathToAdd], path))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					if _, found := methodPaths[method]; !found {
 | 
					 | 
				
			||||||
						methodPaths[method] = map[string]string{}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
					methodPaths[method][pathToAdd] = path //Original non stripped path
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				var bodyParams []string
 | 
					 | 
				
			||||||
				var paramNames []string
 | 
					 | 
				
			||||||
				var hasForm, hasBody bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// Check parameters names uniqueness for operation
 | 
					 | 
				
			||||||
				// TODO: should be done after param expansion
 | 
					 | 
				
			||||||
				res.Merge(s.checkUniqueParams(path, method, op))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				for _, pr := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) {
 | 
					 | 
				
			||||||
					// Validate pattern regexp for parameters with a Pattern property
 | 
					 | 
				
			||||||
					if _, err := compileRegexp(pr.Pattern); err != nil {
 | 
					 | 
				
			||||||
						res.AddErrors(invalidPatternInParamMsg(op.ID, pr.Name, pr.Pattern))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					// There must be at most one parameter in body: list them all
 | 
					 | 
				
			||||||
					if pr.In == "body" {
 | 
					 | 
				
			||||||
						bodyParams = append(bodyParams, fmt.Sprintf("%q", pr.Name))
 | 
					 | 
				
			||||||
						hasBody = true
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if pr.In == "path" {
 | 
					 | 
				
			||||||
						paramNames = append(paramNames, pr.Name)
 | 
					 | 
				
			||||||
						// Path declared in path must have the required: true property
 | 
					 | 
				
			||||||
						if !pr.Required {
 | 
					 | 
				
			||||||
							res.AddErrors(pathParamRequiredMsg(op.ID, pr.Name))
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
					if pr.In == "formData" {
 | 
					 | 
				
			||||||
						hasForm = true
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// In:formData and In:body are mutually exclusive
 | 
					 | 
				
			||||||
				if hasBody && hasForm {
 | 
					 | 
				
			||||||
					res.AddErrors(bothFormDataAndBodyMsg(op.ID))
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				// There must be at most one body param
 | 
					 | 
				
			||||||
				// Accurately report situations when more than 1 body param is declared (possibly unnamed)
 | 
					 | 
				
			||||||
				if len(bodyParams) > 1 {
 | 
					 | 
				
			||||||
					sort.Strings(bodyParams)
 | 
					 | 
				
			||||||
					res.AddErrors(multipleBodyParamMsg(op.ID, bodyParams))
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// Check uniqueness of parameters in path
 | 
					 | 
				
			||||||
				paramsInPath := pathHelp.extractPathParams(path)
 | 
					 | 
				
			||||||
				for i, p := range paramsInPath {
 | 
					 | 
				
			||||||
					for j, q := range paramsInPath {
 | 
					 | 
				
			||||||
						if p == q && i > j {
 | 
					 | 
				
			||||||
							res.AddErrors(pathParamNotUniqueMsg(path, p, q))
 | 
					 | 
				
			||||||
							break
 | 
					 | 
				
			||||||
						}
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// Warns about possible malformed params in path
 | 
					 | 
				
			||||||
				rexGarbledParam := mustCompileRegexp(`{.*[{}\s]+.*}`)
 | 
					 | 
				
			||||||
				for _, p := range paramsInPath {
 | 
					 | 
				
			||||||
					if rexGarbledParam.MatchString(p) {
 | 
					 | 
				
			||||||
						res.AddWarnings(pathParamGarbledMsg(path, p))
 | 
					 | 
				
			||||||
					}
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				// Match params from path vs params from params section
 | 
					 | 
				
			||||||
				res.Merge(s.validatePathParamPresence(path, paramsInPath, paramNames))
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Check uniqueness of stripped paths
 | 
				
			||||||
 | 
								if _, found := methodPaths[method][pathToAdd]; found {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Sort names for stable, testable output
 | 
				
			||||||
 | 
									if strings.Compare(path, methodPaths[method][pathToAdd]) < 0 {
 | 
				
			||||||
 | 
										res.AddErrors(pathOverlapMsg(path, methodPaths[method][pathToAdd]))
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										res.AddErrors(pathOverlapMsg(methodPaths[method][pathToAdd], path))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if _, found := methodPaths[method]; !found {
 | 
				
			||||||
 | 
										methodPaths[method] = map[string]string{}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									methodPaths[method][pathToAdd] = path //Original non stripped path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								var bodyParams []string
 | 
				
			||||||
 | 
								var paramNames []string
 | 
				
			||||||
 | 
								var hasForm, hasBody bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Check parameters names uniqueness for operation
 | 
				
			||||||
 | 
								// TODO: should be done after param expansion
 | 
				
			||||||
 | 
								res.Merge(s.checkUniqueParams(path, method, op))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for _, pr := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) {
 | 
				
			||||||
 | 
									// Validate pattern regexp for parameters with a Pattern property
 | 
				
			||||||
 | 
									if _, err := compileRegexp(pr.Pattern); err != nil {
 | 
				
			||||||
 | 
										res.AddErrors(invalidPatternInParamMsg(op.ID, pr.Name, pr.Pattern))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// There must be at most one parameter in body: list them all
 | 
				
			||||||
 | 
									if pr.In == swaggerBody {
 | 
				
			||||||
 | 
										bodyParams = append(bodyParams, fmt.Sprintf("%q", pr.Name))
 | 
				
			||||||
 | 
										hasBody = true
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if pr.In == "path" {
 | 
				
			||||||
 | 
										paramNames = append(paramNames, pr.Name)
 | 
				
			||||||
 | 
										// Path declared in path must have the required: true property
 | 
				
			||||||
 | 
										if !pr.Required {
 | 
				
			||||||
 | 
											res.AddErrors(pathParamRequiredMsg(op.ID, pr.Name))
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if pr.In == "formData" {
 | 
				
			||||||
 | 
										hasForm = true
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if !(pr.Type == numberType || pr.Type == integerType) &&
 | 
				
			||||||
 | 
										(pr.Maximum != nil || pr.Minimum != nil || pr.MultipleOf != nil) {
 | 
				
			||||||
 | 
										// A non-numeric parameter has validation keywords for numeric instances (number and integer)
 | 
				
			||||||
 | 
										res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if !(pr.Type == stringType) &&
 | 
				
			||||||
 | 
										// A non-string parameter has validation keywords for strings
 | 
				
			||||||
 | 
										(pr.MaxLength != nil || pr.MinLength != nil || pr.Pattern != "") {
 | 
				
			||||||
 | 
										res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if !(pr.Type == arrayType) &&
 | 
				
			||||||
 | 
										// A non-array parameter has validation keywords for arrays
 | 
				
			||||||
 | 
										(pr.MaxItems != nil || pr.MinItems != nil || pr.UniqueItems) {
 | 
				
			||||||
 | 
										res.AddWarnings(parameterValidationTypeMismatchMsg(pr.Name, path, pr.Type))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// In:formData and In:body are mutually exclusive
 | 
				
			||||||
 | 
								if hasBody && hasForm {
 | 
				
			||||||
 | 
									res.AddErrors(bothFormDataAndBodyMsg(op.ID))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								// There must be at most one body param
 | 
				
			||||||
 | 
								// Accurately report situations when more than 1 body param is declared (possibly unnamed)
 | 
				
			||||||
 | 
								if len(bodyParams) > 1 {
 | 
				
			||||||
 | 
									sort.Strings(bodyParams)
 | 
				
			||||||
 | 
									res.AddErrors(multipleBodyParamMsg(op.ID, bodyParams))
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Check uniqueness of parameters in path
 | 
				
			||||||
 | 
								paramsInPath := pathHelp.extractPathParams(path)
 | 
				
			||||||
 | 
								for i, p := range paramsInPath {
 | 
				
			||||||
 | 
									for j, q := range paramsInPath {
 | 
				
			||||||
 | 
										if p == q && i > j {
 | 
				
			||||||
 | 
											res.AddErrors(pathParamNotUniqueMsg(path, p, q))
 | 
				
			||||||
 | 
											break
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Warns about possible malformed params in path
 | 
				
			||||||
 | 
								rexGarbledParam := mustCompileRegexp(`{.*[{}\s]+.*}`)
 | 
				
			||||||
 | 
								for _, p := range paramsInPath {
 | 
				
			||||||
 | 
									if rexGarbledParam.MatchString(p) {
 | 
				
			||||||
 | 
										res.AddWarnings(pathParamGarbledMsg(path, p))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Match params from path vs params from params section
 | 
				
			||||||
 | 
								res.Merge(s.validatePathParamPresence(path, paramsInPath, paramNames))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return res
 | 
						return res
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -163,6 +163,9 @@ const (
 | 
				
			||||||
	// PathParamGarbledWarning ...
 | 
						// PathParamGarbledWarning ...
 | 
				
			||||||
	PathParamGarbledWarning = "in path %q, param %q contains {,} or white space. Albeit not stricly illegal, this is probably no what you want"
 | 
						PathParamGarbledWarning = "in path %q, param %q contains {,} or white space. Albeit not stricly illegal, this is probably no what you want"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// ParamValidationTypeMismatch indicates that parameter has validation which does not match its type
 | 
				
			||||||
 | 
						ParamValidationTypeMismatch = "validation keywords of parameter %q in path %q don't match its type %s"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// PathStrippedParamGarbledWarning ...
 | 
						// PathStrippedParamGarbledWarning ...
 | 
				
			||||||
	PathStrippedParamGarbledWarning = "path stripped from path parameters %s contains {,} or white space. This is probably no what you want."
 | 
						PathStrippedParamGarbledWarning = "path stripped from path parameters %s contains {,} or white space. This is probably no what you want."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -341,6 +344,9 @@ func invalidParameterDefinitionMsg(path, method, operationID string) errors.Erro
 | 
				
			||||||
func invalidParameterDefinitionAsSchemaMsg(path, method, operationID string) errors.Error {
 | 
					func invalidParameterDefinitionAsSchemaMsg(path, method, operationID string) errors.Error {
 | 
				
			||||||
	return errors.New(errors.CompositeErrorCode, InvalidParameterDefinitionAsSchemaError, path, method, operationID)
 | 
						return errors.New(errors.CompositeErrorCode, InvalidParameterDefinitionAsSchemaError, path, method, operationID)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					func parameterValidationTypeMismatchMsg(param, path, typ string) errors.Error {
 | 
				
			||||||
 | 
						return errors.New(errors.CompositeErrorCode, ParamValidationTypeMismatch, param, path, typ)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// disabled
 | 
					// disabled
 | 
				
			||||||
//func invalidResponseDefinitionAsSchemaMsg(path, method string) errors.Error {
 | 
					//func invalidResponseDefinitionAsSchemaMsg(path, method string) errors.Error {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,53 +39,53 @@ func (t *typeValidator) schemaInfoForType(data interface{}) (string, string) {
 | 
				
			||||||
	// TODO: this switch really is some sort of reverse lookup for formats. It should be provided by strfmt.
 | 
						// TODO: this switch really is some sort of reverse lookup for formats. It should be provided by strfmt.
 | 
				
			||||||
	switch data.(type) {
 | 
						switch data.(type) {
 | 
				
			||||||
	case []byte, strfmt.Base64, *strfmt.Base64:
 | 
						case []byte, strfmt.Base64, *strfmt.Base64:
 | 
				
			||||||
		return "string", "byte"
 | 
							return stringType, stringFormatByte
 | 
				
			||||||
	case strfmt.CreditCard, *strfmt.CreditCard:
 | 
						case strfmt.CreditCard, *strfmt.CreditCard:
 | 
				
			||||||
		return "string", "creditcard"
 | 
							return stringType, stringFormatCreditCard
 | 
				
			||||||
	case strfmt.Date, *strfmt.Date:
 | 
						case strfmt.Date, *strfmt.Date:
 | 
				
			||||||
		return "string", "date"
 | 
							return stringType, stringFormatDate
 | 
				
			||||||
	case strfmt.DateTime, *strfmt.DateTime:
 | 
						case strfmt.DateTime, *strfmt.DateTime:
 | 
				
			||||||
		return "string", "date-time"
 | 
							return stringType, stringFormatDateTime
 | 
				
			||||||
	case strfmt.Duration, *strfmt.Duration:
 | 
						case strfmt.Duration, *strfmt.Duration:
 | 
				
			||||||
		return "string", "duration"
 | 
							return stringType, stringFormatDuration
 | 
				
			||||||
	case runtime.File, *runtime.File:
 | 
						case runtime.File, *runtime.File:
 | 
				
			||||||
		return "file", ""
 | 
							return fileType, ""
 | 
				
			||||||
	case strfmt.Email, *strfmt.Email:
 | 
						case strfmt.Email, *strfmt.Email:
 | 
				
			||||||
		return "string", "email"
 | 
							return stringType, stringFormatEmail
 | 
				
			||||||
	case strfmt.HexColor, *strfmt.HexColor:
 | 
						case strfmt.HexColor, *strfmt.HexColor:
 | 
				
			||||||
		return "string", "hexcolor"
 | 
							return stringType, stringFormatHexColor
 | 
				
			||||||
	case strfmt.Hostname, *strfmt.Hostname:
 | 
						case strfmt.Hostname, *strfmt.Hostname:
 | 
				
			||||||
		return "string", "hostname"
 | 
							return stringType, stringFormatHostname
 | 
				
			||||||
	case strfmt.IPv4, *strfmt.IPv4:
 | 
						case strfmt.IPv4, *strfmt.IPv4:
 | 
				
			||||||
		return "string", "ipv4"
 | 
							return stringType, stringFormatIPv4
 | 
				
			||||||
	case strfmt.IPv6, *strfmt.IPv6:
 | 
						case strfmt.IPv6, *strfmt.IPv6:
 | 
				
			||||||
		return "string", "ipv6"
 | 
							return stringType, stringFormatIPv6
 | 
				
			||||||
	case strfmt.ISBN, *strfmt.ISBN:
 | 
						case strfmt.ISBN, *strfmt.ISBN:
 | 
				
			||||||
		return "string", "isbn"
 | 
							return stringType, stringFormatISBN
 | 
				
			||||||
	case strfmt.ISBN10, *strfmt.ISBN10:
 | 
						case strfmt.ISBN10, *strfmt.ISBN10:
 | 
				
			||||||
		return "string", "isbn10"
 | 
							return stringType, stringFormatISBN10
 | 
				
			||||||
	case strfmt.ISBN13, *strfmt.ISBN13:
 | 
						case strfmt.ISBN13, *strfmt.ISBN13:
 | 
				
			||||||
		return "string", "isbn13"
 | 
							return stringType, stringFormatISBN13
 | 
				
			||||||
	case strfmt.MAC, *strfmt.MAC:
 | 
						case strfmt.MAC, *strfmt.MAC:
 | 
				
			||||||
		return "string", "mac"
 | 
							return stringType, stringFormatMAC
 | 
				
			||||||
	case strfmt.ObjectId, *strfmt.ObjectId:
 | 
						case strfmt.ObjectId, *strfmt.ObjectId:
 | 
				
			||||||
		return "string", "bsonobjectid"
 | 
							return stringType, stringFormatBSONObjectID
 | 
				
			||||||
	case strfmt.Password, *strfmt.Password:
 | 
						case strfmt.Password, *strfmt.Password:
 | 
				
			||||||
		return "string", "password"
 | 
							return stringType, stringFormatPassword
 | 
				
			||||||
	case strfmt.RGBColor, *strfmt.RGBColor:
 | 
						case strfmt.RGBColor, *strfmt.RGBColor:
 | 
				
			||||||
		return "string", "rgbcolor"
 | 
							return stringType, stringFormatRGBColor
 | 
				
			||||||
	case strfmt.SSN, *strfmt.SSN:
 | 
						case strfmt.SSN, *strfmt.SSN:
 | 
				
			||||||
		return "string", "ssn"
 | 
							return stringType, stringFormatSSN
 | 
				
			||||||
	case strfmt.URI, *strfmt.URI:
 | 
						case strfmt.URI, *strfmt.URI:
 | 
				
			||||||
		return "string", "uri"
 | 
							return stringType, stringFormatURI
 | 
				
			||||||
	case strfmt.UUID, *strfmt.UUID:
 | 
						case strfmt.UUID, *strfmt.UUID:
 | 
				
			||||||
		return "string", "uuid"
 | 
							return stringType, stringFormatUUID
 | 
				
			||||||
	case strfmt.UUID3, *strfmt.UUID3:
 | 
						case strfmt.UUID3, *strfmt.UUID3:
 | 
				
			||||||
		return "string", "uuid3"
 | 
							return stringType, stringFormatUUID3
 | 
				
			||||||
	case strfmt.UUID4, *strfmt.UUID4:
 | 
						case strfmt.UUID4, *strfmt.UUID4:
 | 
				
			||||||
		return "string", "uuid4"
 | 
							return stringType, stringFormatUUID4
 | 
				
			||||||
	case strfmt.UUID5, *strfmt.UUID5:
 | 
						case strfmt.UUID5, *strfmt.UUID5:
 | 
				
			||||||
		return "string", "uuid5"
 | 
							return stringType, stringFormatUUID5
 | 
				
			||||||
	// TODO: missing binary (io.ReadCloser)
 | 
						// TODO: missing binary (io.ReadCloser)
 | 
				
			||||||
	// TODO: missing json.Number
 | 
						// TODO: missing json.Number
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
| 
						 | 
					@ -93,25 +93,25 @@ func (t *typeValidator) schemaInfoForType(data interface{}) (string, string) {
 | 
				
			||||||
		tpe := val.Type()
 | 
							tpe := val.Type()
 | 
				
			||||||
		switch tpe.Kind() {
 | 
							switch tpe.Kind() {
 | 
				
			||||||
		case reflect.Bool:
 | 
							case reflect.Bool:
 | 
				
			||||||
			return "boolean", ""
 | 
								return booleanType, ""
 | 
				
			||||||
		case reflect.String:
 | 
							case reflect.String:
 | 
				
			||||||
			return "string", ""
 | 
								return stringType, ""
 | 
				
			||||||
		case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint8, reflect.Uint16, reflect.Uint32:
 | 
							case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint8, reflect.Uint16, reflect.Uint32:
 | 
				
			||||||
			// NOTE: that is the spec. With go-openapi, is that not uint32 for unsigned integers?
 | 
								// NOTE: that is the spec. With go-openapi, is that not uint32 for unsigned integers?
 | 
				
			||||||
			return "integer", "int32"
 | 
								return integerType, integerFormatInt32
 | 
				
			||||||
		case reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64:
 | 
							case reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64:
 | 
				
			||||||
			return "integer", "int64"
 | 
								return integerType, integerFormatInt64
 | 
				
			||||||
		case reflect.Float32:
 | 
							case reflect.Float32:
 | 
				
			||||||
			// NOTE: is that not "float"?
 | 
								// NOTE: is that not numberFormatFloat?
 | 
				
			||||||
			return "number", "float32"
 | 
								return numberType, numberFormatFloat32
 | 
				
			||||||
		case reflect.Float64:
 | 
							case reflect.Float64:
 | 
				
			||||||
			// NOTE: is that not "double"?
 | 
								// NOTE: is that not "double"?
 | 
				
			||||||
			return "number", "float64"
 | 
								return numberType, numberFormatFloat64
 | 
				
			||||||
		// NOTE: go arrays (reflect.Array) are not supported (fixed length)
 | 
							// NOTE: go arrays (reflect.Array) are not supported (fixed length)
 | 
				
			||||||
		case reflect.Slice:
 | 
							case reflect.Slice:
 | 
				
			||||||
			return "array", ""
 | 
								return arrayType, ""
 | 
				
			||||||
		case reflect.Map, reflect.Struct:
 | 
							case reflect.Map, reflect.Struct:
 | 
				
			||||||
			return "object", ""
 | 
								return objectType, ""
 | 
				
			||||||
		case reflect.Interface:
 | 
							case reflect.Interface:
 | 
				
			||||||
			// What to do here?
 | 
								// What to do here?
 | 
				
			||||||
			panic("dunno what to do here")
 | 
								panic("dunno what to do here")
 | 
				
			||||||
| 
						 | 
					@ -139,8 +139,8 @@ func (t *typeValidator) Validate(data interface{}) *Result {
 | 
				
			||||||
	result.Inc()
 | 
						result.Inc()
 | 
				
			||||||
	if data == nil || reflect.DeepEqual(reflect.Zero(reflect.TypeOf(data)), reflect.ValueOf(data)) {
 | 
						if data == nil || reflect.DeepEqual(reflect.Zero(reflect.TypeOf(data)), reflect.ValueOf(data)) {
 | 
				
			||||||
		// nil or zero value for the passed structure require Type: null
 | 
							// nil or zero value for the passed structure require Type: null
 | 
				
			||||||
		if len(t.Type) > 0 && !t.Type.Contains("null") && !t.Nullable { // TODO: if a property is not required it also passes this
 | 
							if len(t.Type) > 0 && !t.Type.Contains(nullType) && !t.Nullable { // TODO: if a property is not required it also passes this
 | 
				
			||||||
			return errorHelp.sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), "null"))
 | 
								return errorHelp.sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), nullType))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return result
 | 
							return result
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -157,17 +157,17 @@ func (t *typeValidator) Validate(data interface{}) *Result {
 | 
				
			||||||
	// check numerical types
 | 
						// check numerical types
 | 
				
			||||||
	// TODO: check unsigned ints
 | 
						// TODO: check unsigned ints
 | 
				
			||||||
	// TODO: check json.Number (see schema.go)
 | 
						// TODO: check json.Number (see schema.go)
 | 
				
			||||||
	isLowerInt := t.Format == "int64" && format == "int32"
 | 
						isLowerInt := t.Format == integerFormatInt64 && format == integerFormatInt32
 | 
				
			||||||
	isLowerFloat := t.Format == "float64" && format == "float32"
 | 
						isLowerFloat := t.Format == numberFormatFloat64 && format == numberFormatFloat32
 | 
				
			||||||
	isFloatInt := schType == "number" && swag.IsFloat64AJSONInteger(val.Float()) && t.Type.Contains("integer")
 | 
						isFloatInt := schType == numberType && swag.IsFloat64AJSONInteger(val.Float()) && t.Type.Contains(integerType)
 | 
				
			||||||
	isIntFloat := schType == "integer" && t.Type.Contains("number")
 | 
						isIntFloat := schType == integerType && t.Type.Contains(numberType)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if kind != reflect.String && kind != reflect.Slice && t.Format != "" && !(t.Type.Contains(schType) || format == t.Format || isFloatInt || isIntFloat || isLowerInt || isLowerFloat) {
 | 
						if kind != reflect.String && kind != reflect.Slice && t.Format != "" && !(t.Type.Contains(schType) || format == t.Format || isFloatInt || isIntFloat || isLowerInt || isLowerFloat) {
 | 
				
			||||||
		// TODO: test case
 | 
							// TODO: test case
 | 
				
			||||||
		return errorHelp.sErr(errors.InvalidType(t.Path, t.In, t.Format, format))
 | 
							return errorHelp.sErr(errors.InvalidType(t.Path, t.In, t.Format, format))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if !(t.Type.Contains("number") || t.Type.Contains("integer")) && t.Format != "" && (kind == reflect.String || kind == reflect.Slice) {
 | 
						if !(t.Type.Contains(numberType) || t.Type.Contains(integerType)) && t.Format != "" && (kind == reflect.String || kind == reflect.Slice) {
 | 
				
			||||||
		return result
 | 
							return result
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -452,6 +452,7 @@ func (s *basicSliceValidator) Validate(data interface{}) *Result {
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* unused
 | 
				
			||||||
func (s *basicSliceValidator) hasDuplicates(value reflect.Value, size int) bool {
 | 
					func (s *basicSliceValidator) hasDuplicates(value reflect.Value, size int) bool {
 | 
				
			||||||
	dict := make(map[interface{}]struct{})
 | 
						dict := make(map[interface{}]struct{})
 | 
				
			||||||
	for i := 0; i < size; i++ {
 | 
						for i := 0; i < size; i++ {
 | 
				
			||||||
| 
						 | 
					@ -463,6 +464,7 @@ func (s *basicSliceValidator) hasDuplicates(value reflect.Value, size int) bool
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return false
 | 
						return false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type numberValidator struct {
 | 
					type numberValidator struct {
 | 
				
			||||||
	Path             string
 | 
						Path             string
 | 
				
			||||||
| 
						 | 
					@ -530,6 +532,7 @@ func (n *numberValidator) Validate(val interface{}) *Result {
 | 
				
			||||||
	// Is the provided value within the range of the specified numeric type and format?
 | 
						// Is the provided value within the range of the specified numeric type and format?
 | 
				
			||||||
	res.AddErrors(IsValueValidAgainstRange(val, n.Type, n.Format, "Checked", n.Path))
 | 
						res.AddErrors(IsValueValidAgainstRange(val, n.Type, n.Format, "Checked", n.Path))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// nolint: dupl
 | 
				
			||||||
	if n.MultipleOf != nil {
 | 
						if n.MultipleOf != nil {
 | 
				
			||||||
		// Is the constraint specifier within the range of the specific numeric type and format?
 | 
							// Is the constraint specifier within the range of the specific numeric type and format?
 | 
				
			||||||
		resMultiple.AddErrors(IsValueValidAgainstRange(*n.MultipleOf, n.Type, n.Format, "MultipleOf", n.Path))
 | 
							resMultiple.AddErrors(IsValueValidAgainstRange(*n.MultipleOf, n.Type, n.Format, "MultipleOf", n.Path))
 | 
				
			||||||
| 
						 | 
					@ -546,6 +549,7 @@ func (n *numberValidator) Validate(val interface{}) *Result {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// nolint: dupl
 | 
				
			||||||
	if n.Maximum != nil {
 | 
						if n.Maximum != nil {
 | 
				
			||||||
		// Is the constraint specifier within the range of the specific numeric type and format?
 | 
							// Is the constraint specifier within the range of the specific numeric type and format?
 | 
				
			||||||
		resMaximum.AddErrors(IsValueValidAgainstRange(*n.Maximum, n.Type, n.Format, "Maximum boundary", n.Path))
 | 
							resMaximum.AddErrors(IsValueValidAgainstRange(*n.Maximum, n.Type, n.Format, "Maximum boundary", n.Path))
 | 
				
			||||||
| 
						 | 
					@ -562,6 +566,7 @@ func (n *numberValidator) Validate(val interface{}) *Result {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// nolint: dupl
 | 
				
			||||||
	if n.Minimum != nil {
 | 
						if n.Minimum != nil {
 | 
				
			||||||
		// Is the constraint specifier within the range of the specific numeric type and format?
 | 
							// Is the constraint specifier within the range of the specific numeric type and format?
 | 
				
			||||||
		resMinimum.AddErrors(IsValueValidAgainstRange(*n.Minimum, n.Type, n.Format, "Minimum boundary", n.Path))
 | 
							resMinimum.AddErrors(IsValueValidAgainstRange(*n.Minimum, n.Type, n.Format, "Minimum boundary", n.Path))
 | 
				
			||||||
| 
						 | 
					@ -611,7 +616,7 @@ func (s *stringValidator) Applies(source interface{}, kind reflect.Kind) bool {
 | 
				
			||||||
func (s *stringValidator) Validate(val interface{}) *Result {
 | 
					func (s *stringValidator) Validate(val interface{}) *Result {
 | 
				
			||||||
	data, ok := val.(string)
 | 
						data, ok := val.(string)
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
		return errorHelp.sErr(errors.InvalidType(s.Path, s.In, "string", val))
 | 
							return errorHelp.sErr(errors.InvalidType(s.Path, s.In, stringType, val))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if s.Required && !s.AllowEmptyValue && (s.Default == nil || s.Default == "") {
 | 
						if s.Required && !s.AllowEmptyValue && (s.Default == nil || s.Default == "") {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue