diff options
author | 6543 <6543@obermui.de> | 2020-09-01 16:01:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-01 10:01:23 -0400 |
commit | 3270e7a4435fceb757728dfc319fc04077a37caf (patch) | |
tree | 60dcaf02442e930c0b2c7bd7fe0f0b00190a402f | |
parent | 66843f22375b67a58746dac508b71200a96e68d6 (diff) | |
download | gitea-3270e7a4435fceb757728dfc319fc04077a37caf.tar.gz gitea-3270e7a4435fceb757728dfc319fc04077a37caf.zip |
[Vendor] update go-swagger v0.21.0 -> v0.25.0 (#12670)
* Update go-swagger
* vendor
350 files changed, 26295 insertions, 5494 deletions
@@ -3,7 +3,6 @@ module code.gitea.io/gitea go 1.14 require ( - cloud.google.com/go v0.45.0 // indirect code.gitea.io/gitea-vet v0.2.1 gitea.com/lunny/levelqueue v0.3.0 gitea.com/macaron/binding v0.0.0-20190822013154-a5f53841ed2b @@ -21,7 +20,6 @@ require ( github.com/PuerkitoBio/goquery v1.5.1 github.com/RoaringBitmap/roaring v0.4.23 // indirect github.com/alecthomas/chroma v0.8.0 - github.com/bgentry/speakeasy v0.1.0 // indirect github.com/blevesearch/bleve v1.0.7 github.com/couchbase/gomemcached v0.0.0-20191004160342-7b5da2ec40b2 // 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-git/go-billy/v5 v5.0.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-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/gobwas/glob v0.2.3 github.com/gogs/chardet v0.0.0-20191104214054-4b6791f73a28 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/uuid v1.1.1 github.com/gorilla/context v1.1.1 @@ -65,7 +61,6 @@ require ( github.com/lafriks/xormstore v1.3.2 github.com/lib/pq v1.7.0 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/mattn/go-isatty v0.0.12 github.com/mattn/go-sqlite3 v1.14.0 @@ -84,14 +79,13 @@ require ( github.com/pkg/errors v0.9.1 github.com/pquerna/otp v1.2.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/quasoft/websspi v1.0.0 github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001 // indirect github.com/sergi/go-diff v1.1.0 github.com/shurcooL/httpfs v0.0.0-20190527155220-6a4d4a70508b // indirect 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/tinylib/msgp v1.1.2 // indirect github.com/tstranex/u2f v1.0.0 @@ -111,7 +105,6 @@ require ( golang.org/x/text v0.3.3 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 // indirect 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/asn1-ber.v1 v1.0.0-20150924051756-4e86f4367175 // indirect gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df @@ -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.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.0 h1:bALuGBSgE+BD4rxsopAYlqjcwqcQtye6pWG4bC3N/k0= -cloud.google.com/go v0.45.0/go.mod h1:452BcPOeI9AZfbvDw0Tbo7D32wA+WX9WME8AZwMEDZU= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +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/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/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/go.mod h1:HBqmLbz56JWpfEGG0prskAV97ATNRoj5LDmPicD22hU= 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/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= 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/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/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-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-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/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= 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/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= 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/go.mod h1:3xvmBtaw12Y4C9iA1RTzwWCof5j5HjydjCTiDE2TeE0= 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/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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 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/go.mod h1:wDW5xjJdeoMm1mRt4sD4c/LbF/mWdEpRXQKjTR8nIBE= 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/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/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-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.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-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 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/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= 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/go.mod h1:MkKY/CB98aVE4VxO63X5vTQKUgcn+3XP15LMASe3lYs= 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/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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/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/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.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/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= 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/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-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -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.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.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.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/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= 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.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= 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.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.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/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.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.5 h1:h4Zk7oTfB3ZYM2oMNliQvL+3BrDstTIX8lqP7yaYCuI= -github.com/go-openapi/runtime v0.19.5/go.mod h1:WIH6IYPXOrtgTClTV8xzdrD20jBlrK25D0aQbdSlqp8= +github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= +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.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.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.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.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.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.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.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= 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.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/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/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= 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-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-swagger/go-swagger v0.21.0 h1:AX9mdfzp6eJtUe92nFrWmbK7ocRgkCDPJs0FsSSTDlA= -github.com/go-swagger/go-swagger v0.21.0/go.mod h1:tDb8PdDVFcaE8EPXkMOsuxpL3UEPiwu1UDZar9Z/1RY= +github.com/go-swagger/go-swagger v0.25.0 h1:FxhyrWWV8V/A9P6GtI5szWordAdbb6Y0nqdY/y9So2w= +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/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/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/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/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= 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.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= 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.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= 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.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.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/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= 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/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= 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.2.0 h1:S7P+1Hm5V/AT9cjEcUD5uDaQSX0OE577aCXgoaKpYbQ= 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-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= 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/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.6 h1:HJunrbHTDDbBb/ay4kxa1n+dLmttUlnP3V9oNE4hmsM= 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.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 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/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 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/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= 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/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= 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/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.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= 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/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.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/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/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= 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-20190614124828-94de47d64c63/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.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +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/going v1.0.0/go.mod h1:I6mnB4BPnEeqo85ynXIx1ZFLLbtiLHNXVgWeFO9OGOA= github.com/markbates/goth v1.61.2 h1:jDowrUH5qw8KGuQdKwFhLzkXkTYCIPfz3LHADJsiPIs= 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.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= 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.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= 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.5/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/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/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/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/go.mod h1:CSt2ETZNs+bIIhWTse0mcZKZWMGrFU7Er7RR0TmkDYk= 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/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/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/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-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 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 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= 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/go.mod h1:skjdDftzkFALcuGzYSklqYd8gvat6F1gZJ4YPVbkZpM= 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/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/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/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/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/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= 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.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 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/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/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= 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/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= 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/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= 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/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/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.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= 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/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.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/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-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 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/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.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.2 h1:GDarE4TJQI52kYSbSAmLiId1Elfj+xgSDqrUZxFhxlU= +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/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/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 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/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 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.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/steveyen/gtreap v0.1.0 h1:CjhzTa274PyJLJuMZwIzCO1PfC00oRa8d1Kc78bFXJM= 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= @@ -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.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= 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/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= 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/tstranex/u2f v1.0.0 h1:HhJkSzDDlVSVIVt7pDJwCHQj67k7A5EeBgPmeD+pVsQ= 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/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8= 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/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/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/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= 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.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= 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.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 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.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-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-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-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-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-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-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-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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= 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-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-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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-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-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-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-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= 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-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-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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-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-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-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-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-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-20190616124812-15dcb6c0061f/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-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-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-20191026070338-33540a1f6037/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-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-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-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-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-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-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-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-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-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-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-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-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/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/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 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.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.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.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.2/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.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= +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-20190307195333-5fe7a883aa19/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-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/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.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/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-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 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.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY= 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/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= @@ -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-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 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.2/go.mod h1:M3Cogqpuv0QCi3ExAY5V4uOt4qb/R3xZubo9m8lK5wg= 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/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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/go.mod h1:oxD7NyBuxchC+SgJDE1Q5Od05eGt29SDQVBmV+HYbzw= 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/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 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.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/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-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.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= 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= diff --git a/vendor/cloud.google.com/go/compute/metadata/.repo-metadata.json b/vendor/cloud.google.com/go/compute/metadata/.repo-metadata.json new file mode 100644 index 0000000000..ca022ccc41 --- /dev/null +++ b/vendor/cloud.google.com/go/compute/metadata/.repo-metadata.json @@ -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 +} diff --git a/vendor/github.com/asaskevich/govalidator/.gitignore b/vendor/github.com/asaskevich/govalidator/.gitignore new file mode 100644 index 0000000000..8d69a9418a --- /dev/null +++ b/vendor/github.com/asaskevich/govalidator/.gitignore @@ -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 + diff --git a/vendor/github.com/asaskevich/govalidator/.travis.yml b/vendor/github.com/asaskevich/govalidator/.travis.yml index e29f8eef5e..17c4d0a710 100644 --- a/vendor/github.com/asaskevich/govalidator/.travis.yml +++ b/vendor/github.com/asaskevich/govalidator/.travis.yml @@ -1,14 +1,18 @@ +dist: bionic language: go +env: GO111MODULE=on GOFLAGS='-mod vendor' +install: true +email: false go: - - 1.1 - - 1.2 - - 1.3 - - 1.4 - - 1.5 - - 1.6 + - 1.10 + - 1.11 + - 1.12 + - 1.13 - tip -notifications: - email: - - bwatas@gmail.com +before_script: + - go install github.com/golangci/golangci-lint/cmd/golangci-lint +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 diff --git a/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md b/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md index f0f7e3a8ad..7ed268a1ed 100644 --- a/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md +++ b/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md @@ -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 [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 [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 some struct/map/array utilities - [ ] Implement map/array validation @@ -37,7 +37,7 @@ Anyone can file an expense. If the expense makes sense for the development of th ### Contributors 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 diff --git a/vendor/github.com/asaskevich/govalidator/README.md b/vendor/github.com/asaskevich/govalidator/README.md index 40f9a87811..78f999e834 100644 --- a/vendor/github.com/asaskevich/govalidator/README.md +++ b/vendor/github.com/asaskevich/govalidator/README.md @@ -13,7 +13,7 @@ Type the following command in your terminal: 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. @@ -83,14 +83,14 @@ This was changed to prevent data races when accessing custom validators. import "github.com/asaskevich/govalidator" // before -govalidator.CustomTypeTagMap["customByteArrayValidator"] = CustomTypeValidator(func(i interface{}, o interface{}) bool { +govalidator.CustomTypeTagMap["customByteArrayValidator"] = func(i interface{}, o interface{}) bool { // ... -}) +} // 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: @@ -108,23 +108,34 @@ func Filter(array []interface{}, iterator ConditionIterator) []interface{} func Find(array []interface{}, iterator ConditionIterator) interface{} func GetLine(s string, index int) (string, error) 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 IsAlpha(str string) bool func IsAlphanumeric(str string) bool func IsBase64(str string) bool func IsByteLength(str string, min, max int) bool func IsCIDR(str string) bool +func IsCRC32(str string) bool +func IsCRC32b(str string) bool func IsCreditCard(str string) bool func IsDNSName(str string) bool func IsDataURI(str string) bool func IsDialString(str string) bool func IsDivisibleBy(str, num string) bool func IsEmail(str string) bool +func IsExistingEmail(email string) bool func IsFilePath(str string) (bool, int) func IsFloat(str string) bool func IsFullWidth(str string) bool func IsHalfWidth(str string) bool +func IsHash(str string, algorithm string) bool func IsHexadecimal(str string) bool func IsHexcolor(str string) bool func IsHost(str string) bool @@ -136,22 +147,27 @@ func IsISBN10(str string) bool func IsISBN13(str string) bool func IsISO3166Alpha2(str string) bool func IsISO3166Alpha3(str string) bool +func IsISO4217(str string) bool func IsISO693Alpha2(str string) bool func IsISO693Alpha3b(str string) bool -func IsISO4217(str string) bool func IsIn(str string, params ...string) bool +func IsInRaw(str string, params ...string) bool func IsInt(str string) bool func IsJSON(str string) bool func IsLatitude(str string) bool func IsLongitude(str string) bool func IsLowerCase(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 IsMultibyte(str string) bool func IsNatural(value float64) bool func IsNegative(value float64) bool func IsNonNegative(value float64) bool func IsNonPositive(value float64) bool +func IsNotNull(str string) bool func IsNull(str string) bool func IsNumeric(str string) bool func IsPort(str string) bool @@ -162,9 +178,21 @@ func IsRFC3339WithoutZone(str string) bool func IsRGBcolor(str string) bool func IsRequestURI(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 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 IsType(v interface{}, params ...string) bool func IsURL(str string) bool func IsUTFDigit(str string) bool func IsUTFLetter(str string) bool @@ -174,16 +202,20 @@ func IsUUID(str string) bool func IsUUIDv3(str string) bool func IsUUIDv4(str string) bool func IsUUIDv5(str string) bool +func IsUnixTime(str string) bool func IsUpperCase(str string) bool func IsVariableWidth(str string) bool func IsWhole(value float64) bool func LeftTrim(str, chars string) string func Map(array []interface{}, iterator ResultIterator) []interface{} 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 PadBoth(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 PrependPathToErrors(err error, path string) error func Range(str string, params ...string) bool func RemoveTags(s 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 SafeFileName(str string) string func SetFieldsRequiredByDefault(value bool) +func SetNilPtrAllowedByRequired(value bool) func Sign(value float64) float64 func StringLength(str string, params ...string) bool func StringMatches(s string, params ...string) bool func StripLow(str string, keepNewLines bool) string func ToBoolean(str string) (bool, 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 ToString(obj interface{}) string func Trim(str, chars string) string func Truncate(str string, length int, ending string) string +func TruncatingErrorf(str string, args ...interface{}) error func UnderscoreToCamelCase(s string) string +func ValidateMap(inputMap map[string]interface{}, validationMap map[string]interface{}) (bool, error) func ValidateStruct(s interface{}) (bool, error) func WhiteList(str, chars string) string type ConditionIterator @@ -214,6 +249,8 @@ type Errors func (es Errors) Error() string func (es Errors) Errors() []error type ISO3166Entry +type ISO693Entry +type InterfaceParamValidator type Iterator type ParamValidator type ResultIterator @@ -227,6 +264,27 @@ type Validator ```go 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 ```go type User struct { @@ -335,6 +393,11 @@ Validators with parameters "in(string1|string2|...|stringN)": IsIn, "rsapub(keylength)" : IsRsaPub, ``` +Validators with parameters for any type + +```go +"type(type)": IsType, +``` And here is small example of usage: ```go @@ -370,6 +433,41 @@ if err != nil { } 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 ```go // Remove all characters from string ignoring characters between "a" and "z" @@ -389,7 +487,7 @@ type StructWithCustomByteArray struct { 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 case StructWithCustomByteArray: // you can check and validate against some other field in the context, @@ -409,14 +507,25 @@ govalidator.CustomTypeTagMap.Set("customByteArrayValidator", CustomTypeValidator } } 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 case StructWithCustomByteArray: return len(v.ID) >= v.CustomMinLength } 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 @@ -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 [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 [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 some struct/map/array utilities - [ ] 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) * [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 @@ -504,4 +613,4 @@ Support this project by becoming a sponsor. Your logo will show up here with a l ## License -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large)
\ No newline at end of file +[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large) diff --git a/vendor/github.com/asaskevich/govalidator/doc.go b/vendor/github.com/asaskevich/govalidator/doc.go new file mode 100644 index 0000000000..55dce62dc8 --- /dev/null +++ b/vendor/github.com/asaskevich/govalidator/doc.go @@ -0,0 +1,3 @@ +package govalidator + +// A package of validators and sanitizers for strings, structures and collections. diff --git a/vendor/github.com/asaskevich/govalidator/error.go b/vendor/github.com/asaskevich/govalidator/error.go index 655b750cb8..1da2336f47 100644 --- a/vendor/github.com/asaskevich/govalidator/error.go +++ b/vendor/github.com/asaskevich/govalidator/error.go @@ -1,6 +1,9 @@ package govalidator -import "strings" +import ( + "sort" + "strings" +) // Errors is an array of multiple errors and conforms to the error interface. type Errors []error @@ -15,6 +18,7 @@ func (es Errors) Error() string { for _, e := range es { errs = append(errs, e.Error()) } + sort.Strings(errs) return strings.Join(errs, ";") } diff --git a/vendor/github.com/asaskevich/govalidator/go.mod b/vendor/github.com/asaskevich/govalidator/go.mod new file mode 100644 index 0000000000..c1ce891dfa --- /dev/null +++ b/vendor/github.com/asaskevich/govalidator/go.mod @@ -0,0 +1,3 @@ +module github.com/asaskevich/govalidator + +go 1.12 diff --git a/vendor/github.com/asaskevich/govalidator/patterns.go b/vendor/github.com/asaskevich/govalidator/patterns.go index 61a05d438e..e55451cff5 100644 --- a/vendor/github.com/asaskevich/govalidator/patterns.go +++ b/vendor/github.com/asaskevich/govalidator/patterns.go @@ -4,49 +4,51 @@ import "regexp" // Basic regular expressions for validating strings 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}])))\\.?$" - 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})$" - ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$" - 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}$" - 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}$" - 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]+$" - Alphanumeric string = "^[a-zA-Z0-9]+$" - Numeric string = "^[0-9]+$" - Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" - Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" - Hexadecimal string = "^[0-9a-fA-F]+$" - 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*\\)$" - ASCII string = "^[\x00-\x7F]+$" - Multibyte string = "[^\x00-\x7F]" - 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]" - 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]+$" - DataURI string = "^data:.+\\/(.+);base64$" - Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" - Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" - 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})*[\._]?$` - 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]))` - URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` - URLUsername string = `(\S+(:\S*)?@)` - URLPath string = `((\/|\?|#)[^\s]*)` - URLPort string = `(:(\d{1,5}))` - 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]))` - URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))` - 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 + `?$` - SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` - WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` - UnixPath string = `^(/[^/\x00]*)+/?$` - 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-]+)*)?$" - tagName string = "valid" - hasLowerCase string = ".*[[:lower:]]" - hasUpperCase string = ".*[[:upper:]]" - hasWhitespace string = ".*[[:space:]]" - hasWhitespaceOnly string = "^[[:space:]]+$" + 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}|(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})$" + 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}$" + 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}$" + 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]+$" + Alphanumeric string = "^[a-zA-Z0-9]+$" + Numeric string = "^[0-9]+$" + Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" + Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" + Hexadecimal string = "^[0-9a-fA-F]+$" + 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*\\)$" + ASCII string = "^[\x00-\x7F]+$" + Multibyte string = "[^\x00-\x7F]" + 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]" + 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]+$" + DataURI string = "^data:.+\\/(.+);base64$" + MagnetURI string = "^magnet:\\?xt=urn:[a-zA-Z0-9]+:[a-zA-Z0-9]{32,40}&dn=.+&tr=.+$" + Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" + Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" + 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})*[\._]?$` + 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]))` + URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` + URLUsername string = `(\S+(:\S*)?@)` + URLPath string = `((\/|\?|#)[^\s]*)` + URLPort string = `(:(\d{1,5}))` + 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]))` + URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))` + 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 + `?$` + SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` + WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` + UnixPath string = `^(/[^/\x00]*)+/?$` + 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-]+)*)?$" + tagName string = "valid" + hasLowerCase string = ".*[[:lower:]]" + hasUpperCase string = ".*[[:upper:]]" + hasWhitespace string = ".*[[:space:]]" + hasWhitespaceOnly string = "^[[:space:]]+$" + IMEI string = "^[0-9a-f]{14}$|^\\d{15}$|^\\d{18}$" ) // Used by IsFilePath func @@ -60,42 +62,44 @@ const ( ) var ( - userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") - hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") - userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") - rxEmail = regexp.MustCompile(Email) - rxCreditCard = regexp.MustCompile(CreditCard) - rxISBN10 = regexp.MustCompile(ISBN10) - rxISBN13 = regexp.MustCompile(ISBN13) - rxUUID3 = regexp.MustCompile(UUID3) - rxUUID4 = regexp.MustCompile(UUID4) - rxUUID5 = regexp.MustCompile(UUID5) - rxUUID = regexp.MustCompile(UUID) - rxAlpha = regexp.MustCompile(Alpha) - rxAlphanumeric = regexp.MustCompile(Alphanumeric) - rxNumeric = regexp.MustCompile(Numeric) - rxInt = regexp.MustCompile(Int) - rxFloat = regexp.MustCompile(Float) - rxHexadecimal = regexp.MustCompile(Hexadecimal) - rxHexcolor = regexp.MustCompile(Hexcolor) - rxRGBcolor = regexp.MustCompile(RGBcolor) - rxASCII = regexp.MustCompile(ASCII) - rxPrintableASCII = regexp.MustCompile(PrintableASCII) - rxMultibyte = regexp.MustCompile(Multibyte) - rxFullWidth = regexp.MustCompile(FullWidth) - rxHalfWidth = regexp.MustCompile(HalfWidth) - rxBase64 = regexp.MustCompile(Base64) - rxDataURI = regexp.MustCompile(DataURI) - rxLatitude = regexp.MustCompile(Latitude) - rxLongitude = regexp.MustCompile(Longitude) - rxDNSName = regexp.MustCompile(DNSName) - rxURL = regexp.MustCompile(URL) - rxSSN = regexp.MustCompile(SSN) - rxWinPath = regexp.MustCompile(WinPath) - rxUnixPath = regexp.MustCompile(UnixPath) - rxSemver = regexp.MustCompile(Semver) - rxHasLowerCase = regexp.MustCompile(hasLowerCase) - rxHasUpperCase = regexp.MustCompile(hasUpperCase) - rxHasWhitespace = regexp.MustCompile(hasWhitespace) - rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) + userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") + hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") + userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") + rxEmail = regexp.MustCompile(Email) + rxCreditCard = regexp.MustCompile(CreditCard) + rxISBN10 = regexp.MustCompile(ISBN10) + rxISBN13 = regexp.MustCompile(ISBN13) + rxUUID3 = regexp.MustCompile(UUID3) + rxUUID4 = regexp.MustCompile(UUID4) + rxUUID5 = regexp.MustCompile(UUID5) + rxUUID = regexp.MustCompile(UUID) + rxAlpha = regexp.MustCompile(Alpha) + rxAlphanumeric = regexp.MustCompile(Alphanumeric) + rxNumeric = regexp.MustCompile(Numeric) + rxInt = regexp.MustCompile(Int) + rxFloat = regexp.MustCompile(Float) + rxHexadecimal = regexp.MustCompile(Hexadecimal) + rxHexcolor = regexp.MustCompile(Hexcolor) + rxRGBcolor = regexp.MustCompile(RGBcolor) + rxASCII = regexp.MustCompile(ASCII) + rxPrintableASCII = regexp.MustCompile(PrintableASCII) + rxMultibyte = regexp.MustCompile(Multibyte) + rxFullWidth = regexp.MustCompile(FullWidth) + rxHalfWidth = regexp.MustCompile(HalfWidth) + rxBase64 = regexp.MustCompile(Base64) + rxDataURI = regexp.MustCompile(DataURI) + rxMagnetURI = regexp.MustCompile(MagnetURI) + rxLatitude = regexp.MustCompile(Latitude) + rxLongitude = regexp.MustCompile(Longitude) + rxDNSName = regexp.MustCompile(DNSName) + rxURL = regexp.MustCompile(URL) + rxSSN = regexp.MustCompile(SSN) + rxWinPath = regexp.MustCompile(WinPath) + rxUnixPath = regexp.MustCompile(UnixPath) + rxSemver = regexp.MustCompile(Semver) + rxHasLowerCase = regexp.MustCompile(hasLowerCase) + rxHasUpperCase = regexp.MustCompile(hasUpperCase) + rxHasWhitespace = regexp.MustCompile(hasWhitespace) + rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) + rxIMEI = regexp.MustCompile(IMEI) ) diff --git a/vendor/github.com/asaskevich/govalidator/types.go b/vendor/github.com/asaskevich/govalidator/types.go index 4f7e9274ad..b57b666f57 100644 --- a/vendor/github.com/asaskevich/govalidator/types.go +++ b/vendor/github.com/asaskevich/govalidator/types.go @@ -16,6 +16,7 @@ type CustomTypeValidator func(i interface{}, o interface{}) bool // ParamValidator is a wrapper for validator functions that accepts additional parameters. type ParamValidator func(str string, params ...string) bool +type InterfaceParamValidator func(in interface{}, params ...string) bool type tagOptionsMap map[string]tagOption func (t tagOptionsMap) orderedKeys() []string { @@ -46,15 +47,27 @@ type UnsupportedTypeError struct { // It implements the methods to sort by string. 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 var ParamTagMap = map[string]ParamValidator{ - "length": ByteLength, - "range": Range, - "runelength": RuneLength, - "stringlength": StringLength, - "matches": StringMatches, - "in": isInRaw, - "rsapub": IsRsaPub, + "length": ByteLength, + "range": Range, + "runelength": RuneLength, + "stringlength": StringLength, + "matches": StringMatches, + "in": IsInRaw, + "rsapub": IsRsaPub, + "minstringlength": MinStringLength, + "maxstringlength": MaxStringLength, } // ParamTagRegexMap maps param tags to their respective regexes. @@ -66,6 +79,8 @@ var ParamTagRegexMap = map[string]*regexp.Regexp{ "in": regexp.MustCompile(`^in\((.*)\)`), "matches": regexp.MustCompile(`^matches\((.+)\)$`), "rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), + "minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"), + "maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"), } type customTypeTagMap struct { @@ -114,6 +129,7 @@ var TagMap = map[string]Validator{ "int": IsInt, "float": IsFloat, "null": IsNull, + "notnull": IsNotNull, "uuid": IsUUID, "uuidv3": IsUUIDv3, "uuidv4": IsUUIDv4, @@ -146,6 +162,7 @@ var TagMap = map[string]Validator{ "ISO3166Alpha2": IsISO3166Alpha2, "ISO3166Alpha3": IsISO3166Alpha3, "ISO4217": IsISO4217, + "IMEI": IsIMEI, } // ISO3166Entry stores country codes diff --git a/vendor/github.com/asaskevich/govalidator/utils.go b/vendor/github.com/asaskevich/govalidator/utils.go index a0b706a743..f4c30f824a 100644 --- a/vendor/github.com/asaskevich/govalidator/utils.go +++ b/vendor/github.com/asaskevich/govalidator/utils.go @@ -12,20 +12,20 @@ import ( "unicode/utf8" ) -// Contains check if the string contains the substring. +// Contains checks if the string contains the substring. func Contains(str, substring string) bool { 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 func Matches(str, pattern string) bool { match, _ := regexp.MatchString(pattern, str) return match } -// LeftTrim trim characters from the left-side of the input. -// If second argument is empty, it's will be remove leading spaces. +// LeftTrim trims characters from the left side of the input. +// If second argument is empty, it will remove leading spaces. func LeftTrim(str, chars string) string { if chars == "" { return strings.TrimLeftFunc(str, unicode.IsSpace) @@ -34,8 +34,8 @@ func LeftTrim(str, chars string) string { return r.ReplaceAllString(str, "") } -// RightTrim trim characters from the right-side of the input. -// If second argument is empty, it's will be remove spaces. +// RightTrim trims characters from the right side of the input. +// If second argument is empty, it will remove trailing spaces. func RightTrim(str, chars string) string { if chars == "" { return strings.TrimRightFunc(str, unicode.IsSpace) @@ -44,27 +44,27 @@ func RightTrim(str, chars string) string { return r.ReplaceAllString(str, "") } -// Trim trim characters from both sides of the input. -// If second argument is empty, it's will be remove spaces. +// Trim trims characters from both sides of the input. +// If second argument is empty, it will remove spaces. func Trim(str, chars string) string { 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 { pattern := "[^" + chars + "]+" r, _ := regexp.Compile(pattern) 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 { pattern := "[" + chars + "]+" r, _ := regexp.Compile(pattern) 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). func StripLow(str string, keepNewLines bool) string { chars := "" @@ -76,13 +76,13 @@ func StripLow(str string, keepNewLines bool) string { 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 { r, _ := regexp.Compile(pattern) return r.ReplaceAllString(str, replace) } -// Escape replace <, >, & and " with HTML entities. +// Escape replaces <, >, & and " with HTML entities. var Escape = html.EscapeString func addSegment(inrune, segment []rune) []rune { @@ -120,7 +120,7 @@ func CamelCaseToUnderscore(str string) string { return string(output) } -// Reverse return reversed string +// Reverse returns reversed string func Reverse(s string) string { r := []rune(s) 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) } -// 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 { 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) { lines := GetLines(s) if index < 0 || index >= len(lines) { @@ -143,12 +143,12 @@ func GetLine(s string, index int) (string, error) { return lines[index], nil } -// RemoveTags remove all tags from HTML string +// RemoveTags removes all tags from HTML string func RemoveTags(s string) string { 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 { name := strings.ToLower(str) name = path.Clean(path.Base(name)) @@ -210,23 +210,23 @@ func Truncate(str string, length int, ending string) string { 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 { 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 { 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 { 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 -// character +// PadString either left, right or both sides. +// 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 { // When padded length is less then the current string size diff --git a/vendor/github.com/asaskevich/govalidator/validator.go b/vendor/github.com/asaskevich/govalidator/validator.go index b18bbcb4c9..298f9920d3 100644 --- a/vendor/github.com/asaskevich/govalidator/validator.go +++ b/vendor/github.com/asaskevich/govalidator/validator.go @@ -282,7 +282,7 @@ func HasLowerCase(str string) bool { 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 { if IsNull(str) { return true @@ -321,14 +321,19 @@ func IsNull(str string) bool { 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 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 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. @@ -513,6 +518,11 @@ func IsDataURI(str string) bool { 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 func IsISO3166Alpha2(str string) bool { for _, entry := range ISO3166List { @@ -565,7 +575,7 @@ func IsDNSName(str string) bool { // 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'] func IsHash(str string, algorithm string) bool { - len := "0" + var len string algo := strings.ToLower(algorithm) if algo == "crc32" || algo == "crc32b" { @@ -589,9 +599,73 @@ func IsHash(str string, algorithm string) bool { 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 func IsDialString(str string) bool { - if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) { return true } @@ -599,7 +673,7 @@ func IsDialString(str string) bool { 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 { return net.ParseIP(str) != nil } @@ -663,6 +737,11 @@ func IsLongitude(str string) bool { 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 func IsRsaPublicKey(str string, keylen int) bool { bb := bytes.NewBufferString(str) @@ -729,12 +808,116 @@ func PrependPathToErrors(err error, path string) error { } return err2 } - fmt.Println(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. // 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) { if s == nil { return true, nil @@ -856,12 +1039,29 @@ func IsSemver(str string) bool { 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 func IsTime(str string, format string) bool { _, err := time.Parse(format, str) 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 func IsRFC3339(str string) bool { return IsTime(str, time.RFC3339) @@ -933,6 +1133,30 @@ func StringLength(str string, params ...string) bool { 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 func Range(str string, params ...string) bool { if len(params) == 2 { @@ -945,7 +1169,7 @@ func Range(str string, params ...string) bool { return false } -func isInRaw(str string, params ...string) bool { +func IsInRaw(str string, params ...string) bool { if len(params) == 1 { rawParams := params[0] @@ -1014,7 +1238,7 @@ func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options options = parseTagIntoMap(tag) } - if isEmptyValue(v) { + if !isFieldSet(v) { // an empty value is not validated, check only required isValid, resultErr = checkRequired(v, t, 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() { case reflect.Bool, 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) switch v.Kind() { - case reflect.String, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: + case reflect.String, + reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: field := fmt.Sprint(v) // make value into string, then validate with regex if result := validatefunc(field); !result && !negate || result && negate { 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) case reflect.Struct: - return ValidateStruct(v.Interface()) + return true, nil default: return false, &UnsupportedTypeError{v.Type()} } @@ -1212,25 +1475,14 @@ func stripParams(validatorString string) string { 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() { - case reflect.String, reflect.Array: - return v.Len() == 0 - 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() + case reflect.Map, reflect.Slice, 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 @@ -1252,11 +1504,11 @@ func ErrorsByField(e error) map[string]string { } // prototype for ValidateStruct - switch e.(type) { + switch e := e.(type) { case Error: - m[e.(Error).Name] = e.(Error).Err.Error() + m[e.Name] = e.Err.Error() case Errors: - for _, item := range e.(Errors).Errors() { + for _, item := range e.Errors() { n := ErrorsByField(item) for k, v := range n { m[k] = v diff --git a/vendor/github.com/asaskevich/govalidator/wercker.yml b/vendor/github.com/asaskevich/govalidator/wercker.yml index cac7a5fcf0..bc5f7b0864 100644 --- a/vendor/github.com/asaskevich/govalidator/wercker.yml +++ b/vendor/github.com/asaskevich/govalidator/wercker.yml @@ -12,4 +12,4 @@ build: - script: name: go test code: | - go test -race ./... + go test -race -v ./... diff --git a/vendor/github.com/fsnotify/fsnotify/.editorconfig b/vendor/github.com/fsnotify/fsnotify/.editorconfig index ba49e3c234..fad895851e 100644 --- a/vendor/github.com/fsnotify/fsnotify/.editorconfig +++ b/vendor/github.com/fsnotify/fsnotify/.editorconfig @@ -1,5 +1,12 @@ root = true -[*] +[*.go] indent_style = tab indent_size = 4 +insert_final_newline = true + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/vendor/github.com/fsnotify/fsnotify/.gitattributes b/vendor/github.com/fsnotify/fsnotify/.gitattributes new file mode 100644 index 0000000000..32f1001be0 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/.gitattributes @@ -0,0 +1 @@ +go.sum linguist-generated diff --git a/vendor/github.com/fsnotify/fsnotify/.travis.yml b/vendor/github.com/fsnotify/fsnotify/.travis.yml index 981d1bb813..a9c30165cd 100644 --- a/vendor/github.com/fsnotify/fsnotify/.travis.yml +++ b/vendor/github.com/fsnotify/fsnotify/.travis.yml @@ -2,29 +2,35 @@ sudo: false language: go go: - - 1.8.x - - 1.9.x - - tip + - "stable" + - "1.11.x" + - "1.10.x" + - "1.9.x" matrix: + include: + - go: "stable" + env: GOLINT=true allow_failures: - go: tip 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: - - go test -v --race ./... + - go test --race ./... after_script: - 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 ./... os: - linux - osx + - windows notifications: email: false diff --git a/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/fsnotify/fsnotify/LICENSE index f21e540800..e180c8fb05 100644 --- a/vendor/github.com/fsnotify/fsnotify/LICENSE +++ b/vendor/github.com/fsnotify/fsnotify/LICENSE @@ -1,5 +1,5 @@ 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 modification, are permitted provided that the following conditions are diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md index 3993207413..b2629e5229 100644 --- a/vendor/github.com/fsnotify/fsnotify/README.md +++ b/vendor/github.com/fsnotify/fsnotify/README.md @@ -10,16 +10,16 @@ go get -u golang.org/x/sys/... Cross platform: Windows, Linux, BSD and macOS. -|Adapter |OS |Status | -|----------|----------|----------| -|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| -|kqueue |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| -|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)| -|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)| -|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)| -|fanotify |Linux 2.6.37+ | | -|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)| -|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)| +| Adapter | OS | Status | +| --------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | +| inotify | Linux 2.6.27 or later, Android\* | Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify) | +| kqueue | BSD, macOS, iOS\* | Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify) | +| ReadDirectoryChangesW | Windows | Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify) | +| FSEvents | macOS | [Planned](https://github.com/fsnotify/fsnotify/issues/11) | +| FEN | Solaris 11 | [In Progress](https://github.com/fsnotify/fsnotify/issues/12) | +| fanotify | Linux 2.6.37+ | [Planned](https://github.com/fsnotify/fsnotify/issues/114) | +| USN Journals | Windows | [Maybe](https://github.com/fsnotify/fsnotify/issues/53) | +| Polling | *All* | [Maybe](https://github.com/fsnotify/fsnotify/issues/9) | \* 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`. +## 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 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. * 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 [#18]: https://github.com/fsnotify/fsnotify/issues/18 [#11]: https://github.com/fsnotify/fsnotify/issues/11 diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go index 190bf0de57..89cab046d1 100644 --- a/vendor/github.com/fsnotify/fsnotify/fsnotify.go +++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go @@ -63,4 +63,6 @@ func (e Event) String() string { } // Common errors that can be reported by a watcher -var ErrEventOverflow = errors.New("fsnotify queue overflow") +var ( + ErrEventOverflow = errors.New("fsnotify queue overflow") +) diff --git a/vendor/github.com/fsnotify/fsnotify/go.mod b/vendor/github.com/fsnotify/fsnotify/go.mod new file mode 100644 index 0000000000..ff11e13f22 --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/go.mod @@ -0,0 +1,5 @@ +module github.com/fsnotify/fsnotify + +go 1.13 + +require golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 diff --git a/vendor/github.com/fsnotify/fsnotify/go.sum b/vendor/github.com/fsnotify/fsnotify/go.sum new file mode 100644 index 0000000000..f60af9855d --- /dev/null +++ b/vendor/github.com/fsnotify/fsnotify/go.sum @@ -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= diff --git a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go index cc7db4b22e..b33f2b4d4b 100644 --- a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go +++ b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go @@ -40,12 +40,12 @@ func newFdPoller(fd int) (*fdPoller, error) { poller.fd = fd // Create epoll fd - poller.epfd, errno = unix.EpollCreate1(0) + poller.epfd, errno = unix.EpollCreate1(unix.EPOLL_CLOEXEC) if poller.epfd == -1 { return nil, errno } // 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 { return nil, errno } diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go index 7d8de14513..2306c4620b 100644 --- a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go +++ b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go @@ -8,4 +8,4 @@ package fsnotify 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 diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go index 9139e17161..870c4d6d18 100644 --- a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go +++ b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go @@ -9,4 +9,4 @@ package fsnotify import "golang.org/x/sys/unix" // note: this constant is not defined on BSD -const openMode = unix.O_EVTONLY +const openMode = unix.O_EVTONLY | unix.O_CLOEXEC diff --git a/vendor/github.com/go-openapi/analysis/.golangci.yml b/vendor/github.com/go-openapi/analysis/.golangci.yml index 76af8ab1c8..c3694fc6c0 100644 --- a/vendor/github.com/go-openapi/analysis/.golangci.yml +++ b/vendor/github.com/go-openapi/analysis/.golangci.yml @@ -25,3 +25,8 @@ linters: # linter rather than changing code that works. # see: https://github.com/kyoh86/scopelint/issues/4 - scopelint + - godox + - gocognit + - whitespace + - wsl + - funlen diff --git a/vendor/github.com/go-openapi/analysis/.travis.yml b/vendor/github.com/go-openapi/analysis/.travis.yml index 7ecf865c21..c0196e12a6 100644 --- a/vendor/github.com/go-openapi/analysis/.travis.yml +++ b/vendor/github.com/go-openapi/analysis/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on +- go get -u gotest.tools/gotestsum language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/analysis/analyzer.go b/vendor/github.com/go-openapi/analysis/analyzer.go index 4d98718c4e..9341002100 100644 --- a/vendor/github.com/go-openapi/analysis/analyzer.go +++ b/vendor/github.com/go-openapi/analysis/analyzer.go @@ -221,7 +221,7 @@ func (s *Spec) initialize() { s.analyzeItems("items", parameter.Items, refPref, "parameter") } if parameter.In == "body" && parameter.Schema != nil { - s.analyzeSchema("schema", *parameter.Schema, refPref) + s.analyzeSchema("schema", parameter.Schema, refPref) } if parameter.Pattern != "" { s.patterns.addParameterPattern(refPref, parameter.Pattern) @@ -246,12 +246,13 @@ func (s *Spec) initialize() { } } if response.Schema != nil { - s.analyzeSchema("schema", *response.Schema, refPref) + s.analyzeSchema("schema", response.Schema, refPref) } } - for name, schema := range s.spec.Definitions { - s.analyzeSchema(name, schema, "/definitions") + for name := range s.spec.Definitions { + schema := s.spec.Definitions[name] + s.analyzeSchema(name, &schema, "/definitions") } // TODO: after analyzing all things and flattening schemas etc // 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") } 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") if param.In == "body" && param.Schema != nil { - s.analyzeSchema("schema", *param.Schema, refPref) + s.analyzeSchema("schema", param.Schema, refPref) } } if op.Responses != nil { @@ -361,7 +362,7 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { } } 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 { @@ -380,17 +381,17 @@ func (s *Spec) analyzeOperation(method, path string, op *spec.Operation) { } } 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)) schRef := SchemaRef{ Name: name, - Schema: &schema, + Schema: schema, Ref: spec.MustCreateRef("#" + refURI), TopLevel: prefix == "/definitions", } @@ -408,28 +409,34 @@ func (s *Spec) analyzeSchema(name string, schema spec.Schema, prefix string) { } 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 { - s.analyzeSchema(k, v, slashpath.Join(refURI, "properties")) + v := v + s.analyzeSchema(k, &v, slashpath.Join(refURI, "properties")) } for k, v := range schema.PatternProperties { + v := v // NOTE: swagger 2.0 does not support PatternProperties. // 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")) } if len(schema.AllOf) > 0 { 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. // However it is possible to analyze this in a schema 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. // However it is possible to analyze this in a schema 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 { // NOTE: swagger 2.0 does not support "not" constructs. // 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 { - s.analyzeSchema("additionalProperties", *schema.AdditionalProperties.Schema, refURI) + s.analyzeSchema("additionalProperties", schema.AdditionalProperties.Schema, refURI) } if schema.AdditionalItems != nil && schema.AdditionalItems.Schema != nil { // NOTE: swagger 2.0 does not support AdditionalItems. // 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.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")) } } diff --git a/vendor/github.com/go-openapi/analysis/flatten.go b/vendor/github.com/go-openapi/analysis/flatten.go index ae1eef5d19..ab3f949c30 100644 --- a/vendor/github.com/go-openapi/analysis/flatten.go +++ b/vendor/github.com/go-openapi/analysis/flatten.go @@ -41,10 +41,11 @@ type FlattenOpts struct { BasePath string // Flattening options - Expand bool // If Expand is true, we skip flattening the spec and expand it instead - Minimal bool - Verbose bool - RemoveUnused bool + Expand bool // If Expand is true, we skip flattening the spec and expand it instead + Minimal bool + Verbose bool + RemoveUnused bool + ContinueOnError bool // Continues when facing some issues /* Extra keys */ _ struct{} // require keys @@ -135,6 +136,7 @@ func newContext() *context { // - ... // func Flatten(opts FlattenOpts) error { + debugLog("FlattenOpts: %#v", opts) // Make sure opts.BasePath is an absolute path if !filepath.IsAbs(opts.BasePath) { cwd, _ := os.Getwd() @@ -148,7 +150,9 @@ func Flatten(opts FlattenOpts) error { // recursively expand responses, parameters, path items and items in simple schemas. // 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 } @@ -846,7 +850,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) { enums: enumAnalysis{}, } partialAnalyzer.reset() - partialAnalyzer.analyzeSchema("", *sch, "/") + partialAnalyzer.analyzeSchema("", sch, "/") // now rewrite those refs with rebase for key, ref := range partialAnalyzer.references.allRefs { @@ -874,6 +878,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) { if _, ok := opts.flattenContext.newRefs[key]; ok { resolved = opts.flattenContext.newRefs[key].resolved } + debugLog("keeping track of ref: %s (%s), resolved: %t", key, newName, resolved) opts.flattenContext.newRefs[key] = &newRef{ key: key, newName: newName, @@ -1308,16 +1313,55 @@ func stripPointersAndOAIGen(opts *FlattenOpts) error { return err } - // restrip + // restrip and re-analyze if hasIntroducedPointerOrInline, ers = stripOAIGen(opts); ers != nil { return ers } - - opts.Spec.reload() // re-analyze } 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. // // 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 // 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. func stripOAIGen(opts *FlattenOpts) (bool, error) { debugLog("stripOAIGen") 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 { - if !r.isOAIGen || r.resolved { // bail on already resolved entries (avoid looping) - 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) - } - } + updateRefParents(opts, r) } - for k := range opts.flattenContext.newRefs { r := opts.flattenContext.newRefs[k] - //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()) + 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()) if r.isOAIGen && len(r.parents) >= 1 { - pr := r.parents - sort.Strings(pr) + pr := topmostFirst(r.parents) - // rewrite first parent schema in lexicographical order - debugLog("rewrite first parent in lex order %s with schema", pr[0]) + // rewrite first parent schema in hierarchical then lexicographical order + debugLog("rewrite first parent %s with schema", pr[0]) if err := updateRefWithSchema(opts.Swagger(), pr[0], r.schema); err != nil { return false, err } diff --git a/vendor/github.com/go-openapi/analysis/go.mod b/vendor/github.com/go-openapi/analysis/go.mod index 6c8e58577c..8dea2d9910 100644 --- a/vendor/github.com/go-openapi/analysis/go.mod +++ b/vendor/github.com/go-openapi/analysis/go.mod @@ -1,13 +1,23 @@ module github.com/go-openapi/analysis 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/jsonreference v0.19.3 // indirect github.com/go-openapi/loads v0.19.0 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/strfmt v0.19.3 - github.com/go-openapi/swag v0.19.5 + github.com/go-openapi/spec v0.19.6 + github.com/go-openapi/strfmt v0.19.4 + 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 - 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 diff --git a/vendor/github.com/go-openapi/analysis/go.sum b/vendor/github.com/go-openapi/analysis/go.sum index 8e8b5f9bc4..82636eaebe 100644 --- a/vendor/github.com/go-openapi/analysis/go.sum +++ b/vendor/github.com/go-openapi/analysis/go.sum @@ -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.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= 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-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-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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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.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.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.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= 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.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= 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/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.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.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.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.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 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.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/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/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/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 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/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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 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-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= 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/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/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/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.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= 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/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/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.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-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/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-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-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/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-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-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/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/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-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= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 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= diff --git a/vendor/github.com/go-openapi/analysis/mixin.go b/vendor/github.com/go-openapi/analysis/mixin.go index 625c46f8f9..d5797042a7 100644 --- a/vendor/github.com/go-openapi/analysis/mixin.go +++ b/vendor/github.com/go-openapi/analysis/mixin.go @@ -332,6 +332,9 @@ func mergeSwaggerProps(primary *spec.Swagger, m *spec.Swagger) []string { if primary.Info.Contact == nil { primary.Info.Contact = m.Info.Contact } 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 == "" { 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 { primary.Info.License = m.Info.License } 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 == "" { primary.Info.License.Name = m.Info.License.Name } diff --git a/vendor/github.com/go-openapi/errors/.travis.yml b/vendor/github.com/go-openapi/errors/.travis.yml index ba8a6d5918..119ec69818 100644 --- a/vendor/github.com/go-openapi/errors/.travis.yml +++ b/vendor/github.com/go-openapi/errors/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/errors/go.mod b/vendor/github.com/go-openapi/errors/go.mod index 084143001f..d7a9030ab6 100644 --- a/vendor/github.com/go-openapi/errors/go.mod +++ b/vendor/github.com/go-openapi/errors/go.mod @@ -1,6 +1,12 @@ module github.com/go-openapi/errors +go 1.14 + require ( - github.com/stretchr/objx v0.2.0 // indirect - github.com/stretchr/testify v1.3.0 + github.com/davecgh/go-spew v1.1.1 // indirect + 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 ) diff --git a/vendor/github.com/go-openapi/errors/go.sum b/vendor/github.com/go-openapi/errors/go.sum index e7314e279f..ecd91c75b1 100644 --- a/vendor/github.com/go-openapi/errors/go.sum +++ b/vendor/github.com/go-openapi/errors/go.sum @@ -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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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/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/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 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= diff --git a/vendor/github.com/go-openapi/errors/parsing.go b/vendor/github.com/go-openapi/errors/parsing.go index 1bae87302a..0f96ce2094 100644 --- a/vendor/github.com/go-openapi/errors/parsing.go +++ b/vendor/github.com/go-openapi/errors/parsing.go @@ -16,7 +16,7 @@ package errors import "fmt" -// ParseError respresents a parsing error +// ParseError represents a parsing error type ParseError struct { code int32 Name string diff --git a/vendor/github.com/go-openapi/errors/schema.go b/vendor/github.com/go-openapi/errors/schema.go index 14fb2c5f11..1c0be5f2ac 100644 --- a/vendor/github.com/go-openapi/errors/schema.go +++ b/vendor/github.com/go-openapi/errors/schema.go @@ -268,7 +268,7 @@ func DuplicateItems(name, in string) *Validation { } // 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) if in == "" { msg = fmt.Sprintf(maxItemsFailNoIn, name, max) @@ -278,12 +278,13 @@ func TooManyItems(name, in string, max int64) *Validation { code: MaxItemsFailCode, Name: name, In: in, + Value: value, message: msg, } } // 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) if in == "" { msg = fmt.Sprintf(minItemsFailNoIn, name, min) @@ -292,12 +293,13 @@ func TooFewItems(name, in string, min int64) *Validation { code: MinItemsFailCode, Name: name, In: in, + Value: value, message: msg, } } -// ExceedsMaximumInt error for when maxinum validation fails -func ExceedsMaximumInt(name, in string, max int64, exclusive bool) *Validation { +// ExceedsMaximumInt error for when maximum validation fails +func ExceedsMaximumInt(name, in string, max int64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := maxIncFailNoIn @@ -316,13 +318,13 @@ func ExceedsMaximumInt(name, in string, max int64, exclusive bool) *Validation { code: MaxFailCode, Name: name, In: in, - Value: max, + Value: value, message: message, } } -// ExceedsMaximumUint error for when maxinum validation fails -func ExceedsMaximumUint(name, in string, max uint64, exclusive bool) *Validation { +// ExceedsMaximumUint error for when maximum validation fails +func ExceedsMaximumUint(name, in string, max uint64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := maxIncFailNoIn @@ -341,13 +343,13 @@ func ExceedsMaximumUint(name, in string, max uint64, exclusive bool) *Validation code: MaxFailCode, Name: name, In: in, - Value: max, + Value: value, message: message, } } -// ExceedsMaximum error for when maxinum validation fails -func ExceedsMaximum(name, in string, max float64, exclusive bool) *Validation { +// ExceedsMaximum error for when maximum validation fails +func ExceedsMaximum(name, in string, max float64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := maxIncFailNoIn @@ -366,13 +368,13 @@ func ExceedsMaximum(name, in string, max float64, exclusive bool) *Validation { code: MaxFailCode, Name: name, In: in, - Value: max, + Value: value, message: message, } } -// ExceedsMinimumInt error for when maxinum validation fails -func ExceedsMinimumInt(name, in string, min int64, exclusive bool) *Validation { +// ExceedsMinimumInt error for when minimum validation fails +func ExceedsMinimumInt(name, in string, min int64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -391,13 +393,13 @@ func ExceedsMinimumInt(name, in string, min int64, exclusive bool) *Validation { code: MinFailCode, Name: name, In: in, - Value: min, + Value: value, message: message, } } -// ExceedsMinimumUint error for when maxinum validation fails -func ExceedsMinimumUint(name, in string, min uint64, exclusive bool) *Validation { +// ExceedsMinimumUint error for when minimum validation fails +func ExceedsMinimumUint(name, in string, min uint64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -416,13 +418,13 @@ func ExceedsMinimumUint(name, in string, min uint64, exclusive bool) *Validation code: MinFailCode, Name: name, In: in, - Value: min, + Value: value, message: message, } } -// ExceedsMinimum error for when maxinum validation fails -func ExceedsMinimum(name, in string, min float64, exclusive bool) *Validation { +// ExceedsMinimum error for when minimum validation fails +func ExceedsMinimum(name, in string, min float64, exclusive bool, value interface{}) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -441,13 +443,13 @@ func ExceedsMinimum(name, in string, min float64, exclusive bool) *Validation { code: MinFailCode, Name: name, In: in, - Value: min, + Value: value, message: message, } } // 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 if in == "" { msg = fmt.Sprintf(multipleOfFailNoIn, name, multiple) @@ -458,7 +460,7 @@ func NotMultipleOf(name, in string, multiple interface{}) *Validation { code: MultipleOfFailCode, Name: name, In: in, - Value: multiple, + Value: value, message: msg, } } @@ -483,7 +485,7 @@ func EnumFail(name, in string, value interface{}, values []interface{}) *Validat } // 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 if in == "" { msg = fmt.Sprintf(requiredFailNoIn, name) @@ -494,12 +496,13 @@ func Required(name, in string) *Validation { code: RequiredFailCode, Name: name, In: in, + Value: value, message: msg, } } // 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 if in == "" { msg = fmt.Sprintf(tooLongMessageNoIn, name, max) @@ -510,12 +513,13 @@ func TooLong(name, in string, max int64) *Validation { code: TooLongFailCode, Name: name, In: in, + Value: value, message: msg, } } // 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 if in == "" { msg = fmt.Sprintf(tooShortMessageNoIn, name, min) @@ -527,13 +531,14 @@ func TooShort(name, in string, min int64) *Validation { code: TooShortFailCode, Name: name, In: in, + Value: value, message: msg, } } // 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. -func FailedPattern(name, in, pattern string) *Validation { +func FailedPattern(name, in, pattern string, value interface{}) *Validation { var msg string if in == "" { msg = fmt.Sprintf(patternFailNoIn, name, pattern) @@ -545,6 +550,7 @@ func FailedPattern(name, in, pattern string) *Validation { code: PatternFailCode, Name: name, In: in, + Value: value, message: msg, } } diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md index 66345f4c61..b94753aa52 100644 --- a/vendor/github.com/go-openapi/jsonreference/README.md +++ b/vendor/github.com/go-openapi/jsonreference/README.md @@ -4,7 +4,7 @@ An implementation of JSON Reference - Go language ## Status -Work in progress ( 90% done ) +Feature complete. Stable API ## Dependencies https://github.com/go-openapi/jsonpointer diff --git a/vendor/github.com/go-openapi/jsonreference/go.mod b/vendor/github.com/go-openapi/jsonreference/go.mod index aff1d0163e..e6c2ec4d92 100644 --- a/vendor/github.com/go-openapi/jsonreference/go.mod +++ b/vendor/github.com/go-openapi/jsonreference/go.mod @@ -6,7 +6,7 @@ require ( github.com/go-openapi/jsonpointer v0.19.3 github.com/stretchr/testify v1.3.0 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 diff --git a/vendor/github.com/go-openapi/jsonreference/go.sum b/vendor/github.com/go-openapi/jsonreference/go.sum index c7ceab5802..b37f873e55 100644 --- a/vendor/github.com/go-openapi/jsonreference/go.sum +++ b/vendor/github.com/go-openapi/jsonreference/go.sum @@ -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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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/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/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 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/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 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/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/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/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +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= 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= diff --git a/vendor/github.com/go-openapi/loads/.travis.yml b/vendor/github.com/go-openapi/loads/.travis.yml index 8a7e05d911..6bf906ec09 100644 --- a/vendor/github.com/go-openapi/loads/.travis.yml +++ b/vendor/github.com/go-openapi/loads/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: -- GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on +- go get -u gotest.tools/gotestsum language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/loads/go.mod b/vendor/github.com/go-openapi/loads/go.mod index 29351d5881..54e5d98c92 100644 --- a/vendor/github.com/go-openapi/loads/go.mod +++ b/vendor/github.com/go-openapi/loads/go.mod @@ -1,11 +1,11 @@ module github.com/go-openapi/loads require ( - github.com/go-openapi/analysis v0.19.5 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/swag v0.19.5 + github.com/go-openapi/analysis v0.19.10 + github.com/go-openapi/spec v0.19.6 + github.com/go-openapi/swag v0.19.7 github.com/stretchr/testify v1.3.0 - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.2.8 ) go 1.13 diff --git a/vendor/github.com/go-openapi/loads/go.sum b/vendor/github.com/go-openapi/loads/go.sum index ac9e61b2ef..ec9a401025 100644 --- a/vendor/github.com/go-openapi/loads/go.sum +++ b/vendor/github.com/go-openapi/loads/go.sum @@ -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.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= 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-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-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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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/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.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.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.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.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= 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.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= 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/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/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.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 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.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/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/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/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 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/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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 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-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= 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/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/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/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.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= 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/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/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.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-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/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-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-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/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-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-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/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/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-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= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 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= diff --git a/vendor/github.com/go-openapi/runtime/.travis.yml b/vendor/github.com/go-openapi/runtime/.travis.yml index 2fc7b58ff2..e36276ab3f 100644 --- a/vendor/github.com/go-openapi/runtime/.travis.yml +++ b/vendor/github.com/go-openapi/runtime/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/runtime/client_request.go b/vendor/github.com/go-openapi/runtime/client_request.go index 904196ae3e..6215e0a1c1 100644 --- a/vendor/github.com/go-openapi/runtime/client_request.go +++ b/vendor/github.com/go-openapi/runtime/client_request.go @@ -41,7 +41,7 @@ type ClientRequestWriter interface { // add information to a swagger client request type ClientRequest interface { SetHeaderParam(string, ...string) error - + GetHeaderParams() http.Header SetQueryParam(string, ...string) error diff --git a/vendor/github.com/go-openapi/runtime/client_response.go b/vendor/github.com/go-openapi/runtime/client_response.go index 729e18b228..d97e0ac64f 100644 --- a/vendor/github.com/go-openapi/runtime/client_response.go +++ b/vendor/github.com/go-openapi/runtime/client_response.go @@ -17,6 +17,8 @@ package runtime import ( "fmt" "io" + + "encoding/json" ) // A ClientResponse represents a client response @@ -59,5 +61,10 @@ type APIError struct { } 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() } diff --git a/vendor/github.com/go-openapi/runtime/go.mod b/vendor/github.com/go-openapi/runtime/go.mod index cfeacb7972..3effc2817e 100644 --- a/vendor/github.com/go-openapi/runtime/go.mod +++ b/vendor/github.com/go-openapi/runtime/go.mod @@ -2,15 +2,16 @@ module github.com/go-openapi/runtime require ( github.com/docker/go-units v0.4.0 - github.com/go-openapi/analysis v0.19.5 - github.com/go-openapi/errors v0.19.2 - github.com/go-openapi/loads v0.19.3 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/strfmt v0.19.3 - github.com/go-openapi/swag v0.19.5 - github.com/go-openapi/validate v0.19.3 - github.com/stretchr/testify v1.4.0 - gopkg.in/yaml.v2 v2.2.2 + github.com/go-openapi/analysis v0.19.10 + github.com/go-openapi/errors v0.19.6 + github.com/go-openapi/loads v0.19.5 + github.com/go-openapi/spec v0.19.8 + github.com/go-openapi/strfmt v0.19.5 + github.com/go-openapi/swag v0.19.9 + github.com/go-openapi/validate v0.19.10 + github.com/stretchr/testify v1.6.1 + gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect ) go 1.13 diff --git a/vendor/github.com/go-openapi/runtime/go.sum b/vendor/github.com/go-openapi/runtime/go.sum index f068235195..5cadebb499 100644 --- a/vendor/github.com/go-openapi/runtime/go.sum +++ b/vendor/github.com/go-openapi/runtime/go.sum @@ -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/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 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-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-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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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.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.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.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.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= 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.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= 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.18.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.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.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.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.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= 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.19.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= 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/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.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= 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.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.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.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= 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.19.2 h1:ky5l57HjyVRrsJfd2+Ro5Z9PjGuKbsmftwyMtk8H7js= 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/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/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/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 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/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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 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/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/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 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-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= 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/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/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/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.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 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/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.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= 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-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-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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-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-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/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-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-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-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= 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-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-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 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-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.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 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= diff --git a/vendor/github.com/go-openapi/runtime/logger/logger.go b/vendor/github.com/go-openapi/runtime/logger/logger.go index d62c1f708f..6f4debcc14 100644 --- a/vendor/github.com/go-openapi/runtime/logger/logger.go +++ b/vendor/github.com/go-openapi/runtime/logger/logger.go @@ -8,5 +8,13 @@ type Logger interface { } 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 } diff --git a/vendor/github.com/go-openapi/runtime/middleware/context.go b/vendor/github.com/go-openapi/runtime/middleware/context.go index 54a8c21f15..fba5748db5 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/context.go +++ b/vendor/github.com/go-openapi/runtime/middleware/context.go @@ -21,16 +21,16 @@ import ( "strings" "sync" - "github.com/go-openapi/runtime/security" - "github.com/go-openapi/analysis" "github.com/go-openapi/errors" "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/logger" "github.com/go-openapi/runtime/middleware/untyped" - "github.com/go-openapi/spec" - "github.com/go-openapi/strfmt" + "github.com/go-openapi/runtime/security" ) // 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 func (c *Context) BindValidRequest(request *http.Request, route *MatchedRoute, binder RequestBinder) error { var res []error + var requestContentType string - requestContentType := "*/*" // check and validate content type, select consumer if runtime.HasBody(request) { 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 - 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 == "" { 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, ctxSecurityScopes, route.Authenticator.AllScopes()) 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")) } +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 func (c *Context) APIHandler(builder Builder) http.Handler { b := builder diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go index 73703fddec..ecacc31ff6 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go +++ b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go @@ -17,6 +17,9 @@ const ( // TerminationCharacter is a special character for end of path. TerminationCharacter = '#' + // SeparatorCharacter separates path segments. + SeparatorCharacter = '/' + // MaxSize is max size of records and internal slice. MaxSize = (1 << 22) - 1 ) @@ -420,10 +423,11 @@ type record struct { // makeRecords returns the records that use to build Double-Arrays. func makeRecords(srcs []Record) (statics, params []*record) { - spChars := string([]byte{ParamCharacter, WildcardCharacter}) termChar := string(TerminationCharacter) + paramPrefix := string(SeparatorCharacter) + string(ParamCharacter) + wildcardPrefix := string(SeparatorCharacter) + string(WildcardCharacter) for _, r := range srcs { - if strings.ContainsAny(r.Key, spChars) { + if strings.Contains(r.Key, paramPrefix) || strings.Contains(r.Key, wildcardPrefix) { r.Key += termChar params = append(params, &record{Record: r}) } else { diff --git a/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go b/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go index 466f553db4..bc6942a0f1 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go +++ b/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go @@ -38,11 +38,30 @@ func (e *errorResp) WriteResponse(rw http.ResponseWriter, producer runtime.Produ rw.WriteHeader(http.StatusInternalServerError) } 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 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, + } } diff --git a/vendor/github.com/go-openapi/runtime/middleware/parameter.go b/vendor/github.com/go-openapi/runtime/middleware/parameter.go index 8975b6e1c8..8fa0cf4e46 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/parameter.go +++ b/vendor/github.com/go-openapi/runtime/middleware/parameter.go @@ -24,11 +24,12 @@ import ( "strconv" "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" "github.com/go-openapi/spec" "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" "github.com/go-openapi/validate" + + "github.com/go-openapi/runtime" ) 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 { - return errors.Required(p.Name, p.parameter.In) + return errors.Required(p.Name, p.parameter.In, 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 { sz := len(data) 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()) diff --git a/vendor/github.com/go-openapi/runtime/middleware/redoc.go b/vendor/github.com/go-openapi/runtime/middleware/redoc.go index 21277948c0..019c854295 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/redoc.go +++ b/vendor/github.com/go-openapi/runtime/middleware/redoc.go @@ -16,7 +16,7 @@ type RedocOpts struct { Path string // SpecURL the url to find the spec for 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 // Title for the documentation site, default to: API documentation Title string @@ -74,13 +74,15 @@ func Redoc(opts RedocOpts, next http.Handler) http.Handler { } 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> <html> <head> <title>{{ .Title }}</title> - <!-- needed for adaptive design --> - <meta name="viewport" content="width=device-width, initial-scale=1"> + <!-- needed for adaptive design --> + <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 diff --git a/vendor/github.com/go-openapi/runtime/middleware/request.go b/vendor/github.com/go-openapi/runtime/middleware/request.go index ee725f587a..760c37861d 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/request.go +++ b/vendor/github.com/go-openapi/runtime/middleware/request.go @@ -19,26 +19,27 @@ import ( "reflect" "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" "github.com/go-openapi/spec" "github.com/go-openapi/strfmt" + + "github.com/go-openapi/runtime" ) -// RequestBinder binds and validates the data from a http request -type untypedRequestBinder struct { +// UntypedRequestBinder binds and validates the data from a http request +type UntypedRequestBinder struct { Spec *spec.Swagger Parameters map[string]spec.Parameter Formats strfmt.Registry paramBinders map[string]*untypedParamBinder } -// NewRequestBinder creates a new binder for reading a request. -func newUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Swagger, formats strfmt.Registry) *untypedRequestBinder { +// NewUntypedRequestBinder creates a new binder for reading a request. +func NewUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Swagger, formats strfmt.Registry) *UntypedRequestBinder { binders := make(map[string]*untypedParamBinder) for fieldName, param := range parameters { binders[fieldName] = newUntypedParamBinder(param, spec, formats) } - return &untypedRequestBinder{ + return &UntypedRequestBinder{ Parameters: parameters, paramBinders: binders, Spec: spec, @@ -47,7 +48,7 @@ func newUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Sw } // 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)) isMap := val.Kind() == reflect.Map var result []error @@ -71,7 +72,6 @@ func (o *untypedRequestBinder) Bind(request *http.Request, routeParams RoutePara } } target = reflect.Indirect(reflect.New(tpe)) - } if !target.IsValid() { diff --git a/vendor/github.com/go-openapi/runtime/middleware/router.go b/vendor/github.com/go-openapi/runtime/middleware/router.go index 539d8471a8..02768bade2 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/router.go +++ b/vendor/github.com/go-openapi/runtime/middleware/router.go @@ -26,10 +26,11 @@ import ( "github.com/go-openapi/analysis" "github.com/go-openapi/errors" "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/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. @@ -290,7 +291,7 @@ type routeEntry struct { Parameters map[string]spec.Parameter Handler http.Handler Formats strfmt.Registry - Binder *untypedRequestBinder + Binder *UntypedRequestBinder Authenticators RouteAuthenticators Authorizer runtime.Authorizer } @@ -428,7 +429,7 @@ func (d *defaultRouteBuilder) AddRoute(method, path string, operation *spec.Oper Producers: d.api.ProducersFor(normalizeOffers(produces)), Parameters: parameters, 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), Authorizer: d.api.Authorizer(), }) diff --git a/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go b/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go new file mode 100644 index 0000000000..2c92f5c91f --- /dev/null +++ b/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go @@ -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> +` +) diff --git a/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go b/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go index 8226b1ed1c..39a85f7d9e 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go +++ b/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go @@ -23,9 +23,10 @@ import ( "github.com/go-openapi/analysis" "github.com/go-openapi/errors" "github.com/go-openapi/loads" - "github.com/go-openapi/runtime" "github.com/go-openapi/spec" "github.com/go-openapi/strfmt" + + "github.com/go-openapi/runtime" ) // 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 { - sort.Strings(registrations) sort.Strings(expectations) diff --git a/vendor/github.com/go-openapi/runtime/middleware/validation.go b/vendor/github.com/go-openapi/runtime/middleware/validation.go index bb8df3cb3d..1f0135b578 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/validation.go +++ b/vendor/github.com/go-openapi/runtime/middleware/validation.go @@ -20,8 +20,9 @@ import ( "strings" "github.com/go-openapi/errors" - "github.com/go-openapi/runtime" "github.com/go-openapi/swag" + + "github.com/go-openapi/runtime" ) type validation struct { @@ -115,7 +116,10 @@ func (v *validation) contentType() { } 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.result = append(v.result, errors.InvalidResponseFormat(v.request.Header.Get(runtime.HeaderAccept), v.route.Produces)) } diff --git a/vendor/github.com/go-openapi/runtime/security/authenticator.go b/vendor/github.com/go-openapi/runtime/security/authenticator.go index 5d058b8d1f..476d26c3e7 100644 --- a/vendor/github.com/go-openapi/runtime/security/authenticator.go +++ b/vendor/github.com/go-openapi/runtime/security/authenticator.go @@ -20,6 +20,7 @@ import ( "strings" "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" ) diff --git a/vendor/github.com/go-openapi/spec/.golangci.yml b/vendor/github.com/go-openapi/spec/.golangci.yml index 3e33f9f2e3..4e17ed4979 100644 --- a/vendor/github.com/go-openapi/spec/.golangci.yml +++ b/vendor/github.com/go-openapi/spec/.golangci.yml @@ -21,3 +21,8 @@ linters: - lll - gochecknoinits - gochecknoglobals + - funlen + - godox + - gocognit + - whitespace + - wsl diff --git a/vendor/github.com/go-openapi/spec/.travis.yml b/vendor/github.com/go-openapi/spec/.travis.yml index aa26d8763a..f1a3f80b35 100644 --- a/vendor/github.com/go-openapi/spec/.travis.yml +++ b/vendor/github.com/go-openapi/spec/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/spec/bindata.go b/vendor/github.com/go-openapi/spec/bindata.go index c67e2d877b..66b1f32635 100644 --- a/vendor/github.com/go-openapi/spec/bindata.go +++ b/vendor/github.com/go-openapi/spec/bindata.go @@ -1,7 +1,7 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: // schemas/jsonschema-draft-04.json (4.357kB) -// schemas/v2/schema.json (40.249kB) +// schemas/v2/schema.json (40.248kB) package spec @@ -70,43 +70,43 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _jsonschemaDraft04JSON = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x3d\x6f\xdb\x3c\x10\xde\xf3\x2b\x08\x26\x63\xf2\x2a\x2f\xd0\xc9\x5b\xd1\x2e\x01\x5a\x34\x43\x37\x23\x03\x6d\x9d\x6c\x06\x14\xa9\x50\x54\x60\xc3\xd0\x7f\x2f\x28\x4a\x14\x29\x91\x92\x2d\xa7\x8d\x97\x28\xbc\xaf\xe7\x8e\xf7\xc5\xd3\x0d\x42\x08\x61\x9a\xe2\x15\xc2\x7b\xa5\x8a\x55\x92\xbc\x96\x82\x3f\x94\xdb\x3d\xe4\xe4\x3f\x21\x77\x49\x2a\x49\xa6\x1e\x1e\xbf\x24\xe6\xec\x16\xdf\x1b\xa1\x3b\xf3\xff\x02\xc9\x14\xca\xad\xa4\x85\xa2\x82\x6b\xe9\x6f\x42\x02\x32\x2c\x28\x07\x45\x5a\x15\x3d\x77\x46\x39\xd5\xcc\x25\x5e\x21\x83\xb8\x21\x18\xb6\xaf\x52\x92\xa3\x47\x68\x88\xea\x58\x80\x56\x4e\x1a\xf2\xbd\x4f\xcc\x29\x7f\x52\x90\x6b\x7d\xff\x0f\x48\xb4\x3d\x3f\x21\x7c\x27\x21\xd3\x2a\x6e\x31\xaa\x2d\x53\xdd\xf3\xe3\x42\x94\x54\xd1\x77\x78\xe2\x0a\x76\x20\xe3\x20\x68\xcb\x30\x86\x41\xf3\x2a\xc7\x2b\xf4\x78\x8e\xfe\xef\x90\x91\x8a\xa9\xc7\xb1\x1d\xc2\xd8\x2f\x0d\x75\xed\xc1\x4e\x9c\xc8\x25\x43\xac\xa8\xbe\xd7\xcc\xa9\xd1\xa9\x21\xa0\x1a\xbd\x04\x61\x94\x34\x2f\x18\xfc\x3e\x16\x50\x8e\x4d\x03\x6f\x1c\x58\xdb\x48\x23\xbc\x11\x82\x01\xe1\xfa\xd3\x3a\x8e\x30\xaf\x18\x33\x7f\xf3\x8d\x39\x11\x9b\x57\xd8\x2a\xfd\x55\x2a\x49\xf9\x0e\xc7\xec\x37\xd4\x25\xf7\xec\x5c\x66\xc7\xd7\x99\xaa\xcf\x4f\x89\x8a\xd3\xb7\x0a\x3a\xaa\x92\x15\xf4\x30\x6f\x1c\xb0\xd6\x46\xe7\x98\x39\x2d\xa4\x28\x40\x2a\x3a\x88\x9e\x29\xba\x88\x37\x2d\xca\x60\x38\xfa\xba\x5b\x20\xac\xa8\x62\xb0\x4c\xd4\xaf\xda\x45\x0a\xba\x5c\x3b\xb9\xc7\x79\xc5\x14\x2d\x18\x34\x19\x1c\x51\xdb\x25\x4d\xb4\x7e\x06\x14\x38\x6c\x59\x55\xd2\x77\xf8\x69\x59\xfc\x7b\x73\xed\x93\x43\xcb\x32\x6d\x3c\x28\xdc\x1b\x9a\xd3\x62\xab\xc2\x27\xf7\x41\xc9\x08\x2b\x23\x08\xad\x13\x57\x21\x9c\xd3\x72\x0d\x42\x72\xf8\x01\x7c\xa7\xf6\x83\xce\x39\xd7\x82\x3c\x1f\x2f\xd6\x60\x1b\xa2\xdf\x35\x89\x52\x20\xe7\x73\x74\xe0\x66\x26\x64\x4e\xb4\x97\x58\xc2\x0e\x0e\xe1\x60\x92\x34\x6d\xa0\x10\xd6\xb5\x83\x61\x27\xe6\x47\xd3\x89\xbd\x63\xfd\x3b\x8d\x03\x3d\x6c\x42\x2d\x5b\x70\xee\xe8\xdf\x4b\xf4\x66\x4e\xe1\x01\x45\x17\x80\x74\xad\x4f\xc3\xf3\xae\xc6\x1d\xc6\xd7\xc2\xce\xc9\xe1\x29\x30\x86\x2f\x4a\xa6\x4b\x15\x84\x73\xc9\x6f\xfd\x7f\xa5\x6e\x9e\xbd\xf1\xb0\xd4\xdd\x45\x5a\xc2\x3e\x4b\x78\xab\xa8\x84\x74\x4a\x91\x3b\x92\x23\x05\xf2\x1c\x1e\x7b\xf3\x09\xf8\xcf\xab\x24\xb6\x60\xa2\xe8\x4c\x9f\x75\x77\xaa\x8c\xe6\x01\x45\x36\x86\xcf\xc3\x63\x3a\xea\xd4\x8d\x7e\x06\xac\x14\x0a\xe0\x29\xf0\xed\x07\x22\x1a\x65\xda\x44\xae\xa2\x73\x1a\xe6\x90\x69\xa2\x8c\x46\xb2\x2f\xde\x49\x38\x08\xed\xfe\xfd\x41\xaf\x9f\xa9\x55\xd7\xdd\x22\x8d\xfa\x45\x63\xc5\x0f\x80\xf3\xb4\x08\xd6\x79\x30\x9e\x93\xee\x59\xa6\xd0\x4b\xee\x22\xe3\x33\xc1\x3a\x27\x68\x36\x78\x7e\x87\x0a\x06\xd5\x2e\x20\xd3\xaf\x15\xfb\xd8\x3b\x73\x14\xbb\x92\xed\x05\x5d\x2e\x29\x38\x2c\x94\xe4\x42\x45\x5e\xd3\xb5\x7d\xdf\x47\xca\x38\xb4\x5c\xaf\xfb\x7d\xdd\x6d\xf4\xa1\x2d\x77\xdd\x2f\xce\x6d\xc4\x7b\x8b\x4e\x67\xa9\x6f\xfe\x04\x00\x00\xff\xff\xb1\xd1\x27\x78\x05\x11\x00\x00") +var _jsonschemaDraft04Json = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x57\x3d\x6f\xdb\x3c\x10\xde\xf3\x2b\x08\x26\x63\xf2\x2a\x2f\xd0\xc9\x5b\xd1\x2e\x01\x5a\x34\x43\x37\x23\x03\x6d\x9d\x6c\x06\x14\xa9\x50\x54\x60\xc3\xd0\x7f\x2f\x28\x4a\x14\x29\x91\x92\x2d\xa7\x8d\x97\x28\xbc\xaf\xe7\x8e\xf7\xc5\xd3\x0d\x42\x08\x61\x9a\xe2\x15\xc2\x7b\xa5\x8a\x55\x92\xbc\x96\x82\x3f\x94\xdb\x3d\xe4\xe4\x3f\x21\x77\x49\x2a\x49\xa6\x1e\x1e\xbf\x24\xe6\xec\x16\xdf\x1b\xa1\x3b\xf3\xff\x02\xc9\x14\xca\xad\xa4\x85\xa2\x82\x6b\xe9\x6f\x42\x02\x32\x2c\x28\x07\x45\x5a\x15\x3d\x77\x46\x39\xd5\xcc\x25\x5e\x21\x83\xb8\x21\x18\xb6\xaf\x52\x92\xa3\x47\x68\x88\xea\x58\x80\x56\x4e\x1a\xf2\xbd\x4f\xcc\x29\x7f\x52\x90\x6b\x7d\xff\x0f\x48\xb4\x3d\x3f\x21\x7c\x27\x21\xd3\x2a\x6e\x31\xaa\x2d\x53\xdd\xf3\xe3\x42\x94\x54\xd1\x77\x78\xe2\x0a\x76\x20\xe3\x20\x68\xcb\x30\x86\x41\xf3\x2a\xc7\x2b\xf4\x78\x8e\xfe\xef\x90\x91\x8a\xa9\xc7\xb1\x1d\xc2\xd8\x2f\x0d\x75\xed\xc1\x4e\x9c\xc8\x25\x43\xac\xa8\xbe\xd7\xcc\xa9\xd1\xa9\x21\xa0\x1a\xbd\x04\x61\x94\x34\x2f\x18\xfc\x3e\x16\x50\x8e\x4d\x03\x6f\x1c\x58\xdb\x48\x23\xbc\x11\x82\x01\xe1\xfa\xd3\x3a\x8e\x30\xaf\x18\x33\x7f\xf3\x8d\x39\x11\x9b\x57\xd8\x2a\xfd\x55\x2a\x49\xf9\x0e\xc7\xec\x37\xd4\x25\xf7\xec\x5c\x66\xc7\xd7\x99\xaa\xcf\x4f\x89\x8a\xd3\xb7\x0a\x3a\xaa\x92\x15\xf4\x30\x6f\x1c\xb0\xd6\x46\xe7\x98\x39\x2d\xa4\x28\x40\x2a\x3a\x88\x9e\x29\xba\x88\x37\x2d\xca\x60\x38\xfa\xba\x5b\x20\xac\xa8\x62\xb0\x4c\xd4\xaf\xda\x45\x0a\xba\x5c\x3b\xb9\xc7\x79\xc5\x14\x2d\x18\x34\x19\x1c\x51\xdb\x25\x4d\xb4\x7e\x06\x14\x38\x6c\x59\x55\xd2\x77\xf8\x69\x59\xfc\x7b\x73\xed\x93\x43\xcb\x32\x6d\x3c\x28\xdc\x1b\x9a\xd3\x62\xab\xc2\x27\xf7\x41\xc9\x08\x2b\x23\x08\xad\x13\x57\x21\x9c\xd3\x72\x0d\x42\x72\xf8\x01\x7c\xa7\xf6\x83\xce\x39\xd7\x82\x3c\x1f\x2f\xd6\x60\x1b\xa2\xdf\x35\x89\x52\x20\xe7\x73\x74\xe0\x66\x26\x64\x4e\xb4\x97\x58\xc2\x0e\x0e\xe1\x60\x92\x34\x6d\xa0\x10\xd6\xb5\x83\x61\x27\xe6\x47\xd3\x89\xbd\x63\xfd\x3b\x8d\x03\x3d\x6c\x42\x2d\x5b\x70\xee\xe8\xdf\x4b\xf4\x66\x4e\xe1\x01\x45\x17\x80\x74\xad\x4f\xc3\xf3\xae\xc6\x1d\xc6\xd7\xc2\xce\xc9\xe1\x29\x30\x86\x2f\x4a\xa6\x4b\x15\x84\x73\xc9\x6f\xfd\x7f\xa5\x6e\x9e\xbd\xf1\xb0\xd4\xdd\x45\x5a\xc2\x3e\x4b\x78\xab\xa8\x84\x74\x4a\x91\x3b\x92\x23\x05\xf2\x1c\x1e\x7b\xf3\x09\xf8\xcf\xab\x24\xb6\x60\xa2\xe8\x4c\x9f\x75\x77\xaa\x8c\xe6\x01\x45\x36\x86\xcf\xc3\x63\x3a\xea\xd4\x8d\x7e\x06\xac\x14\x0a\xe0\x29\xf0\xed\x07\x22\x1a\x65\xda\x44\xae\xa2\x73\x1a\xe6\x90\x69\xa2\x8c\x46\xb2\x2f\xde\x49\x38\x08\xed\xfe\xfd\x41\xaf\x9f\xa9\x55\xd7\xdd\x22\x8d\xfa\x45\x63\xc5\x0f\x80\xf3\xb4\x08\xd6\x79\x30\x9e\x93\xee\x59\xa6\xd0\x4b\xee\x22\xe3\x33\xc1\x3a\x27\x68\x36\x78\x7e\x87\x0a\x06\xd5\x2e\x20\xd3\xaf\x15\xfb\xd8\x3b\x73\x14\xbb\x92\xed\x05\x5d\x2e\x29\x38\x2c\x94\xe4\x42\x45\x5e\xd3\xb5\x7d\xdf\x47\xca\x38\xb4\x5c\xaf\xfb\x7d\xdd\x6d\xf4\xa1\x2d\x77\xdd\x2f\xce\x6d\xc4\x7b\x8b\x4e\x67\xa9\x6f\xfe\x04\x00\x00\xff\xff\xb1\xd1\x27\x78\x05\x11\x00\x00") -func jsonschemaDraft04JSONBytes() ([]byte, error) { +func jsonschemaDraft04JsonBytes() ([]byte, error) { return bindataRead( - _jsonschemaDraft04JSON, + _jsonschemaDraft04Json, "jsonschema-draft-04.json", ) } -func jsonschemaDraft04JSON() (*asset, error) { - bytes, err := jsonschemaDraft04JSONBytes() +func jsonschemaDraft04Json() (*asset, error) { + bytes, err := jsonschemaDraft04JsonBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4357, mode: os.FileMode(0644), modTime: time.Unix(1567900649, 0)} + info := bindataFileInfo{name: "jsonschema-draft-04.json", size: 4357, mode: os.FileMode(0640), modTime: time.Unix(1568963823, 0)} a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe1, 0x48, 0x9d, 0xb, 0x47, 0x55, 0xf0, 0x27, 0x93, 0x30, 0x25, 0x91, 0xd3, 0xfc, 0xb8, 0xf0, 0x7b, 0x68, 0x93, 0xa8, 0x2a, 0x94, 0xf2, 0x48, 0x95, 0xf8, 0xe4, 0xed, 0xf1, 0x1b, 0x82, 0xe2}} return a, nil } -var _v2SchemaJSON = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\x87\x15\xca\x15\xe5\xf5\x94\x46\x9f\x33\x1a\x0c\x9a\xb1\x5a\xd9\x6a\x95\xcd\xcb\x7e\xec\x9a\xc5\x94\x3b\x37\x26\x31\xd7\xfc\xe4\x1f\x13\x8c\x31\x75\x9c\xba\xf7\x87\x3c\xa1\xb7\x4f\x17\x1b\x09\x82\x98\xc4\x70\x95\xd3\xe8\x4c\x48\x5a\xa6\xd6\x2a\x3d\x56\x42\x80\x9f\xaf\xae\x2e\x50\x0c\x42\xe0\x35\x34\x3c\x8a\x62\x03\x37\xba\xb2\x27\x04\xda\x25\x8d\x06\xe2\xa0\x13\x8a\xf3\xf5\xec\x10\x72\x67\x88\x90\x3d\x4b\x64\xeb\xaa\xda\x8f\xf7\x5a\x75\x47\x9a\xa8\x51\x70\x26\xd2\x38\xc6\x7c\xbb\x57\xfc\xbd\xe4\x04\x56\xa8\xa0\x54\x9a\x45\xd5\xf7\x0f\x16\xfc\x57\x1c\x3c\xdf\x23\xba\x77\x38\xda\x16\x4b\x31\x53\x6a\x4d\x9a\x15\x63\xe7\xe1\x18\x69\x9f\x22\xe0\x24\xbb\x94\x4b\x97\xee\x2d\xf9\x70\x87\x72\x7b\xe6\xc4\x33\x2a\x66\x5e\x1c\x35\x72\xe3\x2d\xda\x73\xe4\xc7\x51\x6d\xa4\xa1\x2a\x4f\xde\x94\xcb\xb2\x3e\x31\x48\xae\x82\xce\xc9\xc8\x65\xcd\xc3\xb7\x34\xb6\x2b\xdf\x58\x65\x78\x6e\x73\xac\x5e\x24\x0d\x3f\xdc\x70\x23\xc6\xda\x52\x0b\x2d\x63\x7d\xa9\x49\x2d\x54\x48\x28\xc0\x12\x9c\xe3\x63\xc9\x58\x04\x98\x36\x07\xc8\x0a\xa7\x91\xd4\xf0\xbc\xc1\xa8\xb9\x70\xd0\xc6\xa9\xb6\x78\x80\x5a\xa3\xb4\x2c\xf4\x18\x0b\x8a\x9d\xd0\xb4\x55\x10\xee\x0d\xc5\xd6\xe0\x99\x93\xdc\xa1\x04\xbb\xf1\xa7\x23\xd1\xd1\x97\x8c\x87\x13\x0a\x21\x02\xe9\x99\x25\xed\x20\xc5\x92\x66\x3c\x32\x9c\xd6\x06\xb0\x31\x5c\x86\x29\x0a\xcb\x60\x33\x12\xa5\x91\xfc\x96\x75\xd0\x59\xd7\x13\xbd\xd3\x23\x79\xdd\x2a\x90\xa6\x38\x06\x91\x39\x7f\x20\x72\x03\x1c\x2d\x01\x61\xba\x45\x37\x38\x22\x61\x8e\x71\x85\xc4\x32\x15\x28\x60\x61\x16\xb8\x3d\x29\xdc\x4d\x3d\x2f\x12\x13\x7d\xc8\x7e\x37\xee\xa8\x7f\xfa\xdb\xcb\x17\xff\x77\xfd\xf9\x7f\xee\x9f\x3d\xfe\xcf\xa7\xa7\x45\xfb\xcf\x1e\xf7\xf3\xe0\xff\xc4\x51\x0a\x8e\x4c\xcb\x01\xdc\x0a\x65\xb2\x01\x83\xed\x3d\xe4\xa9\xa3\x4e\x2d\x59\xc5\xe8\x2f\x48\x7d\x5a\x6e\x37\xbf\x5c\x9f\x35\x13\x64\x14\xfa\xef\x0b\x68\xa6\x0d\xb4\x8e\xf1\xa8\xff\xbb\x60\xf4\x03\x64\xab\x5b\x81\x65\x51\xe6\xda\xca\xfa\xf0\xb0\xac\x3e\x9c\xca\x26\x0e\x1d\xdb\x57\x5b\xbb\xb4\x9a\xa6\xb6\x9b\x1a\x6b\xd1\x9a\x9e\x7e\x33\x9a\xec\x41\x69\x45\x22\xb8\xb4\x51\xeb\x04\x77\xca\x6f\x7b\x7b\xc8\xb2\xb0\x95\x92\x25\x5b\xd0\x42\xaa\x2a\xdd\x32\x78\x4f\x0c\xab\x68\x46\x6c\xea\x6d\xf4\x5c\x5e\xde\xc4\xac\xa5\xf9\xd1\x00\x9f\x7d\x98\x65\x24\xbd\xc7\x97\xd4\xb3\x3a\xa8\x2b\xa0\x34\x76\xf9\x65\x5f\x2d\x25\x95\x1b\xcf\xd6\xf4\x9b\x5f\x09\x95\xb0\x36\x3f\xdb\xd0\x39\x2a\x93\x1c\x9d\x03\xa2\x4a\xca\xf5\xf6\x10\xb6\x94\x89\x0b\x6a\x70\x12\x13\x49\x6e\x40\xe4\x29\x12\x2b\xbd\x80\x45\x11\x04\xaa\xc2\x8f\x56\x9e\x5c\x6b\xec\x8d\x5a\x0e\x14\x59\x06\x2b\x1e\x24\xcb\xc2\x56\x4a\x31\xbe\x23\x71\x1a\xfb\x51\x2a\x0b\x3b\x1c\x48\x10\xa5\x82\xdc\xc0\xbb\x3e\x24\x8d\x5a\x76\x2e\x09\xed\xc1\x65\x51\xb8\x83\xcb\x3e\x24\x8d\x5a\x2e\x5d\xfe\x02\x74\x2d\x3d\xf1\xef\xae\xb8\x4b\xe6\x5e\xd4\xaa\xe2\x2e\x5c\x5e\xec\x0e\xf5\x5b\x0c\xcb\x0a\xbb\xa4\x3c\xf7\x1f\x2a\x55\x69\x97\x8c\x7d\x68\x95\xa5\xad\xb4\xf4\x9c\xa5\x07\xb9\x7a\x05\xbb\xad\x50\x6f\xfb\xa0\x4e\x9b\x48\x23\x49\x92\x28\x87\x19\x3e\x32\xee\xca\x3b\x46\x7e\x7f\x18\x64\xcc\xcc\x0f\x34\xe9\x36\x8b\xb7\x6c\xa8\xa5\x5b\x54\x4c\x54\x5b\x15\x3a\xf1\x6c\x2d\xfe\x96\xc8\x0d\xba\x7b\x81\x88\xc8\x23\xab\xee\x7d\x3b\x92\xa7\x60\x29\xe3\xdc\xff\xb8\x64\xe1\xf6\xa2\x5a\x59\xdc\x6f\xeb\x45\x7d\x6a\xd1\x76\x1e\xea\xb8\xf1\xfa\x14\xd3\x36\x63\xe5\xd7\xf3\xe4\xbe\x25\xbd\x5e\x05\xeb\x73\x74\xb5\x21\x2a\x2e\x4e\xa3\x30\xdf\xbf\x43\x28\x2a\xd1\xa5\x2a\x9d\x8a\xfd\x76\xd8\x8d\xbc\x67\x65\xc7\xb8\x03\x45\xec\xa3\xb0\x37\x8a\x70\x4c\x68\x91\x51\x8e\x58\x80\xed\x4a\xf3\x81\x62\xca\x96\xbb\xf1\x52\xcd\x80\xfb\xe4\x4a\x5d\x6c\xdf\x6e\x20\x4b\x80\x30\x8e\x28\x93\xf9\xe9\x8d\x8a\x6d\xd5\x59\x65\x7b\xaa\x44\x9e\xc0\xc2\xd1\x7c\x40\x26\xd6\x1a\xce\xf9\xc5\x69\x7b\x6c\xec\xc8\x71\x7b\xe5\x21\x2e\xd3\xe5\x65\x93\x91\x53\x0b\x7b\x3a\xc7\xfa\x17\x6a\x01\xa7\x33\xd0\xf4\x40\x0f\x39\x87\xda\xe4\x54\x87\x3a\xd5\xe3\xc7\xa6\x8e\x20\xd4\x11\xb2\x4e\xb1\xe9\x14\x9b\x4e\xb1\xe9\x14\x9b\xfe\x15\x63\xd3\x47\xf5\xff\x97\x38\xe9\xcf\x14\xf8\x76\x82\x49\x13\x4c\xaa\x7d\xcd\x6c\x62\x42\x49\x87\x43\x49\x19\x33\x6f\xe3\x44\x6e\x9b\xab\x8a\x3e\x86\xaa\x99\x52\x1b\x5b\x59\x33\x02\x09\xa0\x21\xa1\x6b\x84\x6b\x66\xbb\xdc\x16\x0c\xd3\x68\xab\xec\x36\x4b\xd8\x60\x8a\x40\x31\x85\x6e\x14\x57\x13\xc2\xfb\x92\x10\xde\xbf\x88\xdc\xbc\x53\x5e\x7f\x82\x7a\x13\xd4\x9b\xa0\xde\x04\xf5\x90\x01\xf5\x94\xcb\x7b\x83\x25\x9e\xd0\xde\x84\xf6\x6a\x5f\x4b\xb3\x98\x00\xdf\x04\xf8\x6c\xbc\x7f\x19\x80\xaf\xf1\x71\x45\x22\x98\x40\xe0\x04\x02\x27\x10\xd8\x29\xf5\x04\x02\xff\x4a\x20\x30\xc1\x72\xf3\x65\x02\x40\xd7\xc1\xd1\xe2\x6b\xf1\xa9\x7b\xfb\xe4\x20\xc0\x68\x9d\xd4\xb4\xd3\x96\xb5\xa6\xd1\x41\x20\xe6\x89\xc3\x48\x65\x58\x13\x84\x9c\x56\x56\x3b\x0c\xe0\x6b\x83\x5c\x13\xd2\x9a\x90\xd6\x84\xb4\x26\xa4\x85\x0c\xa4\x45\x19\xfd\xff\x63\x6c\x52\xb5\x1f\x1e\x19\x74\x3a\xcd\xb9\x69\xce\xa6\x3a\x0f\x7a\x2d\x19\xc7\x81\x14\x5d\xcb\xd5\x03\xc9\x39\xd0\xb0\xd1\xb3\xcd\xfb\x7a\x2d\x5d\x3a\x48\xe1\xfa\x2e\xe6\x81\x42\x18\x86\xd6\xc1\xbe\xb1\x23\xd3\xf7\x34\xed\x19\x0a\x0b\xc4\x48\x44\xfd\x22\x50\xb6\x42\x58\xbb\xe5\x3d\xa7\x73\xd4\x8b\xc4\x8c\x70\x61\xec\x73\xee\xc3\x81\x8b\xf5\xe2\xd7\x52\x3e\xcf\xeb\xeb\x17\x3b\x71\x16\xda\x7d\xb8\xde\xf0\x7a\x8f\x06\x2d\xa7\x40\x7b\xc1\x9d\x41\x4d\xb6\x61\xa2\x4e\x9f\x3d\xa0\xc5\xae\xe3\x1c\x1d\x40\x6c\x48\x8b\x63\xa0\xb5\x01\xed\x8e\x02\xe9\x86\xc8\x3b\x06\xee\xdb\x4b\xde\xbd\xc0\xa1\x6f\xcb\xda\xfc\xc2\x44\x16\x87\x9c\x17\x31\xd3\x30\x20\x39\x42\xcb\x6f\xf2\xf1\xf4\x72\x10\xf8\x1c\xa0\xf3\xbd\x10\xea\x21\x35\x7d\xe8\x86\xdb\x15\xed\x81\x81\x07\x28\xbb\x13\x28\xc7\xf8\xce\x7d\x8d\xc2\x31\xb4\x7e\x94\xd6\xdb\x55\xef\x4a\xfb\xed\xc3\x40\x3e\xeb\x9f\xe9\x99\x0f\xdf\x08\x65\x88\x27\x73\x86\x31\x9d\x47\xdf\x55\x19\xba\x3d\xee\x15\x0a\xcd\x8c\xaa\x5e\xb9\xf6\x57\x33\x73\x5a\xa1\x89\x7b\x3b\xa0\xb2\xa4\xc2\xf6\xc1\x53\xb5\x00\xca\x23\xe5\xf4\x60\x6a\xb4\x2d\x74\xea\x4e\xed\x3b\xe3\x47\xfb\xed\x82\x3d\x19\xd4\x3b\x6b\xaf\xae\x2b\x2f\x57\xb3\x82\x68\xcb\xed\x88\x2e\xe1\x5c\xd7\x26\xfa\x0a\x65\xe7\xce\x11\x33\xb4\xdd\x66\xe3\x37\xf6\xfa\x70\xd6\x4f\xa1\x21\x51\xd8\x3c\x26\x14\x4b\xc6\x87\x44\x27\x1c\x70\xf8\x9e\x46\xce\xab\x21\x07\x5f\xc1\x76\x17\x1b\x77\xb4\xda\x75\xa0\x0a\x3a\x30\xe1\xf8\x97\x32\x16\x2b\x00\x75\x85\xee\x62\x46\xef\xd3\x85\xb5\x6b\x60\xbe\xf2\x30\x7a\x8c\x0b\x4b\xa6\xd0\xf9\x64\x42\xe7\x07\x41\x41\xe3\x2c\x5d\xf9\x6d\xe9\x39\x98\x3b\x3b\x5d\x67\xd4\x5c\xed\xf2\xf0\x48\x7b\xbd\x2d\x31\xdd\x3f\x34\xad\x44\x76\x51\x9a\x56\x22\xa7\x95\xc8\x69\x25\xf2\xe1\x56\x22\x1f\x00\x32\x6a\x73\x92\xed\xe1\xc6\x7d\x9f\x49\x2c\x69\x7e\xc8\x31\x4c\x0c\xb4\xf2\x54\x3b\x79\x3b\x9e\x4d\xb4\xd1\x18\x3e\x5f\x9a\x93\xa2\x11\xc3\xda\x27\x0b\xaf\x37\x2e\x5c\x37\xfb\xeb\x9a\xd6\xc3\xac\xc3\xcc\xf8\x1e\x5b\x9d\xac\x22\x64\xb7\xed\x26\xb8\xf3\xb9\x3c\xbb\x1f\xe2\xb0\x22\x77\x43\x6a\x62\x29\x39\x59\xa6\xe6\xe5\xcd\x7b\x83\xc0\x5b\x8e\x93\x64\xac\xeb\xca\x4f\x65\xac\x4a\xbc\x1e\xcd\x82\xfa\x3c\x70\x36\xb6\xb5\xed\x79\xef\xec\x68\x00\xff\x54\xfa\xb5\xe3\xf1\xdb\xe1\xbe\xce\x76\x17\xaf\x57\xb6\x6b\x89\x05\x09\xce\x52\xb9\x01\x2a\x49\xbe\xd9\xf4\xd2\xb8\x7a\xbf\x91\x02\xf3\x22\x8c\x13\xf2\x77\xd8\x8e\x43\x8b\xe1\x54\x6e\x5e\x9d\xc7\x49\x44\x02\x22\xc7\xa4\x79\x81\x85\xb8\x65\x3c\x1c\x93\xe6\x59\xa2\xf8\x1c\x51\x95\x05\xd9\x20\x00\x21\x7e\x60\x21\x58\xa9\x56\xff\xbe\xb6\x5a\x5e\x5b\x3f\x1f\xd6\xd3\x3c\xc4\x4d\xba\x99\xb4\x63\x6e\x7d\x3e\x3d\x57\xd2\x18\x5f\x47\xe8\xc3\x06\x8a\x68\x6c\x7f\x3b\x72\x0f\xe7\xe2\x77\x77\xf1\xd0\x99\xab\xdf\x2e\xfe\xd6\xbb\xcd\x1a\xb9\x90\xd1\xaf\xf2\x38\x3d\xdb\x74\xf8\xeb\xe3\xda\xe8\x2a\x62\xb7\xda\x1b\x07\xa9\xdc\x30\x5e\xbc\x68\xfb\x6b\x9f\x97\xf1\xc6\xb1\xd8\x5c\x29\x1e\x49\x30\xc5\xf7\xde\xad\x91\x42\xf9\xdd\xed\x89\x80\x25\xbe\x37\xd7\xe7\x32\x5c\xe6\x35\xac\xd4\x0c\x2d\xf7\x90\xc4\xe3\xf5\xe3\x2f\x7f\x54\x18\x88\xe3\x61\x47\x85\x64\x7f\xc0\xd7\x3f\x1a\x92\x42\xe9\xc7\x1e\x0d\x95\x76\xa7\x51\xa0\x8f\x02\x1b\x46\x9e\x06\x42\xd1\xf2\x01\x07\x02\xde\xe9\x7d\x1a\x0b\xa7\x32\x16\xcc\xc0\xee\xc4\x90\xd2\x5f\x6f\x98\x54\x5d\xf2\x95\xe1\xa7\x69\x10\x3a\x06\xe1\x65\xb3\x17\x47\x58\x78\xd0\x45\xd6\x5b\xd5\x5f\x25\x1d\x71\x49\xa6\x7a\x64\xda\xd0\x6f\xc7\x3a\x4c\xe3\x09\xc0\x6e\x96\x2c\xa7\xa7\x77\x34\x10\x05\x08\x21\x44\x92\x65\x77\xdf\x20\x5c\xbc\xe7\x97\x3f\xf4\x1a\x45\xd6\xe7\x27\x4a\xde\x74\x27\x66\x11\x7d\x70\xba\xd3\x78\xf9\x1e\x0d\xca\xc8\x39\xde\x7c\xb3\xa6\xe1\xbc\xd7\xc1\x6a\x6f\xb3\x0e\x52\xbe\xe4\x98\x8a\x15\x70\x94\x70\x26\x59\xc0\xa2\xf2\x1c\xfb\xd9\xc5\xf9\xbc\xd5\x92\x9c\xa3\xdf\xe6\x1e\xb3\x0d\x49\xba\x87\x50\x5f\x84\xfe\xe9\xd6\xf8\xbb\xe6\xf0\x7a\xeb\xa6\x65\x3b\x86\x8b\x79\x93\xf5\x59\x20\x6e\xb4\xa7\x44\xf4\x3f\xa5\xfe\x67\x42\x12\xdb\xd3\xe7\xbb\xa5\xa3\x8c\x5c\x2b\x97\xbb\xbb\x7f\x8e\xc5\x6e\xed\x43\x5c\xbf\x74\xc8\x8f\xff\xe6\xd6\xbe\x91\xb6\xf5\x95\xe4\xed\x93\xc4\xa8\x5b\xf9\x76\x4d\x35\xb7\xd8\x8c\xb6\x7d\xaf\x72\xe0\xb6\xbd\x01\x63\x9e\x76\xab\x1a\x32\x76\xe4\x8c\x76\xc2\xad\x6c\xa2\x65\xf7\xcf\xf8\xa7\xda\x2a\xb9\x8c\x3d\x3c\xa3\x9d\x64\x33\xe5\x1a\xb5\x2d\xfb\x86\xa2\x5a\x7f\x19\x5b\x7f\xc6\x3f\xd1\x53\xd3\xe2\x41\x5b\xd3\x4f\xf0\xec\xb0\x42\x73\x43\xd2\x68\x27\xd3\x6a\x6a\x34\xf6\x4e\x1e\x52\x8b\x87\x6c\xcc\xae\x44\xfb\x9e\xa7\x51\x4f\x9d\x55\x03\x81\x8e\x67\xfc\xb4\x69\xf0\x3a\x18\xf2\x40\xd0\xf6\xa8\x34\xe3\xc9\x98\xaf\xf6\xda\x24\xd3\xeb\x60\xb9\x0e\xd3\x1f\xa9\xff\xee\x1f\xfd\x37\x00\x00\xff\xff\x69\x5d\x0a\x6a\x39\x9d\x00\x00") +var _v2SchemaJson = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x4f\x93\xdb\x36\xb2\xbf\xfb\x53\xa0\x14\x57\xd9\xae\xd8\x92\xe3\xf7\x2e\xcf\x97\xd4\xbc\xd8\x49\x66\x37\x5e\x4f\x79\x26\xbb\x87\x78\x5c\x05\x91\x2d\x09\x09\x09\x30\x00\x38\x33\x5a\xef\x7c\xf7\x2d\xf0\x9f\x08\x02\x20\x41\x8a\xd2\xc8\x0e\x0f\xa9\x78\x28\xa0\xd1\xdd\x68\x34\x7e\xdd\xf8\xf7\xf9\x11\x42\x33\x49\x64\x04\xb3\xd7\x68\x76\x86\xfe\x76\xf9\xfe\x1f\xe8\x32\xd8\x40\x8c\xd1\x8a\x71\x74\x79\x8b\xd7\x6b\xe0\xe8\xd5\xfc\x25\x3a\xbb\x38\x9f\xcf\x9e\xab\x0a\x24\x54\xa5\x37\x52\x26\xaf\x17\x0b\x91\x17\x99\x13\xb6\xb8\x79\xb5\x10\x59\xdd\xf9\xef\x82\xd1\x6f\xf2\xc2\x8f\xf3\x4f\xb5\x1a\xea\xc7\x17\x45\x41\xc6\xd7\x8b\x90\xe3\x95\x7c\xf1\xf2\x7f\x8b\xca\x45\x3d\xb9\x4d\x32\xa6\xd8\xf2\x77\x08\x64\xfe\x8d\xc3\x9f\x29\xe1\xa0\x9a\xff\xed\x11\x42\x08\xcd\x8a\xd6\xb3\x9f\x15\x67\x74\xc5\xca\x7f\x27\x58\x6e\xc4\xec\x11\x42\xd7\x59\x5d\x1c\x86\x44\x12\x46\x71\x74\xc1\x59\x02\x5c\x12\x10\xb3\xd7\x68\x85\x23\x01\x59\x81\x04\x4b\x09\x9c\x6a\xbf\x7e\xce\x49\x7d\xba\x7b\x51\xfd\xa1\x44\xe2\xb0\x52\xac\x7d\xb3\x08\x61\x45\x68\x46\x56\x2c\x6e\x80\x86\x8c\xbf\xbd\x93\x40\x05\x61\x74\x96\x95\xbe\x7f\x84\xd0\x7d\x4e\xde\x42\xb7\xe4\xbe\x46\xbb\x14\x5b\x48\x4e\xe8\xba\x90\x05\xa1\x19\xd0\x34\xae\xc4\xce\xbe\xbc\x9a\xbf\x9c\x15\x7f\x5d\x57\xc5\x42\x10\x01\x27\x89\xe2\x48\x51\xb9\xda\x40\xd5\x87\x37\xc0\x15\x5f\x88\xad\x90\xdc\x10\x81\x42\x16\xa4\x31\x50\x39\x2f\x38\xad\xab\xb0\x53\xd8\xac\x94\x56\x6f\xc3\x84\xf4\x11\xa4\x50\xb3\xfa\xe9\xd3\x6f\x9f\x3e\xdf\x2f\xd0\xeb\x8f\x1f\x3f\x7e\xbc\xfe\xf6\xe9\xf7\xaf\x5f\x7f\xfc\x18\x7e\xfb\xec\xfb\xc7\xb3\x36\x79\x54\x43\xe8\x29\xc5\x31\x20\xc6\x11\x49\x9e\xe5\x12\x41\x66\xa0\xe8\xed\x1d\x8e\x93\x08\x5e\xa3\x27\x3b\xc3\x7c\xa2\x73\xba\xc4\x02\x2e\xb0\xdc\xf4\xe5\x76\xd1\xca\x96\xa2\x8a\x94\xcd\x21\xc9\x6c\xec\x2c\x70\x42\x9e\x34\x74\x9d\x19\x7c\xcd\x20\x9c\xea\x2e\x0a\xfe\x42\x84\xd4\x29\x04\x8c\x8a\xb4\x41\xa2\xc1\xdc\x19\x8a\x88\x90\x4a\x49\xef\xce\xdf\xbd\x45\x4a\x52\x81\x70\x10\x40\x22\x21\x44\xcb\x6d\xc5\xec\x4e\x3c\x1c\x45\xef\x57\x9a\xb5\x7d\xae\xfe\xe5\xe4\x31\x86\x90\xe0\xab\x6d\x02\x3b\x2e\xcb\x11\x90\xd9\xa8\xc6\x77\xc2\x59\x98\x06\xfd\xf9\x2e\x78\x45\x01\xa6\xa8\xa0\x71\x5c\xbe\x33\xa7\xd2\xd9\x5f\x95\xef\xd9\xd5\xac\xfd\xdc\x5d\xbf\x5e\xb8\xd1\x3e\xc7\x31\x48\xe0\x5e\x4c\x14\x65\xdf\xb8\xa8\x71\x10\x09\xa3\xc2\xc7\x02\xcb\xa2\x4e\x5a\x02\x82\x94\x13\xb9\xf5\x30\xe6\xb2\xa4\xb5\xfe\x9b\x3e\x7a\xb2\x55\xd2\xa8\x4a\xbc\x16\xb6\x71\x8e\x39\xc7\xdb\x9d\xe1\x10\x09\x71\xbd\x9c\xb3\x41\x89\xd7\xa5\x89\xdc\x57\xb5\x53\x4a\xfe\x4c\xe1\xbc\xa0\x21\x79\x0a\x1a\x0f\x70\xa7\x5c\x08\x8e\xde\xb0\xc0\x43\x24\xad\x74\x63\x0e\xb1\xd9\x90\xe1\xb0\x2d\x13\xa7\x6d\x78\xfd\x04\x14\x38\x8e\x90\xaa\xce\x63\xac\x3e\x23\xbc\x64\xa9\xb4\xf8\x03\x63\xde\xcd\xbe\x16\x13\x4a\x55\xac\x82\x12\xc6\xac\xd4\x35\xf7\x22\xd4\x3a\xff\x22\x73\x0e\x6e\x51\xa0\x75\x1e\xae\x8f\xe8\x5d\xc7\x59\xe6\xe4\x9a\x18\x8d\xd6\x1c\x53\x84\x4d\xb7\x67\x28\x37\x09\x84\x69\x88\x12\x0e\x01\x11\x80\x32\xa2\xf5\xb9\xaa\xc6\xd9\x73\x53\xab\xfb\xb4\x2e\x20\xc6\x54\x92\xa0\x9a\xf3\x69\x1a\x2f\x81\x77\x37\xae\x53\x1a\xce\x40\xc4\xa8\x82\x1c\xb5\xef\xda\x24\x7d\xb9\x61\x69\x14\xa2\x25\xa0\x90\xac\x56\xc0\x81\x4a\xb4\xe2\x2c\xce\x4a\x64\x7a\x9a\x23\xf4\x13\x91\x3f\xa7\x4b\xf4\x63\x84\x6f\x18\x87\x10\xbd\xc3\xfc\x8f\x90\xdd\x52\x44\x04\xc2\x51\xc4\x6e\x21\x74\x48\x21\x81\xc7\xe2\xfd\xea\x12\xf8\x0d\x09\xf6\xe9\x47\x35\xaf\x67\xc4\x14\xf7\x22\x27\x97\xe1\xe2\x76\x2d\x06\x8c\x4a\x1c\x48\x3f\x73\x2d\x0b\x5b\x29\x45\x24\x00\x2a\x0c\x11\xec\x94\xca\xc2\xa6\xc1\x37\x21\x43\x83\x3b\x5f\x97\xf1\x43\x5e\x53\x73\x19\xa5\x36\xd8\x2d\x05\x2e\x34\x0b\xeb\x39\xfc\x1d\x63\x51\x01\xbd\x3d\xbb\x90\x84\x40\x25\x59\x6d\x09\x5d\xa3\x1c\x37\xe6\x5c\x16\x9a\x40\x09\x70\xc1\xe8\x82\xf1\x35\xa6\xe4\xdf\x99\x5c\x8e\x9e\x4d\x79\xb4\x27\x2f\xbf\x7e\xf8\x05\x25\x8c\x50\xa9\x98\x29\x90\x62\x60\xea\x75\xae\x13\xca\xbf\x2b\x1a\x29\x27\x76\xd6\x20\xc6\x64\x5f\xe6\x32\x1a\x08\x87\x21\x07\x21\xbc\xb4\xe4\xe0\x32\x67\xa6\xcd\xf3\x1e\xcd\xd9\x6b\xb6\x6f\x8e\x27\xa7\xed\xdb\xe7\xbc\xcc\x1a\x07\xce\x6f\x87\x33\xf0\xba\x51\x17\x22\x66\x78\x79\x8e\xce\xe5\x13\x81\x80\x06\x2c\xe5\x78\x0d\xa1\xb2\xb8\x54\xa8\x79\x09\xbd\xbf\x3c\x47\x01\x8b\x13\x2c\xc9\x32\xaa\xaa\x1d\xd5\xee\xab\x36\xbd\x6c\xfd\x54\x6c\xc8\x08\x01\x3c\xbd\xe7\x07\x88\xb0\x24\x37\x79\x90\x28\x4a\x1d\x10\x1a\x92\x1b\x12\xa6\x38\x42\x40\xc3\x4c\x43\x62\x8e\xae\x36\xb0\x45\x71\x2a\xa4\x9a\x23\x79\x59\xb1\xa8\xf2\xa4\x0c\x60\x9f\xcc\x8d\x40\xf5\x80\xca\xa8\x99\xc3\xa7\x85\x1f\x31\x25\xa9\x82\xc5\x6d\xbd\xd8\x36\x76\x7c\x02\x28\x97\xf6\x1d\x74\x3b\x11\x7e\x91\xae\x32\xf8\x6c\xf4\xe6\x7b\x9a\xa5\x1f\x62\xc6\x21\xcf\x9a\xe5\xed\x8b\x02\xf3\x2c\x33\x33\xdf\x00\xca\xc9\x09\xb4\x04\xf5\xa5\x08\xd7\xc3\x02\x18\x66\xf1\xab\x1e\x83\x37\x4c\xcd\x12\xc1\x1d\x50\xf6\xaa\xbd\xfe\xe2\x73\x48\x38\x08\xa0\x32\x9b\x18\x44\x86\x0b\x6a\xc1\xaa\x26\x96\x2d\x96\x3c\xa0\x54\x65\x73\xe3\x08\xb5\x8b\x99\xbd\x82\xbc\x9e\xc2\xe8\x53\x46\x83\x3f\x33\x54\x2b\x5b\xad\x92\x79\xd9\x8f\x5d\x93\x98\xf2\xe6\xc6\x1c\xe6\x9a\x9e\xfc\x43\x82\x31\x66\x8e\x53\x77\xfe\x90\xe7\xf3\xf6\xe9\x62\x23\x3f\x10\x93\x18\xae\x72\x1a\x9d\xf9\x48\xcb\xcc\x5a\x65\xc7\x4a\x04\xf0\xf3\xd5\xd5\x05\x8a\x41\x08\xbc\x86\x86\x43\x51\x6c\xe0\x46\x57\xf6\x44\x40\x0d\xfb\xff\xa2\xc3\x7c\x3d\x39\x84\xdc\x09\x22\x64\x4f\x12\xd9\xba\xaa\xf6\xe3\xbd\x56\xdd\x91\x25\x6a\x14\x9c\x89\x34\x8e\x31\xdf\xee\x15\x7e\x2f\x39\x81\x15\x2a\x28\x95\x66\x51\xf5\xfd\x83\xc5\xfe\x15\x07\xcf\xf7\x08\xee\x1d\x8e\xb6\xc5\x52\xcc\x8c\x5a\x93\x66\xc5\xd8\x79\x38\x46\xd6\xa7\x88\x37\xc9\x2e\xe3\xd2\xa5\x7b\x4b\x3a\xdc\xa1\xdc\x9e\x29\xf1\x8c\x8a\x99\x16\x47\x8d\xd4\x78\x8b\xf6\x1c\xe9\x71\x54\x1b\x69\xa8\x4a\x93\x37\xe5\xb2\x2c\x4f\x0c\x92\xab\xa0\x73\x32\x72\x59\xd3\xf0\x2d\x8d\xed\xca\x37\x16\x19\x9e\xdb\x1c\xab\x17\x49\xc3\x0f\x37\xdc\x88\xb1\xb4\xd4\x42\xcb\x58\x5e\x6a\x52\x0b\x15\x10\x0a\xb0\x04\xe7\xf8\x58\x32\x16\x01\xa6\xcd\x01\xb2\xc2\x69\x24\x35\x38\x6f\x30\x6a\xae\x1b\xb4\x71\xaa\xad\x1d\xa0\xd6\x20\x2d\x8b\x3c\xc6\x82\x62\x27\x34\x6d\x15\x84\x7b\x43\xb1\x35\x78\xa6\x24\x77\x28\xc1\x6e\xfc\xe9\x48\x74\xf4\x15\xe3\xe1\x84\x42\x88\x40\x7a\x26\x49\x3b\x48\xb1\xa4\x19\x8e\x0c\xa7\xb5\x01\x6c\x0c\x97\x61\x8a\xc2\x32\xd8\x8c\x44\x69\x24\xbf\x65\x1d\x74\xd6\xe5\x44\xef\xec\x48\x5e\xb7\x8a\xa3\x29\x8e\x41\x64\xce\x1f\x88\xdc\x00\x47\x4b\x40\x98\x6e\xd1\x0d\x8e\x48\x98\x63\x5c\x21\xb1\x4c\x05\x0a\x58\x98\xc5\x6d\x4f\x0a\x77\x53\x4f\x8b\xc4\x44\x1f\xb2\xdf\x8d\x3b\xea\x9f\xfe\xf6\xf2\xc5\xff\x5d\x7f\xfe\x9f\xfb\x67\x8f\xff\xf3\xe9\x69\xd1\xfe\xb3\xc7\xfd\x3c\xf8\x3f\x71\x94\x82\x23\xd1\x72\x00\xb7\x42\x99\x6c\xc0\x60\x7b\x0f\x79\xea\xa8\x53\x4b\x56\x31\xfa\x0b\x52\x9f\x96\xdb\xcd\x2f\xd7\x67\xcd\x04\x19\x85\xfe\xdb\x02\x9a\x59\x03\xad\x63\x3c\xea\xff\x2e\x18\xfd\x00\xd9\xe2\x56\x60\x59\x93\xb9\xb6\xb2\x3e\x3c\x2c\xab\x0f\xa7\xb2\x89\x43\xc7\xf6\xd5\xce\x2e\xad\xa6\xa9\xed\xa6\xc6\x5a\xb4\xa6\x67\xdf\x8c\x26\x7b\x50\x5a\x91\x08\x2e\x6d\xd4\x3a\xc1\x9d\xf2\xdb\xde\x1e\xb2\x2c\x6c\xa5\x64\xc9\x16\xb4\x90\xaa\x4a\xb7\x0c\xde\x13\xc3\x2a\x9a\x11\x9b\x7a\x1b\x3d\x95\x97\x37\x31\x6b\x69\x7e\x34\xc0\x67\x1f\x66\x19\x49\xef\xf1\x25\xf5\xac\x0e\xea\x0a\x28\x8d\x4d\x7e\xd9\x57\x4b\x49\xe5\xc6\xb3\x25\xfd\xe6\x57\x42\x25\xac\xcd\xcf\x36\x74\x8e\xca\x24\x47\xe7\x80\xa8\x92\x72\xbd\x3d\x84\x2d\x65\xe2\x82\x1a\x9c\xc4\x44\x92\x1b\x10\x79\x8a\xc4\x4a\x2f\x60\x51\x04\x81\xaa\xf0\xa3\x95\x27\xd7\x12\x7b\xa3\x96\x03\x45\x96\xc1\x8a\x07\xc9\xb2\xb0\x95\x52\x8c\xef\x48\x9c\xc6\x7e\x94\xca\xc2\x0e\x07\x12\x44\xa9\x20\x37\xf0\xae\x0f\x49\xa3\x96\x9d\x4b\x42\x7b\x70\x59\x14\xee\xe0\xb2\x0f\x49\xa3\x96\x4b\x97\xbf\x00\x5d\x4b\x4f\xfc\xbb\x2b\xee\x92\xb9\x17\xb5\xaa\xb8\x0b\x97\x17\x9b\x43\xfd\xd6\xc2\xb2\xc2\x2e\x29\xcf\xfd\x87\x4a\x55\xda\x25\x63\x1f\x5a\x65\x69\x2b\x2d\x3d\x67\xe9\x41\xae\x5e\xc1\x6e\x2b\xd4\xdb\x3e\xa8\xd3\x26\xd2\x48\x92\x24\xca\x61\x86\x8f\x8c\xbb\xf2\x8e\x91\xdf\x1f\x06\x19\x33\xf3\x03\x4d\xba\xcd\xe2\x2d\xfb\x69\xe9\x16\x15\x13\xd5\x56\x85\x4e\x3c\x5b\x8a\xbf\x25\x72\x83\xee\x5e\x20\x22\xf2\xc8\xaa\x7b\xdb\x8e\xe4\x29\x58\xca\x38\xb7\x3f\x2e\x59\xb8\xbd\xa8\x16\x16\xf7\xdb\x79\x51\x9f\x5a\xb4\x8d\x87\x3a\x6e\xbc\x3e\xc5\xb4\xcd\x58\xf9\xf5\x3c\xb9\x6f\x49\xaf\x57\xc1\xfa\x1c\x5d\x6d\x88\x8a\x8b\xd3\x28\xcc\xb7\xef\x10\x8a\x4a\x74\xa9\x4a\xa7\x62\xbf\x0d\x76\x23\x6f\x59\xd9\x31\xee\x40\x11\xfb\x28\xec\x8d\x22\x1c\x13\x5a\x64\x94\x23\x16\x60\xbb\xd2\x7c\xa0\x98\xb2\xe5\x6e\xbc\x54\x33\xe0\x3e\xb9\x52\x17\xdb\xb7\x1b\xc8\x12\x20\x8c\x23\xca\x64\x7e\x78\xa3\x62\x5b\x75\x56\xd9\x9e\x2a\x91\x27\xb0\x70\x34\x1f\x90\x89\xb5\x86\x73\x7e\x71\xda\x1e\xfb\x3a\x72\xdc\x5e\x79\x88\xcb\x74\x79\xd9\x64\xe4\xd4\xc2\x9e\xce\xb1\xfe\x85\x5a\xc0\xe9\x0c\x34\x3d\xd0\x43\xce\xa1\x36\x39\xd5\xa1\x4e\xf5\xf8\xb1\xa9\x23\x08\x75\x84\xac\x53\x6c\x3a\xc5\xa6\x53\x6c\x3a\xc5\xa6\x7f\xc5\xd8\xf4\x51\xfd\xff\x25\x4e\xfa\x33\x05\xbe\x9d\x60\xd2\x04\x93\x6a\x5f\x33\x9b\x98\x50\xd2\xe1\x50\x52\xc6\xcc\xdb\x38\x91\xdb\xe6\xaa\xa2\x8f\xa1\x6a\xa6\xd4\xc6\x56\xd6\x8c\x40\x02\x68\x48\xe8\x1a\xe1\x9a\xd9\x2e\xb7\x05\xc3\x34\xda\x2a\xbb\xcd\x12\x36\x98\x22\x50\x4c\xa1\x1b\xc5\xd5\x84\xf0\xbe\x24\x84\xf7\x2f\x22\x37\xef\x94\xd7\x9f\xa0\xde\x04\xf5\x26\xa8\x37\x41\x3d\x64\x40\x3d\xe5\xf2\xde\x60\x89\x27\xb4\x37\xa1\xbd\xda\xd7\xd2\x2c\x26\xc0\x37\x01\x3e\x1b\xef\x5f\x06\xe0\x6b\x7c\x5c\x91\x08\x26\x10\x38\x81\xc0\x09\x04\x76\x4a\x3d\x81\xc0\xbf\x12\x08\x4c\xb0\xdc\x7c\x99\x00\xd0\x75\x70\xb4\xf8\x5a\x7c\xea\xde\x3e\x39\x08\x30\x5a\x27\x35\xed\xb4\x65\xad\x69\x74\x10\x88\x79\xe2\x30\x52\x19\xd6\x04\x21\xa7\x95\xd5\x0e\x03\xf8\xda\x20\xd7\x84\xb4\x26\xa4\x35\x21\xad\x09\x69\x21\x03\x69\x51\x46\xff\xff\x18\x9b\x54\xed\x87\x47\x06\x9d\x4e\x73\x6e\x9a\xb3\xa9\xce\x83\x5e\x4b\xc6\x71\x20\x45\xd7\x72\xf5\x40\x72\x0e\x34\x6c\xf4\x6c\xf3\xba\x5e\x4b\x97\x0e\x52\xb8\xbe\x8b\x79\xa0\x10\x86\xa1\x75\xb0\x6f\xec\xc8\xf4\x3d\x4d\x7b\x86\xc2\x02\x31\x12\x51\xbf\x07\x94\xad\x10\xd6\x2e\x79\xcf\xe9\x1c\xf5\x1e\x31\x23\x5c\x18\xfb\x9c\xfb\x70\xe0\x62\xbd\xf7\xb5\x94\xcf\xf3\xf6\xfa\xc5\x4e\x9c\x85\x76\x1d\xae\x37\xbc\xde\xa3\x41\xcb\x29\xd0\x5e\x70\x67\x50\x93\x6d\x98\xa8\xd3\x67\x0f\x68\xb1\xeb\x38\x47\x07\x10\x1b\xd2\xe2\x18\x68\x6d\x40\xbb\xa3\x40\xba\x21\xf2\x8e\x81\xfb\xf6\x92\x77\x2f\x70\xe8\xdb\xb2\x36\xbf\x30\x91\xc5\x21\xe7\x45\xcc\x34\x0c\x48\x8e\xd0\xf2\x9b\x7c\x3c\xbd\x1c\x04\x3e\x07\xe8\x7c\x2f\x84\x7a\x48\x4d\x1f\xba\xe1\x76\x45\x7b\x60\xe0\x01\xca\xee\x04\xca\x31\xbe\x73\x5f\xa3\x70\x0c\xad\x1f\xa5\xf5\x76\xd5\xbb\xd2\x7e\xfb\x30\x90\xcf\xfa\x67\x7a\xe6\xc3\x37\x42\x19\xe2\xc9\x9c\x61\x4c\xe7\xd1\x77\x55\x86\x6e\x8f\x7b\x85\x42\x33\xa3\xaa\x57\xae\xfd\xd5\xcc\x9c\x56\x68\xe2\xde\x0e\xa8\x2c\xa9\xb0\x7d\xf0\x54\x2d\x80\xf2\x48\x39\x3d\x98\x1a\x6d\x0b\x9d\xba\x53\xfb\xce\xf8\xd1\x7e\xbb\x60\x4f\x06\xf5\xce\xda\xab\xeb\xca\xcb\xd5\xac\x20\xda\x72\x3b\xa2\x4b\x38\xd7\xb5\x89\xbe\x42\xd9\xb9\x73\xc4\x0c\x6d\xb7\xd9\xf8\x8d\xbd\x3e\x9c\xf5\x53\x68\x48\x14\x36\x8f\x09\xc5\x92\xf1\x21\xd1\x09\x07\x1c\xbe\xa7\x91\xf3\x6a\xc8\xc1\x57\xb0\xdd\xc5\xc6\x1d\xad\x76\x1d\xa8\x82\x0e\x4c\x38\xfe\xa5\x8c\xc5\x0a\x40\x5d\xa1\xbb\x98\xd1\xfb\x74\x61\xed\x1a\x98\xaf\x3c\x8c\x1e\xe3\xc2\x92\x29\x74\x3e\x99\xd0\xf9\x41\x50\xd0\x38\x4b\x57\x7e\x5b\x7a\x0e\xe6\xce\x4e\xd7\x19\x35\x57\xbb\x3c\x3c\xd2\x5e\x4f\x4b\x4c\xf7\x0f\x4d\x2b\x91\x5d\x94\xa6\x95\xc8\x69\x25\x72\x5a\x89\x7c\xb8\x95\xc8\x07\x80\x8c\xda\x9c\x64\x7b\xb7\x71\xdf\x57\x12\x4b\x9a\x1f\x72\x0c\x13\x03\xad\x3c\xd5\x4e\xde\x8e\x57\x13\x6d\x34\x86\xcf\x97\xe6\xa4\x68\xc4\xb0\xf6\xc9\xc2\xeb\x8d\x0b\xd7\xcd\xfe\xba\xa6\xf5\x30\xeb\x30\x33\xbe\xc7\x56\x27\xab\x08\xd9\x6d\xbb\x09\xee\x7c\x2d\xcf\xee\x87\x38\xac\xc8\xdd\x90\x9a\x58\x4a\x4e\x96\xa9\x79\x79\xf3\xde\x20\xf0\x96\xe3\x24\x19\xeb\xba\xf2\x53\x19\xab\x12\xaf\x47\xb3\xa0\x3e\xef\x9b\x8d\x6d\x6d\x7b\xde\x3b\x3b\x1a\xc0\x3f\x95\x7e\xed\x78\xfb\x76\xb8\xaf\xb3\xdd\xc5\xeb\x95\xed\x5a\x62\x41\x82\xb3\x54\x6e\x80\x4a\x92\x6f\x36\xbd\x34\xae\xde\x6f\xa4\xc0\xbc\x08\xe3\x84\xfc\x1d\xb6\xe3\xd0\x62\x38\x95\x9b\x57\xe7\x71\x12\x91\x80\xc8\x31\x69\x5e\x60\x21\x6e\x19\x0f\xc7\xa4\x79\x96\x28\x3e\x47\x54\x65\x41\x36\x08\x40\x88\x1f\x58\x08\x56\xaa\xd5\xbf\xaf\xad\x96\xd7\xd6\xcf\x87\xf5\x34\x0f\x71\x93\x6e\x26\xed\x98\x5b\x9f\x4f\xcf\x95\x34\xc6\xd7\x11\xfa\xb0\x81\x22\x1a\xdb\xdf\x8e\xdc\xc3\xb9\xf8\xdd\x5d\x3c\x74\xe6\xea\xb7\x8b\xbf\xf5\x6e\xb3\x46\x2e\x64\xf4\xab\x3c\x4e\xcf\x36\x1d\xfe\xfa\xb8\x36\xba\x8a\xd8\xad\xf6\xc6\x41\x2a\x37\x8c\x17\x0f\xda\xfe\xda\xe7\x65\xbc\x71\x2c\x36\x57\x8a\x47\x12\x4c\xf1\xbd\x77\x6b\xa4\x50\x7e\x77\x7b\x22\x60\x89\xef\xcd\xf5\xb9\x0c\x97\x79\x0d\x2b\x35\x43\xcb\x3d\x24\xf1\x78\xfc\xf8\xcb\x1f\x15\x06\xe2\x78\xd8\x51\x21\xd9\x1f\xf0\xf5\x8f\x86\xa4\x50\xfa\xb1\x47\x43\xa5\xdd\x69\x14\xe8\xa3\xc0\x86\x91\xa7\x81\x50\xb4\x7c\xc0\x81\x80\x77\x7a\x9f\xc6\xc2\xa9\x8c\x05\x33\xb0\x3b\x31\xa4\xf4\xd7\x1b\x26\x55\x97\x7c\x65\xf8\x69\x1a\x84\x8e\x41\x78\xd9\xec\xc5\x11\x16\x1e\x74\x91\xf5\x56\xf5\x57\x49\x47\x5c\x92\xa9\x1e\x99\x36\xf4\xdb\xb1\x0e\xd3\x78\x02\xb0\x9b\x25\xcb\xe9\xe9\x1d\x0d\x44\x01\x42\x08\x91\x64\xd9\xdd\x37\x08\x17\xef\xf9\xe5\x0f\xbd\x46\x91\xf5\xf9\x89\x92\x37\xdd\x89\x59\x44\x1f\x9c\xee\x34\x1e\xbe\x47\x83\x32\x72\x8e\x37\xdf\xac\x69\x38\xef\x75\xb0\xda\xdb\xac\x83\x94\x2f\x39\xa6\x62\x05\x1c\x25\x9c\x49\x16\xb0\xa8\x3c\xc7\x7e\x76\x71\x3e\x6f\xb5\x24\xe7\xe8\xb7\xb9\xc7\x6c\x43\x92\xee\x21\xd4\x17\xa1\x7f\xba\x35\xfe\xae\x39\xbc\xde\xba\x69\xd9\x8e\xe1\x62\xde\x64\x7d\x16\x88\x1b\xed\x29\x11\xfd\x4f\xa9\xff\x99\x90\xc4\xf6\xf4\xf9\x6e\xe9\x28\x23\xd7\xca\xe5\xee\xee\x9f\x63\xb1\x5b\xfb\x10\xd7\x2f\x1d\xf2\xe3\xbf\xb9\xb5\x6f\xa4\x6d\x7d\x25\x79\xfb\x24\x31\xea\x56\xbe\x5d\x53\xcd\x2d\x36\xa3\x6d\xdf\xab\x1c\xb8\x6d\x6f\xc0\x98\xa7\xdd\xaa\x86\x8c\x1d\x39\xa3\x9d\x70\x2b\x9b\x68\xd9\xfd\x33\xfe\xa9\xb6\x4a\x2e\x63\x0f\xcf\x68\x27\xd9\x4c\xb9\x46\x6d\xcb\xbe\xa1\xa8\xd6\x5f\xc6\xd6\x9f\xf1\x4f\xf4\xd4\xb4\x78\xd0\xd6\xf4\x13\x3c\x3b\xac\xd0\xdc\x90\x34\xda\xc9\xb4\x9a\x1a\x8d\xbd\x93\x87\xd4\xe2\x21\x1b\xb3\x2b\xd1\xbe\xe7\x69\xd4\x53\x67\xd5\x40\xa0\xe3\x19\x3f\x6d\x1a\xbc\x0e\x86\x3c\x10\xb4\x3d\x2a\xcd\x78\x32\xe6\xab\xbd\x36\xc9\xf4\x3a\x58\xae\xc3\xf4\x47\xea\xbf\xfb\x47\xff\x0d\x00\x00\xff\xff\xd2\x32\x5a\x28\x38\x9d\x00\x00") -func v2SchemaJSONBytes() ([]byte, error) { +func v2SchemaJsonBytes() ([]byte, error) { return bindataRead( - _v2SchemaJSON, + _v2SchemaJson, "v2/schema.json", ) } -func v2SchemaJSON() (*asset, error) { - bytes, err := v2SchemaJSONBytes() +func v2SchemaJson() (*asset, error) { + bytes, err := v2SchemaJsonBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "v2/schema.json", size: 40249, mode: os.FileMode(0644), modTime: time.Unix(1567900649, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcb, 0x25, 0x27, 0xe8, 0x46, 0xae, 0x22, 0xc4, 0xf4, 0x8b, 0x1, 0x32, 0x4d, 0x1f, 0xf8, 0xdf, 0x75, 0x15, 0xc8, 0x2d, 0xc7, 0xed, 0xe, 0x7e, 0x0, 0x75, 0xc0, 0xf9, 0xd2, 0x1f, 0x75, 0x57}} + info := bindataFileInfo{name: "v2/schema.json", size: 40248, mode: os.FileMode(0640), modTime: time.Unix(1568964748, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xab, 0x88, 0x5e, 0xf, 0xbf, 0x17, 0x74, 0x0, 0xb2, 0x5a, 0x7f, 0xbc, 0x58, 0xcd, 0xc, 0x25, 0x73, 0xd5, 0x29, 0x1c, 0x7a, 0xd0, 0xce, 0x79, 0xd4, 0x89, 0x31, 0x27, 0x90, 0xf2, 0xff, 0xe6}} return a, nil } @@ -201,9 +201,9 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "jsonschema-draft-04.json": jsonschemaDraft04JSON, + "jsonschema-draft-04.json": jsonschemaDraft04Json, - "v2/schema.json": v2SchemaJSON, + "v2/schema.json": v2SchemaJson, } // AssetDir returns the file names below a certain @@ -247,9 +247,9 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ - "jsonschema-draft-04.json": &bintree{jsonschemaDraft04JSON, map[string]*bintree{}}, + "jsonschema-draft-04.json": &bintree{jsonschemaDraft04Json, map[string]*bintree{}}, "v2": &bintree{nil, map[string]*bintree{ - "schema.json": &bintree{v2SchemaJSON, map[string]*bintree{}}, + "schema.json": &bintree{v2SchemaJson, map[string]*bintree{}}, }}, }} diff --git a/vendor/github.com/go-openapi/spec/contact_info.go b/vendor/github.com/go-openapi/spec/contact_info.go index f285970aa1..f9bf42e8dd 100644 --- a/vendor/github.com/go-openapi/spec/contact_info.go +++ b/vendor/github.com/go-openapi/spec/contact_info.go @@ -14,11 +14,41 @@ package spec +import ( + "encoding/json" + + "github.com/go-openapi/swag" +) + // ContactInfo contact information for the exposed API. // // For more information: http://goo.gl/8us55a#contactObject type ContactInfo struct { + ContactInfoProps + VendorExtensible +} + +type ContactInfoProps struct { Name string `json:"name,omitempty"` URL string `json:"url,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 +} diff --git a/vendor/github.com/go-openapi/spec/expander.go b/vendor/github.com/go-openapi/spec/expander.go index 1e7fc8c490..1f30e7f8b1 100644 --- a/vendor/github.com/go-openapi/spec/expander.go +++ b/vendor/github.com/go-openapi/spec/expander.go @@ -200,11 +200,11 @@ func ExpandSpec(spec *Swagger, options *ExpandOptions) error { return nil } +const rootBase = "root" // baseForRoot loads in the cache the root document and produces a fake "root" base path entry // for further $ref resolution func baseForRoot(root interface{}, cache ResolutionCache) string { // cache the root document to resolve $ref's - const rootBase = "root" if root != nil { base, _ := absPath(rootBase) normalizedBase := normalizeAbsPath(base) @@ -452,11 +452,12 @@ func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) return err } if pathItem.Ref.String() != "" { - var err error - resolver, err = resolver.transitiveResolver(basePath, pathItem.Ref) - if resolver.shouldStopOnError(err) { + transitiveResolver, err := resolver.transitiveResolver(basePath, pathItem.Ref) + if transitiveResolver.shouldStopOnError(err) { return err } + basePath = transitiveResolver.updateBasePath(resolver, basePath) + resolver = transitiveResolver } pathItem.Ref = Ref{} diff --git a/vendor/github.com/go-openapi/spec/go.mod b/vendor/github.com/go-openapi/spec/go.mod index 02a142c03c..14e5f2dac3 100644 --- a/vendor/github.com/go-openapi/spec/go.mod +++ b/vendor/github.com/go-openapi/spec/go.mod @@ -4,14 +4,9 @@ require ( github.com/go-openapi/jsonpointer v0.19.3 github.com/go-openapi/jsonreference v0.19.2 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 - golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 // indirect golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // 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.2 + gopkg.in/yaml.v2 v2.2.4 ) go 1.13 diff --git a/vendor/github.com/go-openapi/spec/go.sum b/vendor/github.com/go-openapi/spec/go.sum index 86db601c97..c209ff9712 100644 --- a/vendor/github.com/go-openapi/spec/go.sum +++ b/vendor/github.com/go-openapi/spec/go.sum @@ -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/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= 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/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/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/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 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/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/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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/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-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/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/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-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/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/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 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/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/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= diff --git a/vendor/github.com/go-openapi/spec/license.go b/vendor/github.com/go-openapi/spec/license.go index f20961b4fd..e1529b401c 100644 --- a/vendor/github.com/go-openapi/spec/license.go +++ b/vendor/github.com/go-openapi/spec/license.go @@ -14,10 +14,40 @@ package spec +import ( + "encoding/json" + + "github.com/go-openapi/swag" +) + // License information for the exposed API. // // For more information: http://goo.gl/8us55a#licenseObject type License struct { + LicenseProps + VendorExtensible +} + +type LicenseProps struct { Name string `json:"name,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 +} diff --git a/vendor/github.com/go-openapi/spec/ref.go b/vendor/github.com/go-openapi/spec/ref.go index 08ff869b2f..1f31a9ead0 100644 --- a/vendor/github.com/go-openapi/spec/ref.go +++ b/vendor/github.com/go-openapi/spec/ref.go @@ -68,10 +68,12 @@ func (r *Ref) IsValidURI(basepaths ...string) bool { } if r.HasFullURL { + //#nosec rr, err := http.Get(v) if err != nil { return false } + defer rr.Body.Close() return rr.StatusCode/100 == 2 } diff --git a/vendor/github.com/go-openapi/spec/schema_loader.go b/vendor/github.com/go-openapi/spec/schema_loader.go index 9e20e96c2a..02d9966c1a 100644 --- a/vendor/github.com/go-openapi/spec/schema_loader.go +++ b/vendor/github.com/go-openapi/spec/schema_loader.go @@ -86,12 +86,7 @@ func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) (*schemaLoad newOptions := r.options newOptions.RelativeBase = rootURL.String() debugLog("setting new root: %s", newOptions.RelativeBase) - resolver, err := defaultSchemaLoader(root, newOptions, r.cache, r.context) - if err != nil { - return nil, err - } - - return resolver, nil + return defaultSchemaLoader(root, newOptions, r.cache, r.context) } 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.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) if !fromCache { diff --git a/vendor/github.com/go-openapi/strfmt/.golangci.yml b/vendor/github.com/go-openapi/strfmt/.golangci.yml index f260ce7e5c..03ffa31a4e 100644 --- a/vendor/github.com/go-openapi/strfmt/.golangci.yml +++ b/vendor/github.com/go-openapi/strfmt/.golangci.yml @@ -20,6 +20,11 @@ linters: - lll - gochecknoinits - gochecknoglobals + - godox + - gocognit + - whitespace + - wsl + - funlen issues: exclude-rules: @@ -27,4 +32,5 @@ issues: text: "should be .*ObjectID" linters: - golint + - stylecheck diff --git a/vendor/github.com/go-openapi/strfmt/README.md b/vendor/github.com/go-openapi/strfmt/README.md index 87357cd024..b2645ce18a 100644 --- a/vendor/github.com/go-openapi/strfmt/README.md +++ b/vendor/github.com/go-openapi/strfmt/README.md @@ -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 > "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 Types defined in strfmt expose marshaling and validation capabilities. diff --git a/vendor/github.com/go-openapi/strfmt/date.go b/vendor/github.com/go-openapi/strfmt/date.go index 2959e65730..15029ffa2f 100644 --- a/vendor/github.com/go-openapi/strfmt/date.go +++ b/vendor/github.com/go-openapi/strfmt/date.go @@ -151,3 +151,32 @@ func (d *Date) DeepCopy() *Date { d.DeepCopyInto(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 +} diff --git a/vendor/github.com/go-openapi/strfmt/go.mod b/vendor/github.com/go-openapi/strfmt/go.mod index 78c8489b20..eaf7544712 100644 --- a/vendor/github.com/go-openapi/strfmt/go.mod +++ b/vendor/github.com/go-openapi/strfmt/go.mod @@ -11,3 +11,5 @@ require ( github.com/tidwall/pretty v1.0.0 // indirect go.mongodb.org/mongo-driver v1.0.3 ) + +go 1.13 diff --git a/vendor/github.com/go-openapi/strfmt/time.go b/vendor/github.com/go-openapi/strfmt/time.go index f9151259ed..0b2f52d249 100644 --- a/vendor/github.com/go-openapi/strfmt/time.go +++ b/vendor/github.com/go-openapi/strfmt/time.go @@ -4,7 +4,7 @@ // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, @@ -16,14 +16,16 @@ package strfmt import ( "database/sql/driver" + "encoding/binary" "encoding/json" - "errors" "fmt" "regexp" "strings" "time" "go.mongodb.org/mongo-driver/bson" + + "go.mongodb.org/mongo-driver/bson/bsontype" ) func init() { @@ -57,12 +59,16 @@ const ( RFC3339Micro = "2006-01-02T15:04:05.000000Z07:00" // ISO8601LocalTime represents a ISO8601 format to ISO8601 in local time (no timezone) 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 = `^([0-9]{2}):([0-9]{2}):([0-9]{2})(.[0-9]+)?(z|([+-][0-9]{2}:[0-9]{2}))$` ) 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) // MarshalFormat sets the time resolution format used for marshaling time (set to milliseconds) MarshalFormat = RFC3339Millis @@ -165,26 +171,51 @@ func (t *DateTime) UnmarshalJSON(data []byte) error { return nil } +// MarshalBSON renders the DateTime as a BSON document 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 { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err + var obj struct { + Data DateTime } - if data, ok := m["data"].(string); ok { - rd, err := ParseDateTime(data) - if err != nil { - return err - } - *t = rd - return nil + if err := bson.Unmarshal(data, &obj); err != nil { + return err } - return errors.New("couldn't unmarshal bson bytes value as Date") + *t = obj.Data + + 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. @@ -201,3 +232,32 @@ func (t *DateTime) DeepCopy() *DateTime { t.DeepCopyInto(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 +} diff --git a/vendor/github.com/go-openapi/swag/.travis.yml b/vendor/github.com/go-openapi/swag/.travis.yml index aa26d8763a..f1a3f80b35 100644 --- a/vendor/github.com/go-openapi/swag/.travis.yml +++ b/vendor/github.com/go-openapi/swag/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/swag/convert.go b/vendor/github.com/go-openapi/swag/convert.go index 7da35c316e..fc085aeb8e 100644 --- a/vendor/github.com/go-openapi/swag/convert.go +++ b/vendor/github.com/go-openapi/swag/convert.go @@ -88,7 +88,7 @@ func ConvertFloat64(str string) (float64, error) { 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) { i, err := strconv.ParseInt(str, 10, 8) if err != nil { @@ -97,7 +97,7 @@ func ConvertInt8(str string) (int8, error) { return int8(i), nil } -// ConvertInt16 turn a string into a int16 +// ConvertInt16 turn a string into an int16 func ConvertInt16(str string) (int16, error) { i, err := strconv.ParseInt(str, 10, 16) if err != nil { @@ -106,7 +106,7 @@ func ConvertInt16(str string) (int16, error) { return int16(i), nil } -// ConvertInt32 turn a string into a int32 +// ConvertInt32 turn a string into an int32 func ConvertInt32(str string) (int32, error) { i, err := strconv.ParseInt(str, 10, 32) if err != nil { @@ -115,12 +115,12 @@ func ConvertInt32(str string) (int32, error) { return int32(i), nil } -// ConvertInt64 turn a string into a int64 +// ConvertInt64 turn a string into an int64 func ConvertInt64(str string) (int64, error) { 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) { i, err := strconv.ParseUint(str, 10, 8) if err != nil { @@ -129,7 +129,7 @@ func ConvertUint8(str string) (uint8, error) { return uint8(i), nil } -// ConvertUint16 turn a string into a uint16 +// ConvertUint16 turn a string into an uint16 func ConvertUint16(str string) (uint16, error) { i, err := strconv.ParseUint(str, 10, 16) if err != nil { @@ -138,7 +138,7 @@ func ConvertUint16(str string) (uint16, error) { return uint16(i), nil } -// ConvertUint32 turn a string into a uint32 +// ConvertUint32 turn a string into an uint32 func ConvertUint32(str string) (uint32, error) { i, err := strconv.ParseUint(str, 10, 32) if err != nil { @@ -147,7 +147,7 @@ func ConvertUint32(str string) (uint32, error) { return uint32(i), nil } -// ConvertUint64 turn a string into a uint64 +// ConvertUint64 turn a string into an uint64 func ConvertUint64(str string) (uint64, error) { return strconv.ParseUint(str, 10, 64) } diff --git a/vendor/github.com/go-openapi/swag/convert_types.go b/vendor/github.com/go-openapi/swag/convert_types.go index c95e4e78bd..c49cc473a8 100644 --- a/vendor/github.com/go-openapi/swag/convert_types.go +++ b/vendor/github.com/go-openapi/swag/convert_types.go @@ -181,12 +181,12 @@ func IntValueMap(src map[string]*int) map[string]int { 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 { 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. func Int32Value(v *int32) int32 { if v != nil { @@ -195,7 +195,7 @@ func Int32Value(v *int32) int32 { 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 func Int32Slice(src []int32) []*int32 { dst := make([]*int32, len(src)) @@ -299,13 +299,80 @@ func Int64ValueMap(src map[string]*int64) map[string]int64 { 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 { return &v } -// UintValue returns the value of the uint pouinter passed in or -// 0 if the pouinter is nil. +// UintValue returns the value of the uint pointer passed in or +// 0 if the pointer is nil. func UintValue(v *uint) uint { if v != nil { return *v @@ -313,8 +380,8 @@ func UintValue(v *uint) uint { return 0 } -// UintSlice converts a slice of uint values uinto a slice of -// uint pouinters +// UintSlice converts a slice of uint values into a slice of +// uint pointers func UintSlice(src []uint) []*uint { dst := make([]*uint, len(src)) for i := 0; i < len(src); i++ { @@ -323,7 +390,7 @@ func UintSlice(src []uint) []*uint { 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 func UintValueSlice(src []*uint) []uint { dst := make([]uint, len(src)) @@ -335,8 +402,8 @@ func UintValueSlice(src []*uint) []uint { return dst } -// UintMap converts a string map of uint values uinto a string -// map of uint pouinters +// UintMap converts a string map of uint values into a string +// map of uint pointers func UintMap(src map[string]uint) map[string]*uint { dst := make(map[string]*uint) for k, val := range src { @@ -346,7 +413,7 @@ func UintMap(src map[string]uint) map[string]*uint { 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 func UintValueMap(src map[string]*uint) map[string]uint { dst := make(map[string]uint) @@ -358,13 +425,13 @@ func UintValueMap(src map[string]*uint) map[string]uint { 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 { return &v } -// Uint32Value returns the value of the uint64 pouinter passed in or -// 0 if the pouinter is nil. +// Uint32Value returns the value of the uint32 pointer passed in or +// 0 if the pointer is nil. func Uint32Value(v *uint32) uint32 { if v != nil { return *v @@ -372,8 +439,8 @@ func Uint32Value(v *uint32) uint32 { return 0 } -// Uint32Slice converts a slice of uint64 values uinto a slice of -// uint32 pouinters +// Uint32Slice converts a slice of uint32 values into a slice of +// uint32 pointers func Uint32Slice(src []uint32) []*uint32 { dst := make([]*uint32, len(src)) for i := 0; i < len(src); i++ { @@ -382,7 +449,7 @@ func Uint32Slice(src []uint32) []*uint32 { 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 func Uint32ValueSlice(src []*uint32) []uint32 { dst := make([]uint32, len(src)) @@ -394,8 +461,8 @@ func Uint32ValueSlice(src []*uint32) []uint32 { return dst } -// Uint32Map converts a string map of uint32 values uinto a string -// map of uint32 pouinters +// Uint32Map converts a string map of uint32 values into a string +// map of uint32 pointers func Uint32Map(src map[string]uint32) map[string]*uint32 { dst := make(map[string]*uint32) for k, val := range src { @@ -405,7 +472,7 @@ func Uint32Map(src map[string]uint32) map[string]*uint32 { 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 func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { dst := make(map[string]uint32) @@ -417,13 +484,13 @@ func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { 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 { return &v } -// Uint64Value returns the value of the uint64 pouinter passed in or -// 0 if the pouinter is nil. +// Uint64Value returns the value of the uint64 pointer passed in or +// 0 if the pointer is nil. func Uint64Value(v *uint64) uint64 { if v != nil { return *v @@ -431,8 +498,8 @@ func Uint64Value(v *uint64) uint64 { return 0 } -// Uint64Slice converts a slice of uint64 values uinto a slice of -// uint64 pouinters +// Uint64Slice converts a slice of uint64 values into a slice of +// uint64 pointers func Uint64Slice(src []uint64) []*uint64 { dst := make([]*uint64, len(src)) for i := 0; i < len(src); i++ { @@ -441,7 +508,7 @@ func Uint64Slice(src []uint64) []*uint64 { 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 func Uint64ValueSlice(src []*uint64) []uint64 { dst := make([]uint64, len(src)) @@ -453,8 +520,8 @@ func Uint64ValueSlice(src []*uint64) []uint64 { return dst } -// Uint64Map converts a string map of uint64 values uinto a string -// map of uint64 pouinters +// Uint64Map converts a string map of uint64 values into a string +// map of uint64 pointers func Uint64Map(src map[string]uint64) map[string]*uint64 { dst := make(map[string]*uint64) for k, val := range src { @@ -464,7 +531,7 @@ func Uint64Map(src map[string]uint64) map[string]*uint64 { 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 func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { dst := make(map[string]uint64) @@ -476,6 +543,74 @@ func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { 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. func Float64(v float64) *float64 { return &v diff --git a/vendor/github.com/go-openapi/swag/go.mod b/vendor/github.com/go-openapi/swag/go.mod index 15bbb08222..4aef463e42 100644 --- a/vendor/github.com/go-openapi/swag/go.mod +++ b/vendor/github.com/go-openapi/swag/go.mod @@ -6,9 +6,11 @@ require ( github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 github.com/stretchr/testify v1.3.0 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 sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1 + +go 1.13 diff --git a/vendor/github.com/go-openapi/swag/go.sum b/vendor/github.com/go-openapi/swag/go.sum index 33469f54ac..e8a80bacf0 100644 --- a/vendor/github.com/go-openapi/swag/go.sum +++ b/vendor/github.com/go-openapi/swag/go.sum @@ -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 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/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.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/go-openapi/swag/json.go b/vendor/github.com/go-openapi/swag/json.go index edf93d84c6..7e9902ca31 100644 --- a/vendor/github.com/go-openapi/swag/json.go +++ b/vendor/github.com/go-openapi/swag/json.go @@ -51,7 +51,7 @@ type ejUnmarshaler interface { 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. func WriteJSON(data interface{}) ([]byte, error) { if d, ok := data.(ejMarshaler); ok { @@ -65,8 +65,8 @@ func WriteJSON(data interface{}) ([]byte, error) { return json.Marshal(data) } -// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller -// so it takes the fastes option available +// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler +// so it takes the fastest option available func ReadJSON(data []byte, value interface{}) error { trimmedData := bytes.Trim(data, "\x00") if d, ok := value.(ejUnmarshaler); ok { @@ -189,7 +189,7 @@ func FromDynamicJSON(data, target interface{}) error { 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 // This type is thread-safe. type NameProvider struct { diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go index 70f4fb361c..04160b89ba 100644 --- a/vendor/github.com/go-openapi/swag/loading.go +++ b/vendor/github.com/go-openapi/swag/loading.go @@ -27,6 +27,15 @@ import ( // LoadHTTPTimeout the default timeout for load requests 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 func LoadFromFileOrHTTP(path string) ([]byte, error) { 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 { 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) defer func() { if resp != nil { diff --git a/vendor/github.com/go-openapi/validate/.golangci.yml b/vendor/github.com/go-openapi/validate/.golangci.yml index c2c5071322..dc8178c809 100644 --- a/vendor/github.com/go-openapi/validate/.golangci.yml +++ b/vendor/github.com/go-openapi/validate/.golangci.yml @@ -4,17 +4,25 @@ linters-settings: golint: min-confidence: 0 gocyclo: - min-complexity: 25 + min-complexity: 50 maligned: suggest-new: true dupl: threshold: 100 goconst: min-len: 2 - min-occurrences: 2 + min-occurrences: 3 linters: enable-all: true disable: - maligned - lll + - godox + - gocognit + - whitespace + - wsl + - funlen + - gochecknoglobals + - gochecknoinits + - scopelint diff --git a/vendor/github.com/go-openapi/validate/.travis.yml b/vendor/github.com/go-openapi/validate/.travis.yml index dd3a4b29fd..db0bb78f5d 100644 --- a/vendor/github.com/go-openapi/validate/.travis.yml +++ b/vendor/github.com/go-openapi/validate/.travis.yml @@ -1,12 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.11.x -- 1.12.x +- 1.13.x +- 1.14.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum -env: -- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/validate/default_validator.go b/vendor/github.com/go-openapi/validate/default_validator.go index 35c631be6d..26d54b7c23 100644 --- a/vendor/github.com/go-openapi/validate/default_validator.go +++ b/vendor/github.com/go-openapi/validate/default_validator.go @@ -33,14 +33,8 @@ func (d *defaultValidator) resetVisited() { d.visitedSchemas = map[string]bool{} } -// 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 { - found := d.visitedSchemas[path] +func isVisited(path string, visitedSchemas map[string]bool) bool { + found := visitedSchemas[path] if !found { // search for overlapping paths frags := strings.Split(path, ".") @@ -70,6 +64,16 @@ func (d *defaultValidator) isVisited(path string) bool { 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 func (d *defaultValidator) Validate() (errs *Result) { errs = new(Result) @@ -89,64 +93,60 @@ func (d *defaultValidator) validateDefaultValueValidAgainstSchema() *Result { s := d.SpecValidator for method, pathItem := range s.analyzer.Operations() { - if pathItem != nil { // Safeguard - for path, op := range pathItem { - // parameters - for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - if param.Default != nil && param.Required { - res.AddWarnings(requiredHasDefaultMsg(param.Name, param.In)) - } + for path, op := range pathItem { + // parameters + for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { + if param.Default != nil && param.Required { + res.AddWarnings(requiredHasDefaultMsg(param.Name, param.In)) + } - // reset explored schemas to get depth-first recursive-proof exploration - d.resetVisited() + // reset explored schemas to get depth-first recursive-proof exploration + d.resetVisited() - // Check simple parameters first - // default values provided must validate against their inline definition (no explicit schema) - if param.Default != nil && param.Schema == nil { - // check param default value is valid - red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Default) - if red.HasErrorsOrWarnings() { - res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) - res.Merge(red) - } + // Check simple parameters first + // default values provided must validate against their inline definition (no explicit schema) + if param.Default != nil && param.Schema == nil { + // check param default value is valid + red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Default) + if red.HasErrorsOrWarnings() { + res.AddErrors(defaultValueDoesNotValidateMsg(param.Name, param.In)) + 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) - } + // 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 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, "default", 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 { - // 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 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) + // nolint: dupl if response.Headers != nil { // Safeguard for nm, h := range response.Headers { // reset explored schemas to get depth-first recursive-proof exploration @@ -223,7 +224,7 @@ func (d *defaultValidator) validateDefaultValueSchemaAgainstSchema(path, in stri s := d.SpecValidator 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.Schema != nil { @@ -260,6 +261,8 @@ func (d *defaultValidator) validateDefaultValueSchemaAgainstSchema(path, in stri 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 { res := new(Result) s := d.SpecValidator diff --git a/vendor/github.com/go-openapi/validate/example_validator.go b/vendor/github.com/go-openapi/validate/example_validator.go index b2acf1055c..1303591751 100644 --- a/vendor/github.com/go-openapi/validate/example_validator.go +++ b/vendor/github.com/go-openapi/validate/example_validator.go @@ -16,7 +16,6 @@ package validate import ( "fmt" - "strings" "github.com/go-openapi/spec" ) @@ -39,34 +38,7 @@ func (ex *exampleValidator) beingVisited(path string) { // isVisited tells if a path has already been visited func (ex *exampleValidator) isVisited(path string) bool { - found := ex.visitedSchemas[path] - 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 + return isVisited(path, ex.visitedSchemas) } // Validate validates the example values declared in the swagger spec @@ -97,64 +69,60 @@ func (ex *exampleValidator) validateExampleValueValidAgainstSchema() *Result { s := ex.SpecValidator for method, pathItem := range s.analyzer.Operations() { - if pathItem != nil { // Safeguard - for path, op := range pathItem { - // parameters - for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { + for path, op := range pathItem { + // parameters + for _, param := range paramHelp.safeExpandedParamsFor(path, method, op.ID, res, s) { - // As of swagger 2.0, Examples are not supported in simple parameters - // However, it looks like it is supported by go-openapi + // As of swagger 2.0, Examples are not supported in simple parameters + // However, it looks like it is supported by go-openapi - // reset explored schemas to get depth-first recursive-proof exploration - ex.resetVisited() + // reset explored schemas to get depth-first recursive-proof exploration + ex.resetVisited() - // Check simple parameters first - // default values provided must validate against their inline definition (no explicit schema) - if param.Example != nil && param.Schema == nil { - // check param default value is valid - red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Example) - if red.HasErrorsOrWarnings() { - res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) - res.MergeAsWarnings(red) - } + // Check simple parameters first + // default values provided must validate against their inline definition (no explicit schema) + if param.Example != nil && param.Schema == nil { + // check param default value is valid + red := NewParamValidator(¶m, s.KnownFormats).Validate(param.Example) + if red.HasErrorsOrWarnings() { + res.AddWarnings(exampleValueDoesNotValidateMsg(param.Name, param.In)) + 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) - } + // 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 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, "default", 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 { - // 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 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) + // nolint: dupl if response.Headers != nil { // Safeguard for nm, h := range response.Headers { // 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.Schema != nil { 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 { // TODO: validate other media types too res.AddWarnings(examplesMimeNotSupportedMsg(operationID, responseName)) @@ -244,7 +213,7 @@ func (ex *exampleValidator) validateExampleValueSchemaAgainstSchema(path, in str res := new(Result) 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.Schema != nil { @@ -281,6 +250,8 @@ func (ex *exampleValidator) validateExampleValueSchemaAgainstSchema(path, in str 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 { res := new(Result) s := ex.SpecValidator diff --git a/vendor/github.com/go-openapi/validate/formats.go b/vendor/github.com/go-openapi/validate/formats.go index b7afe981bc..0ad996cbbc 100644 --- a/vendor/github.com/go-openapi/validate/formats.go +++ b/vendor/github.com/go-openapi/validate/formats.go @@ -37,19 +37,15 @@ func (f *formatValidator) Applies(source interface{}, kind reflect.Kind) bool { if source == nil { return false } - switch source.(type) { + switch source := source.(type) { case *spec.Items: - it := source.(*spec.Items) - return kind == reflect.String && f.KnownFormats.ContainsName(it.Format) + return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) case *spec.Parameter: - par := source.(*spec.Parameter) - return kind == reflect.String && f.KnownFormats.ContainsName(par.Format) + return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) case *spec.Schema: - sch := source.(*spec.Schema) - return kind == reflect.String && f.KnownFormats.ContainsName(sch.Format) + return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) case *spec.Header: - hdr := source.(*spec.Header) - return kind == reflect.String && f.KnownFormats.ContainsName(hdr.Format) + return kind == reflect.String && f.KnownFormats.ContainsName(source.Format) } return false } diff --git a/vendor/github.com/go-openapi/validate/go.mod b/vendor/github.com/go-openapi/validate/go.mod index ed27309e9c..76b705283e 100644 --- a/vendor/github.com/go-openapi/validate/go.mod +++ b/vendor/github.com/go-openapi/validate/go.mod @@ -1,17 +1,21 @@ module github.com/go-openapi/validate +go 1.14 + require ( - github.com/go-openapi/analysis v0.19.4 - github.com/go-openapi/errors v0.19.2 + github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect + 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/loads v0.19.2 - github.com/go-openapi/runtime v0.19.4 - github.com/go-openapi/spec v0.19.3 - github.com/go-openapi/strfmt v0.19.2 - github.com/go-openapi/swag v0.19.5 - github.com/stretchr/testify v1.4.0 - go.mongodb.org/mongo-driver v1.1.1 // indirect - gopkg.in/yaml.v2 v2.2.2 + github.com/go-openapi/loads v0.19.5 + github.com/go-openapi/runtime v0.19.15 + github.com/go-openapi/spec v0.19.8 + github.com/go-openapi/strfmt v0.19.5 + github.com/go-openapi/swag v0.19.9 + github.com/mitchellh/mapstructure v1.3.2 // indirect + github.com/stretchr/testify v1.6.1 + 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 diff --git a/vendor/github.com/go-openapi/validate/go.sum b/vendor/github.com/go-openapi/validate/go.sum index 18f191d640..a52271927d 100644 --- a/vendor/github.com/go-openapi/validate/go.sum +++ b/vendor/github.com/go-openapi/validate/go.sum @@ -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.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= 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-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-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.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 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.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-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= 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.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.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.4 h1:1TjOzrWkj+9BrjnM1yPAICbaoC0FyfD49oVkTBrSSa0= 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.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.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.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.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= 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.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.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.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.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.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.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.4 h1:csnOgcgAiuGoM/Po7PEpKDoNulCcF3FGbSnbHfxgjMI= 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.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.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.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.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.2 h1:clPGfBnJohokno0e+d7hs6Yocrzjlgz6EsQSDncCRnE= 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.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.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= 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.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/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/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 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/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/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 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/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-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-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= 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/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/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/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.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= 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/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/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.1.1 h1:Sq1fR+0c58RME5EoqKdjkiQAmPjmfHlZOoRI6fTUOcs= 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-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-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-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-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-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-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/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-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-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-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.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= 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-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-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 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-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.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= 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= diff --git a/vendor/github.com/go-openapi/validate/helpers.go b/vendor/github.com/go-openapi/validate/helpers.go index 7ac8771094..4b77a00047 100644 --- a/vendor/github.com/go-openapi/validate/helpers.go +++ b/vendor/github.com/go-openapi/validate/helpers.go @@ -26,8 +26,67 @@ import ( "github.com/go-openapi/spec" ) -const swaggerBody = "body" -const objectType = "object" +const ( + 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 var ( @@ -205,7 +264,8 @@ func (h *paramHelper) checkExpandedParam(pr *spec.Parameter, path, in, operation res := new(Result) simpleZero := spec.SimpleSchema{} // 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 { // 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: @@ -213,13 +273,12 @@ func (h *paramHelper) checkExpandedParam(pr *spec.Parameter, path, in, operation res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation)) } res.AddErrors(invalidParameterDefinitionMsg(path, in, operation)) - } else if pr.In != swaggerBody && pr.Schema != nil { + case pr.In != swaggerBody && pr.Schema != nil: if isRef { res.AddWarnings(refShouldNotHaveSiblingsMsg(path, operation)) } res.AddErrors(invalidParameterDefinitionAsSchemaMsg(path, in, operation)) - } else if (pr.In == swaggerBody && pr.Schema == nil) || - (pr.In != swaggerBody && pr.SimpleSchema == simpleZero) { // Safeguard + case (pr.In == swaggerBody && pr.Schema == nil) || (pr.In != swaggerBody && pr.SimpleSchema == simpleZero): // Other unexpected mishaps res.AddErrors(invalidParameterDefinitionMsg(path, in, operation)) } @@ -254,8 +313,8 @@ func (r *responseHelper) responseMsgVariants( responseType string, responseCode int) (responseName, responseCodeAsStr string) { // Path variants for messages - if responseType == "default" { - responseCodeAsStr = "default" + if responseType == jsonDefault { + responseCodeAsStr = jsonDefault responseName = "default response" } else { responseCodeAsStr = strconv.Itoa(responseCode) diff --git a/vendor/github.com/go-openapi/validate/object_validator.go b/vendor/github.com/go-openapi/validate/object_validator.go index df0c5c14ef..b413ab1fa3 100644 --- a/vendor/github.com/go-openapi/validate/object_validator.go +++ b/vendor/github.com/go-openapi/validate/object_validator.go @@ -51,40 +51,54 @@ func (o *objectValidator) Applies(source interface{}, kind reflect.Kind) bool { return r } -func (o *objectValidator) isPropertyName() bool { +func (o *objectValidator) isProperties() bool { 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{}) { - if t, typeFound := val["type"]; typeFound { - if tpe, ok := t.(string); ok && tpe == "array" { - if _, itemsKeyFound := val["items"]; !itemsKeyFound { - res.AddErrors(errors.Required("items", o.Path)) + // for swagger 2.0 schemas, there is an additional constraint to have array items defined explicitly. + // with pure jsonschema draft 4, one may have arrays with undefined items (i.e. any type). + if t, typeFound := val[jsonType]; typeFound { + 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{}) { - if !o.isPropertyName() { - if _, itemsKeyFound := val["items"]; itemsKeyFound { - t, typeFound := val["type"] + if !o.isProperties() && !o.isDefault() && !o.isExample() { + if _, itemsKeyFound := val[jsonItems]; itemsKeyFound { + t, typeFound := val[jsonType] if typeFound { - if tpe, ok := t.(string); !ok || tpe != "array" { - res.AddErrors(errors.InvalidType(o.Path, o.In, "array", nil)) + if tpe, ok := t.(string); !ok || tpe != arrayType { + res.AddErrors(errors.InvalidType(o.Path, o.In, arrayType, nil)) } } else { // 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{}) { - o.checkArrayMustHaveItems(res, val) - if !o.Options.DisableObjectArrayTypeCheck { + if o.Options.EnableArrayMustHaveItemsCheck { + o.checkArrayMustHaveItems(res, val) + } + if o.Options.EnableObjectArrayTypeCheck { 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 // by higher level callers (the IMPORTANT! tag will be eventually // removed). - switch k { - // $ref is forbidden in header - case "headers": - if val[k] != nil { - if headers, mapOk := val[k].(map[string]interface{}); mapOk { - for headerKey, headerBody := range headers { - if headerBody != nil { - if headerSchema, mapOfMapOk := headerBody.(map[string]interface{}); mapOfMapOk { - if _, found := headerSchema["$ref"]; found { - var msg string - if refString, stringOk := headerSchema["$ref"].(string); stringOk { - msg = strings.Join([]string{", one may not use $ref=\":", refString, "\""}, "") - } - res.AddErrors(refNotAllowedInHeaderMsg(o.Path, headerKey, msg)) + if k == "headers" && val[k] != nil { + // $ref is forbidden in header + if headers, mapOk := val[k].(map[string]interface{}); mapOk { + for headerKey, headerBody := range headers { + if headerBody != nil { + if headerSchema, mapOfMapOk := headerBody.(map[string]interface{}); mapOfMapOk { + if _, found := headerSchema["$ref"]; found { + var msg string + if refString, stringOk := headerSchema["$ref"].(string); stringOk { + msg = strings.Join([]string{", one may not use $ref=\":", refString, "\""}, "") } + res.AddErrors(refNotAllowedInHeaderMsg(o.Path, headerKey, msg)) } } } @@ -216,8 +227,8 @@ func (o *objectValidator) Validate(data interface{}) *Result { // Check required properties if len(o.Required) > 0 { for _, k := range o.Required { - if _, ok := val[k]; !ok && !createdFromDefaults[k] { - res.AddErrors(errors.Required(o.Path+"."+k, o.In)) + if v, ok := val[k]; !ok && !createdFromDefaults[k] { + res.AddErrors(errors.Required(o.Path+"."+k, o.In, v)) continue } } diff --git a/vendor/github.com/go-openapi/validate/result.go b/vendor/github.com/go-openapi/validate/result.go index ae9b8dbf2b..8f5f935e5d 100644 --- a/vendor/github.com/go-openapi/validate/result.go +++ b/vendor/github.com/go-openapi/validate/result.go @@ -132,6 +132,7 @@ func (r *Result) RootObjectSchemata() []*spec.Schema { } // FieldSchemata returns the schemata which apply to fields in objects. +// nolint: dupl func (r *Result) FieldSchemata() map[FieldKey][]*spec.Schema { if r.cachedFieldSchemta != nil { 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. +// nolint: dupl func (r *Result) ItemSchemata() map[ItemKey][]*spec.Schema { if r.cachedItemSchemata != nil { 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. +// nolint: unparam func (r *Result) mergeForField(obj map[string]interface{}, field string, other *Result) *Result { if other == nil { 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. +// nolint: unparam func (r *Result) mergeForSlice(slice reflect.Value, i int, other *Result) *Result { if other == nil { 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}}) } +/* // 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. 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}}) } +*/ // mergeWithoutRootSchemata merges other into r, ignoring the rootObject schemata. func (r *Result) mergeWithoutRootSchemata(other *Result) { @@ -251,9 +257,7 @@ func (r *Result) mergeWithoutRootSchemata(other *Result) { if r.fieldSchemata == nil { r.fieldSchemata = other.fieldSchemata } else { - for _, x := range other.fieldSchemata { - r.fieldSchemata = append(r.fieldSchemata, x) - } + r.fieldSchemata = append(r.fieldSchemata, other.fieldSchemata...) } } @@ -261,9 +265,7 @@ func (r *Result) mergeWithoutRootSchemata(other *Result) { if r.itemSchemata == nil { r.itemSchemata = other.itemSchemata } else { - for _, x := range other.itemSchemata { - r.itemSchemata = append(r.itemSchemata, x) - } + r.itemSchemata = append(r.itemSchemata, other.itemSchemata...) } } } diff --git a/vendor/github.com/go-openapi/validate/schema.go b/vendor/github.com/go-openapi/validate/schema.go index 9bf8f2eb78..55454b8522 100644 --- a/vendor/github.com/go-openapi/validate/schema.go +++ b/vendor/github.com/go-openapi/validate/schema.go @@ -27,8 +27,8 @@ import ( var ( specSchemaType = reflect.TypeOf(&spec.Schema{}) specParameterType = reflect.TypeOf(&spec.Parameter{}) - specItemsType = reflect.TypeOf(&spec.Items{}) specHeaderType = reflect.TypeOf(&spec.Header{}) + //specItemsType = reflect.TypeOf(&spec.Items{}) ) // SchemaValidator validates data against a JSON schema @@ -39,14 +39,14 @@ type SchemaValidator struct { validators []valueValidator Root interface{} KnownFormats strfmt.Registry - Options *SchemaValidatorOptions + Options SchemaValidatorOptions } // 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. -func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registry) error { - res := NewSchemaValidator(schema, nil, "", formats).Validate(data) +func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registry, options ...Option) error { + res := NewSchemaValidator(schema, nil, "", formats, options...).Validate(data) if res.HasErrors() { return errors.CompositeValidationError(res.Errors...) } @@ -72,9 +72,15 @@ func NewSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string 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 { - o(s.Options) + o(&s.Options) } s.validators = []valueValidator{ s.typeValidator(), @@ -134,9 +140,9 @@ func (s *SchemaValidator) Validate(data interface{}) *Result { // TODO: this part should be handed over to type validator // 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 s.Schema.Type.Contains("integer") { // avoid lossy conversion + if s.Schema.Type.Contains(integerType) { // avoid lossy conversion in, erri := num.Int64() if erri != nil { result.AddErrors(invalidTypeConversionMsg(s.Path, erri)) @@ -196,6 +202,7 @@ func (s *SchemaValidator) sliceValidator() valueValidator { Items: s.Schema.Items, Root: s.Root, KnownFormats: s.KnownFormats, + Options: s.Options, } } @@ -248,6 +255,6 @@ func (s *SchemaValidator) objectValidator() valueValidator { PatternProperties: s.Schema.PatternProperties, Root: s.Root, KnownFormats: s.KnownFormats, - Options: *s.Options, + Options: s.Options, } } diff --git a/vendor/github.com/go-openapi/validate/schema_option.go b/vendor/github.com/go-openapi/validate/schema_option.go index f328b56b85..4b4879de8b 100644 --- a/vendor/github.com/go-openapi/validate/schema_option.go +++ b/vendor/github.com/go-openapi/validate/schema_option.go @@ -14,20 +14,41 @@ package validate +// SchemaValidatorOptions defines optional rules for schema validation type SchemaValidatorOptions struct { - DisableObjectArrayTypeCheck bool + EnableObjectArrayTypeCheck bool + EnableArrayMustHaveItemsCheck bool } +// Option sets optional rules for schema validation 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) { - svo.DisableObjectArrayTypeCheck = disable + svo.EnableObjectArrayTypeCheck = enable } } +// EnableArrayMustHaveItemsCheck activates the swagger rule: an array must have items defined +func EnableArrayMustHaveItemsCheck(enable bool) Option { + 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{ - DisableObjectArrayTypeCheck(svo.DisableObjectArrayTypeCheck), + EnableObjectArrayTypeCheck(svo.EnableObjectArrayTypeCheck), + EnableArrayMustHaveItemsCheck(svo.EnableArrayMustHaveItemsCheck), } } diff --git a/vendor/github.com/go-openapi/validate/slice_validator.go b/vendor/github.com/go-openapi/validate/slice_validator.go index 6e615946b6..aa429f5184 100644 --- a/vendor/github.com/go-openapi/validate/slice_validator.go +++ b/vendor/github.com/go-openapi/validate/slice_validator.go @@ -32,6 +32,7 @@ type schemaSliceValidator struct { Items *spec.SchemaOrArray Root interface{} KnownFormats strfmt.Registry + Options SchemaValidatorOptions } func (s *schemaSliceValidator) SetPath(path string) { @@ -53,7 +54,7 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { size := val.Len() 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++ { validator.SetPath(fmt.Sprintf("%s.%d", s.Path, 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 { itemsSize = len(s.Items.Schemas) 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 { 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 { @@ -78,8 +79,8 @@ func (s *schemaSliceValidator) Validate(data interface{}) *Result { } if s.AdditionalItems.Schema != nil { for i := itemsSize; i < size-itemsSize+1; i++ { - validator := NewSchemaValidator(s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats) - result.mergeForSlice(val, int(i), validator.Validate(val.Index(int(i)).Interface())) + validator := NewSchemaValidator(s.AdditionalItems.Schema, s.Root, fmt.Sprintf("%s.%d", s.Path, i), s.KnownFormats, s.Options.Options()...) + result.mergeForSlice(val, i, validator.Validate(val.Index(i).Interface())) } } } diff --git a/vendor/github.com/go-openapi/validate/spec.go b/vendor/github.com/go-openapi/validate/spec.go index 08ccd22fef..f30dd79e38 100644 --- a/vendor/github.com/go-openapi/validate/spec.go +++ b/vendor/github.com/go-openapi/validate/spec.go @@ -71,25 +71,22 @@ func NewSpecValidator(schema *spec.Schema, formats strfmt.Registry) *SpecValidat } // 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 - errs = new(Result) + errs, warnings := new(Result), new(Result) - switch v := data.(type) { - case *loads.Document: + if v, ok := data.(*loads.Document); ok { sd = v } if sd == nil { errs.AddErrors(invalidDocumentMsg()) - return + return errs, warnings // no point in continuing } s.spec = sd s.analyzer = analysis.New(sd.Spec()) - warnings = new(Result) - // Swagger schema validator - schv := NewSchemaValidator(s.schema, nil, "", s.KnownFormats) + schv := NewSchemaValidator(s.schema, nil, "", s.KnownFormats, SwaggerSchema(true)) var obj interface{} // Raw spec unmarshalling errors @@ -109,13 +106,13 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu errs.Merge(schv.Validate(obj)) // error - // There may be a point in continuing to try and determine more accurate errors if !s.Options.ContinueOnErrors && errs.HasErrors() { - return // no point in continuing + return errs, warnings // no point in continuing } errs.Merge(s.validateReferencesValid()) // error - // There may be a point in continuing to try and determine more accurate errors if !s.Options.ContinueOnErrors && errs.HasErrors() { - return // no point in continuing + return errs, warnings // no point in continuing } 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 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 @@ -147,7 +144,7 @@ func (s *SpecValidator) Validate(data interface{}) (errs *Result, warnings *Resu //errs.Merge(s.validateRefNoSibling()) // warning only errs.Merge(s.validateReferenced()) // warning only - return + return errs, warnings } func (s *SpecValidator) validateNonEmptyPathParamNames() *Result { @@ -172,9 +169,17 @@ func (s *SpecValidator) validateNonEmptyPathParamNames() *Result { func (s *SpecValidator) validateDuplicateOperationIDs() *Result { // 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) known := make(map[string]int) - for _, v := range s.analyzer.OperationIDs() { + for _, v := range analyzer.OperationIDs() { if v != "" { known[v]++ } @@ -336,14 +341,14 @@ func (s *SpecValidator) validateItems() *Result { for path, op := range pi { 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)) continue } - if param.In != "body" { + if param.In != swaggerBody { if param.Items != nil { items := param.Items - for items.TypeName() == "array" { + for items.TypeName() == arrayType { if items.ItemsTypeName() == "" { res.AddErrors(arrayInParamRequiresItemsMsg(param.Name, op.ID)) break @@ -374,7 +379,7 @@ func (s *SpecValidator) validateItems() *Result { for _, resp := range responses { // Response headers with array for hn, hv := range resp.Headers { - if hv.TypeName() == "array" && hv.ItemsTypeName() == "" { + if hv.TypeName() == arrayType && hv.ItemsTypeName() == "" { res.AddErrors(arrayInHeaderRequiresItemsMsg(hn, op.ID)) } } @@ -390,7 +395,7 @@ func (s *SpecValidator) validateItems() *Result { // Verifies constraints on array type func (s *SpecValidator) validateSchemaItems(schema spec.Schema, prefix, opID string) *Result { res := new(Result) - if !schema.Type.Contains("array") { + if !schema.Type.Contains(arrayType) { return res } @@ -451,6 +456,7 @@ func (s *SpecValidator) validateReferenced() *Result { return &res } +// nolint: dupl func (s *SpecValidator) validateReferencedParameters() *Result { // Each referenceable definition should have references. params := s.spec.Spec().Parameters @@ -463,9 +469,7 @@ func (s *SpecValidator) validateReferencedParameters() *Result { expected["#/parameters/"+jsonpointer.Escape(k)] = struct{}{} } for _, k := range s.analyzer.AllParameterReferences() { - if _, ok := expected[k]; ok { - delete(expected, k) - } + delete(expected, k) } if len(expected) == 0 { @@ -478,6 +482,7 @@ func (s *SpecValidator) validateReferencedParameters() *Result { return result } +// nolint: dupl func (s *SpecValidator) validateReferencedResponses() *Result { // Each referenceable definition should have references. responses := s.spec.Spec().Responses @@ -490,9 +495,7 @@ func (s *SpecValidator) validateReferencedResponses() *Result { expected["#/responses/"+jsonpointer.Escape(k)] = struct{}{} } for _, k := range s.analyzer.AllResponseReferences() { - if _, ok := expected[k]; ok { - delete(expected, k) - } + delete(expected, k) } if len(expected) == 0 { @@ -505,6 +508,7 @@ func (s *SpecValidator) validateReferencedResponses() *Result { return result } +// nolint: dupl func (s *SpecValidator) validateReferencedDefinitions() *Result { // Each referenceable definition must have references. defs := s.spec.Spec().Definitions @@ -517,9 +521,7 @@ func (s *SpecValidator) validateReferencedDefinitions() *Result { expected["#/definitions/"+jsonpointer.Escape(k)] = struct{}{} } for _, k := range s.analyzer.AllDefinitionReferences() { - if _, ok := expected[k]; ok { - delete(expected, k) - } + delete(expected, k) } if len(expected) == 0 { @@ -624,98 +626,114 @@ func (s *SpecValidator) validateParameters() *Result { rexGarbledPathSegment := mustCompileRegexp(`.*[{}\s]+.*`) for method, pi := range s.analyzer.Operations() { methodPaths := make(map[string]map[string]string) - if pi != nil { // Safeguard - for path, op := range pi { - pathToAdd := pathHelp.stripParametersInPath(path) + for path, op := range pi { + pathToAdd := pathHelp.stripParametersInPath(path) - // Warn on garbled path afer param stripping - if rexGarbledPathSegment.MatchString(pathToAdd) { - res.AddWarnings(pathStrippedParamGarbledMsg(pathToAdd)) - } + // Warn on garbled path afer param stripping + if rexGarbledPathSegment.MatchString(pathToAdd) { + res.AddWarnings(pathStrippedParamGarbledMsg(pathToAdd)) + } - // Check uniqueness of stripped paths - if _, found := methodPaths[method][pathToAdd]; found { + // 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)) - } + // Sort names for stable, testable output + if strings.Compare(path, methodPaths[method][pathToAdd]) < 0 { + res.AddErrors(pathOverlapMsg(path, methodPaths[method][pathToAdd])) } else { - if _, found := methodPaths[method]; !found { - methodPaths[method] = map[string]string{} - } - methodPaths[method][pathToAdd] = path //Original non stripped path - + 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)) + var bodyParams []string + var paramNames []string + var hasForm, hasBody bool - 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)) - } + // Check parameters names uniqueness for operation + // TODO: should be done after param expansion + res.Merge(s.checkUniqueParams(path, method, op)) - // 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 - } + 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)) + } - 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)) - } - } + // 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 == "formData" { - hasForm = 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)) } } - // In:formData and In:body are mutually exclusive - if hasBody && hasForm { - res.AddErrors(bothFormDataAndBodyMsg(op.ID)) + if pr.In == "formData" { + hasForm = true } - // 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)) + + 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)) } - // 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 - } - } + 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)) + } - // Warns about possible malformed params in path - rexGarbledParam := mustCompileRegexp(`{.*[{}\s]+.*}`) - for _, p := range paramsInPath { - if rexGarbledParam.MatchString(p) { - res.AddWarnings(pathParamGarbledMsg(path, p)) + // 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 } } + } - // Match params from path vs params from params section - res.Merge(s.validatePathParamPresence(path, paramsInPath, paramNames)) + // 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 diff --git a/vendor/github.com/go-openapi/validate/spec_messages.go b/vendor/github.com/go-openapi/validate/spec_messages.go index 441bb51975..1a5892aee4 100644 --- a/vendor/github.com/go-openapi/validate/spec_messages.go +++ b/vendor/github.com/go-openapi/validate/spec_messages.go @@ -163,6 +163,9 @@ const ( // PathParamGarbledWarning ... 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 = "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 { 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 //func invalidResponseDefinitionAsSchemaMsg(path, method string) errors.Error { diff --git a/vendor/github.com/go-openapi/validate/type.go b/vendor/github.com/go-openapi/validate/type.go index ba0e956d67..f55140d1e5 100644 --- a/vendor/github.com/go-openapi/validate/type.go +++ b/vendor/github.com/go-openapi/validate/type.go @@ -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. switch data.(type) { case []byte, strfmt.Base64, *strfmt.Base64: - return "string", "byte" + return stringType, stringFormatByte case strfmt.CreditCard, *strfmt.CreditCard: - return "string", "creditcard" + return stringType, stringFormatCreditCard case strfmt.Date, *strfmt.Date: - return "string", "date" + return stringType, stringFormatDate case strfmt.DateTime, *strfmt.DateTime: - return "string", "date-time" + return stringType, stringFormatDateTime case strfmt.Duration, *strfmt.Duration: - return "string", "duration" + return stringType, stringFormatDuration case runtime.File, *runtime.File: - return "file", "" + return fileType, "" case strfmt.Email, *strfmt.Email: - return "string", "email" + return stringType, stringFormatEmail case strfmt.HexColor, *strfmt.HexColor: - return "string", "hexcolor" + return stringType, stringFormatHexColor case strfmt.Hostname, *strfmt.Hostname: - return "string", "hostname" + return stringType, stringFormatHostname case strfmt.IPv4, *strfmt.IPv4: - return "string", "ipv4" + return stringType, stringFormatIPv4 case strfmt.IPv6, *strfmt.IPv6: - return "string", "ipv6" + return stringType, stringFormatIPv6 case strfmt.ISBN, *strfmt.ISBN: - return "string", "isbn" + return stringType, stringFormatISBN case strfmt.ISBN10, *strfmt.ISBN10: - return "string", "isbn10" + return stringType, stringFormatISBN10 case strfmt.ISBN13, *strfmt.ISBN13: - return "string", "isbn13" + return stringType, stringFormatISBN13 case strfmt.MAC, *strfmt.MAC: - return "string", "mac" + return stringType, stringFormatMAC case strfmt.ObjectId, *strfmt.ObjectId: - return "string", "bsonobjectid" + return stringType, stringFormatBSONObjectID case strfmt.Password, *strfmt.Password: - return "string", "password" + return stringType, stringFormatPassword case strfmt.RGBColor, *strfmt.RGBColor: - return "string", "rgbcolor" + return stringType, stringFormatRGBColor case strfmt.SSN, *strfmt.SSN: - return "string", "ssn" + return stringType, stringFormatSSN case strfmt.URI, *strfmt.URI: - return "string", "uri" + return stringType, stringFormatURI case strfmt.UUID, *strfmt.UUID: - return "string", "uuid" + return stringType, stringFormatUUID case strfmt.UUID3, *strfmt.UUID3: - return "string", "uuid3" + return stringType, stringFormatUUID3 case strfmt.UUID4, *strfmt.UUID4: - return "string", "uuid4" + return stringType, stringFormatUUID4 case strfmt.UUID5, *strfmt.UUID5: - return "string", "uuid5" + return stringType, stringFormatUUID5 // TODO: missing binary (io.ReadCloser) // TODO: missing json.Number default: @@ -93,25 +93,25 @@ func (t *typeValidator) schemaInfoForType(data interface{}) (string, string) { tpe := val.Type() switch tpe.Kind() { case reflect.Bool: - return "boolean", "" + return booleanType, "" case reflect.String: - return "string", "" + return stringType, "" 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? - return "integer", "int32" + return integerType, integerFormatInt32 case reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64: - return "integer", "int64" + return integerType, integerFormatInt64 case reflect.Float32: - // NOTE: is that not "float"? - return "number", "float32" + // NOTE: is that not numberFormatFloat? + return numberType, numberFormatFloat32 case reflect.Float64: // NOTE: is that not "double"? - return "number", "float64" + return numberType, numberFormatFloat64 // NOTE: go arrays (reflect.Array) are not supported (fixed length) case reflect.Slice: - return "array", "" + return arrayType, "" case reflect.Map, reflect.Struct: - return "object", "" + return objectType, "" case reflect.Interface: // What to do here? panic("dunno what to do here") @@ -139,8 +139,8 @@ func (t *typeValidator) Validate(data interface{}) *Result { result.Inc() if data == nil || reflect.DeepEqual(reflect.Zero(reflect.TypeOf(data)), reflect.ValueOf(data)) { // 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 - return errorHelp.sErr(errors.InvalidType(t.Path, t.In, strings.Join(t.Type, ","), "null")) + 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, ","), nullType)) } return result } @@ -157,17 +157,17 @@ func (t *typeValidator) Validate(data interface{}) *Result { // check numerical types // TODO: check unsigned ints // TODO: check json.Number (see schema.go) - isLowerInt := t.Format == "int64" && format == "int32" - isLowerFloat := t.Format == "float64" && format == "float32" - isFloatInt := schType == "number" && swag.IsFloat64AJSONInteger(val.Float()) && t.Type.Contains("integer") - isIntFloat := schType == "integer" && t.Type.Contains("number") + isLowerInt := t.Format == integerFormatInt64 && format == integerFormatInt32 + isLowerFloat := t.Format == numberFormatFloat64 && format == numberFormatFloat32 + isFloatInt := schType == numberType && swag.IsFloat64AJSONInteger(val.Float()) && t.Type.Contains(integerType) + 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) { // TODO: test case 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 } diff --git a/vendor/github.com/go-openapi/validate/validator.go b/vendor/github.com/go-openapi/validate/validator.go index df700d3cd4..2acb839db8 100644 --- a/vendor/github.com/go-openapi/validate/validator.go +++ b/vendor/github.com/go-openapi/validate/validator.go @@ -452,6 +452,7 @@ func (s *basicSliceValidator) Validate(data interface{}) *Result { return nil } +/* unused func (s *basicSliceValidator) hasDuplicates(value reflect.Value, size int) bool { dict := make(map[interface{}]struct{}) for i := 0; i < size; i++ { @@ -463,6 +464,7 @@ func (s *basicSliceValidator) hasDuplicates(value reflect.Value, size int) bool } return false } +*/ type numberValidator struct { 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? res.AddErrors(IsValueValidAgainstRange(val, n.Type, n.Format, "Checked", n.Path)) + // nolint: dupl if n.MultipleOf != nil { // 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)) @@ -546,6 +549,7 @@ func (n *numberValidator) Validate(val interface{}) *Result { } } + // nolint: dupl if n.Maximum != nil { // 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)) @@ -562,6 +566,7 @@ func (n *numberValidator) Validate(val interface{}) *Result { } } + // nolint: dupl if n.Minimum != nil { // 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)) @@ -611,7 +616,7 @@ func (s *stringValidator) Applies(source interface{}, kind reflect.Kind) bool { func (s *stringValidator) Validate(val interface{}) *Result { data, ok := val.(string) 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 == "") { diff --git a/vendor/github.com/go-openapi/validate/values.go b/vendor/github.com/go-openapi/validate/values.go index 24606da8d5..8dfe557e1a 100644 --- a/vendor/github.com/go-openapi/validate/values.go +++ b/vendor/github.com/go-openapi/validate/values.go @@ -17,6 +17,7 @@ package validate import ( "fmt" "reflect" + "strings" "unicode/utf8" "github.com/go-openapi/errors" @@ -26,11 +27,17 @@ import ( // Enum validates if the data is a member of the enum func Enum(path, in string, data interface{}, enum interface{}) *errors.Validation { + return EnumCase(path, in, data, enum, true) +} + +// EnumCase validates if the data is a member of the enum and may respect case-sensitivity for strings +func EnumCase(path, in string, data interface{}, enum interface{}, caseSensitive bool) *errors.Validation { val := reflect.ValueOf(enum) if val.Kind() != reflect.Slice { return nil } + dataString := convertEnumCaseStringKind(data, caseSensitive) var values []interface{} for i := 0; i < val.Len(); i++ { ele := val.Index(i) @@ -39,6 +46,10 @@ func Enum(path, in string, data interface{}, enum interface{}) *errors.Validatio if reflect.DeepEqual(data, enumValue) { return nil } + enumString := convertEnumCaseStringKind(enumValue, caseSensitive) + if dataString != nil && enumString != nil && strings.EqualFold(*dataString, *enumString) { + return nil + } actualType := reflect.TypeOf(enumValue) if actualType == nil { // Safeguard. Frankly, I don't know how we may get a nil continue @@ -56,10 +67,25 @@ func Enum(path, in string, data interface{}, enum interface{}) *errors.Validatio return errors.EnumFail(path, in, data, values) } +// convertEnumCaseStringKind converts interface if it is kind of string and case insensitivity is set +func convertEnumCaseStringKind(value interface{}, caseSensitive bool) *string { + if caseSensitive { + return nil + } + + val := reflect.ValueOf(value) + if val.Kind() != reflect.String { + return nil + } + + str := fmt.Sprintf("%v", value) + return &str +} + // MinItems validates that there are at least n items in a slice func MinItems(path, in string, size, min int64) *errors.Validation { if size < min { - return errors.TooFewItems(path, in, min) + return errors.TooFewItems(path, in, min, size) } return nil } @@ -67,7 +93,7 @@ func MinItems(path, in string, size, min int64) *errors.Validation { // MaxItems validates that there are at most n items in a slice func MaxItems(path, in string, size, max int64) *errors.Validation { if size > max { - return errors.TooManyItems(path, in, max) + return errors.TooManyItems(path, in, max, size) } return nil } @@ -95,7 +121,7 @@ func UniqueItems(path, in string, data interface{}) *errors.Validation { func MinLength(path, in, data string, minLength int64) *errors.Validation { strLen := int64(utf8.RuneCount([]byte(data))) if strLen < minLength { - return errors.TooShort(path, in, minLength) + return errors.TooShort(path, in, minLength, data) } return nil } @@ -104,7 +130,7 @@ func MinLength(path, in, data string, minLength int64) *errors.Validation { func MaxLength(path, in, data string, maxLength int64) *errors.Validation { strLen := int64(utf8.RuneCount([]byte(data))) if strLen > maxLength { - return errors.TooLong(path, in, maxLength) + return errors.TooLong(path, in, maxLength, data) } return nil } @@ -114,17 +140,17 @@ func Required(path, in string, data interface{}) *errors.Validation { val := reflect.ValueOf(data) if val.IsValid() { if reflect.DeepEqual(reflect.Zero(val.Type()).Interface(), val.Interface()) { - return errors.Required(path, in) + return errors.Required(path, in, data) } return nil } - return errors.Required(path, in) + return errors.Required(path, in, data) } // RequiredString validates a string for requiredness func RequiredString(path, in, data string) *errors.Validation { if data == "" { - return errors.Required(path, in) + return errors.Required(path, in, data) } return nil } @@ -132,7 +158,7 @@ func RequiredString(path, in, data string) *errors.Validation { // RequiredNumber validates a number for requiredness func RequiredNumber(path, in string, data float64) *errors.Validation { if data == 0 { - return errors.Required(path, in) + return errors.Required(path, in, data) } return nil } @@ -141,10 +167,10 @@ func RequiredNumber(path, in string, data float64) *errors.Validation { func Pattern(path, in, data, pattern string) *errors.Validation { re, err := compileRegexp(pattern) if err != nil { - return errors.FailedPattern(path, in, fmt.Sprintf("%s, but pattern is invalid: %s", pattern, err.Error())) + return errors.FailedPattern(path, in, fmt.Sprintf("%s, but pattern is invalid: %s", pattern, err.Error()), data) } if !re.MatchString(data) { - return errors.FailedPattern(path, in, pattern) + return errors.FailedPattern(path, in, pattern, data) } return nil } @@ -152,7 +178,7 @@ func Pattern(path, in, data, pattern string) *errors.Validation { // MaximumInt validates if a number is smaller than a given maximum func MaximumInt(path, in string, data, max int64, exclusive bool) *errors.Validation { if (!exclusive && data > max) || (exclusive && data >= max) { - return errors.ExceedsMaximumInt(path, in, max, exclusive) + return errors.ExceedsMaximumInt(path, in, max, exclusive, data) } return nil } @@ -160,7 +186,7 @@ func MaximumInt(path, in string, data, max int64, exclusive bool) *errors.Valida // MaximumUint validates if a number is smaller than a given maximum func MaximumUint(path, in string, data, max uint64, exclusive bool) *errors.Validation { if (!exclusive && data > max) || (exclusive && data >= max) { - return errors.ExceedsMaximumUint(path, in, max, exclusive) + return errors.ExceedsMaximumUint(path, in, max, exclusive, data) } return nil } @@ -168,7 +194,7 @@ func MaximumUint(path, in string, data, max uint64, exclusive bool) *errors.Vali // Maximum validates if a number is smaller than a given maximum func Maximum(path, in string, data, max float64, exclusive bool) *errors.Validation { if (!exclusive && data > max) || (exclusive && data >= max) { - return errors.ExceedsMaximum(path, in, max, exclusive) + return errors.ExceedsMaximum(path, in, max, exclusive, data) } return nil } @@ -176,7 +202,7 @@ func Maximum(path, in string, data, max float64, exclusive bool) *errors.Validat // Minimum validates if a number is smaller than a given minimum func Minimum(path, in string, data, min float64, exclusive bool) *errors.Validation { if (!exclusive && data < min) || (exclusive && data <= min) { - return errors.ExceedsMinimum(path, in, min, exclusive) + return errors.ExceedsMinimum(path, in, min, exclusive, data) } return nil } @@ -184,7 +210,7 @@ func Minimum(path, in string, data, min float64, exclusive bool) *errors.Validat // MinimumInt validates if a number is smaller than a given minimum func MinimumInt(path, in string, data, min int64, exclusive bool) *errors.Validation { if (!exclusive && data < min) || (exclusive && data <= min) { - return errors.ExceedsMinimumInt(path, in, min, exclusive) + return errors.ExceedsMinimumInt(path, in, min, exclusive, data) } return nil } @@ -192,7 +218,7 @@ func MinimumInt(path, in string, data, min int64, exclusive bool) *errors.Valida // MinimumUint validates if a number is smaller than a given minimum func MinimumUint(path, in string, data, min uint64, exclusive bool) *errors.Validation { if (!exclusive && data < min) || (exclusive && data <= min) { - return errors.ExceedsMinimumUint(path, in, min, exclusive) + return errors.ExceedsMinimumUint(path, in, min, exclusive, data) } return nil } @@ -210,7 +236,7 @@ func MultipleOf(path, in string, data, factor float64) *errors.Validation { mult = data / factor } if !swag.IsFloat64AJSONInteger(mult) { - return errors.NotMultipleOf(path, in, factor) + return errors.NotMultipleOf(path, in, factor, data) } return nil } @@ -223,7 +249,7 @@ func MultipleOfInt(path, in string, data int64, factor int64) *errors.Validation } mult := data / factor if mult*factor != data { - return errors.NotMultipleOf(path, in, factor) + return errors.NotMultipleOf(path, in, factor, data) } return nil } @@ -232,7 +258,7 @@ func MultipleOfInt(path, in string, data int64, factor int64) *errors.Validation func MultipleOfUint(path, in string, data, factor uint64) *errors.Validation { mult := data / factor if mult*factor != data { - return errors.NotMultipleOf(path, in, factor) + return errors.NotMultipleOf(path, in, factor, data) } return nil } @@ -270,7 +296,7 @@ func MaximumNativeType(path, in string, val interface{}, max float64, exclusive case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: value := valueHelp.asUint64(val) if max < 0 { - return errors.ExceedsMaximum(path, in, max, exclusive) + return errors.ExceedsMaximum(path, in, max, exclusive, val) } return MaximumUint(path, in, value, uint64(max), exclusive) case reflect.Float32, reflect.Float64: @@ -361,26 +387,26 @@ func IsValueValidAgainstRange(val interface{}, typeName, format, prefix, path st var errVal error switch typeName { - case "integer": + case integerType: switch format { - case "int32": + case integerFormatInt32: _, errVal = swag.ConvertInt32(stringRep) - case "uint32": + case integerFormatUInt32: _, errVal = swag.ConvertUint32(stringRep) - case "uint64": + case integerFormatUInt64: _, errVal = swag.ConvertUint64(stringRep) - case "int64": + case integerFormatInt64: fallthrough default: _, errVal = swag.ConvertInt64(stringRep) } - case "number": + case numberType: fallthrough default: switch format { - case "float", "float32": + case numberFormatFloat, numberFormatFloat32: _, errVal = swag.ConvertFloat32(stringRep) - case "double", "float64": + case numberFormatDouble, numberFormatFloat64: fallthrough default: // No check can be performed here since diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff.go index 9836b8b9f4..745d5ca4c9 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff.go @@ -2,11 +2,14 @@ package commands import ( "encoding/json" - "errors" + "fmt" + "io" "io/ioutil" "log" "os" + "errors" + "github.com/go-openapi/loads" "github.com/go-swagger/go-swagger/cmd/swagger/commands/diff" ) @@ -22,32 +25,46 @@ type DiffCommand struct { Format string `long:"format" short:"f" description:"When present, writes output as json" default:"txt" choice:"txt" choice:"json"` IgnoreFile string `long:"ignore" short:"i" description:"Exception file of diffs to ignore (copy output from json diff format)" default:"none specified"` Destination string `long:"dest" short:"d" description:"Output destination file or stdout" default:"stdout"` + Args struct { + OldSpec string `positional-arg-name:"{old spec}"` + NewSpec string `positional-arg-name:"{new spec}"` + } `required:"2" positional-args:"specs" description:"Input specs to be diff-ed"` } // Execute diffs the two specs provided -func (c *DiffCommand) Execute(args []string) error { - if len(args) != 2 { - msg := `missing arguments for diff command (use --help for more info)` - return errors.New(msg) +func (c *DiffCommand) Execute(_ []string) error { + if c.Args.OldSpec == "" || c.Args.NewSpec == "" { + return errors.New(`missing arguments for diff command (use --help for more info)`) } - log.Println("Run Config:") - log.Printf("Spec1: %s", args[0]) - log.Printf("Spec2: %s", args[1]) - log.Printf("ReportOnlyBreakingChanges (-c) :%v", c.OnlyBreakingChanges) - log.Printf("OutputFormat (-f) :%s", c.Format) - log.Printf("IgnoreFile (-i) :%s", c.IgnoreFile) - log.Printf("Diff Report Destination (-d) :%s", c.Destination) + c.printInfo() - diffs, err := getDiffs(args[0], args[1]) + var ( + output io.WriteCloser + err error + ) + if c.Destination != "" { + output, err = os.OpenFile(c.Destination, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0600) + if err != nil { + return fmt.Errorf("%s: %w", c.Destination, err) + } + defer func() { + _ = output.Close() + }() + } else { + output = os.Stdout + } + + diffs, err := c.getDiffs() if err != nil { return err } - ignores, err := readIgnores(c.IgnoreFile) + ignores, err := c.readIgnores() if err != nil { return err } + diffs = diffs.FilterIgnores(ignores) if len(ignores) > 0 { log.Printf("Diff Report Ignored Items from IgnoreFile") @@ -56,40 +73,44 @@ func (c *DiffCommand) Execute(args []string) error { } } - if c.Format == JSONFormat { - err = diffs.ReportAllDiffs(true) - if err != nil { - return err - } + var ( + input io.Reader + warn error + ) + if c.Format != JSONFormat && c.OnlyBreakingChanges { + input, err, warn = diffs.ReportCompatibility() } else { - if c.OnlyBreakingChanges { - err = diffs.ReportCompatibility() - } else { - err = diffs.ReportAllDiffs(false) - } + input, err, warn = diffs.ReportAllDiffs(c.Format == JSONFormat) } - return err + if err != nil { + return err + } + _, err = io.Copy(output, input) + if err != nil { + return err + } + return warn } -func readIgnores(ignoreFile string) (diff.SpecDifferences, error) { +func (c *DiffCommand) readIgnores() (diff.SpecDifferences, error) { + ignoreFile := c.IgnoreFile ignoreDiffs := diff.SpecDifferences{} - if ignoreFile == "none specified" { + if ignoreFile == "none specified" || ignoreFile == "" { return ignoreDiffs, nil } // Open our jsonFile jsonFile, err := os.Open(ignoreFile) - // if we os.Open returns an error then handle it if err != nil { - return nil, err + return nil, fmt.Errorf("%s: %w", ignoreFile, err) } - // defer the closing of our jsonFile so that we can parse it later on - defer jsonFile.Close() + defer func() { + _ = jsonFile.Close() + }() byteValue, err := ioutil.ReadAll(jsonFile) if err != nil { - return nil, err + return nil, fmt.Errorf("reading %s: %w", ignoreFile, err) } - // def err = json.Unmarshal(byteValue, &ignoreDiffs) if err != nil { return nil, err @@ -97,10 +118,10 @@ func readIgnores(ignoreFile string) (diff.SpecDifferences, error) { return ignoreDiffs, nil } -func getDiffs(oldSpecPath, newSpecPath string) (diff.SpecDifferences, error) { +func (c *DiffCommand) getDiffs() (diff.SpecDifferences, error) { + oldSpecPath, newSpecPath := c.Args.OldSpec, c.Args.NewSpec swaggerDoc1 := oldSpecPath specDoc1, err := loads.Spec(swaggerDoc1) - if err != nil { return nil, err } @@ -113,3 +134,13 @@ func getDiffs(oldSpecPath, newSpecPath string) (diff.SpecDifferences, error) { return diff.Compare(specDoc1.Spec(), specDoc2.Spec()) } + +func (c *DiffCommand) printInfo() { + log.Println("Run Config:") + log.Printf("Spec1: %s", c.Args.OldSpec) + log.Printf("Spec2: %s", c.Args.NewSpec) + log.Printf("ReportOnlyBreakingChanges (-c) :%v", c.OnlyBreakingChanges) + log.Printf("OutputFormat (-f) :%s", c.Format) + log.Printf("IgnoreFile (-i) :%s", c.IgnoreFile) + log.Printf("Diff Report Destination (-d) :%s", c.Destination) +} diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/array_diff.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/array_diff.go index a979cca7ba..6e2fef3bc6 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/array_diff.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/array_diff.go @@ -2,22 +2,29 @@ package diff // This is a simple DSL for diffing arrays -// FromArrayStruct utility struct to encompass diffing of string arrays -type FromArrayStruct struct { +// fromArrayStruct utility struct to encompass diffing of string arrays +type fromArrayStruct struct { from []string } -// FromStringArray starts a fluent diff expression -func FromStringArray(from []string) FromArrayStruct { - return FromArrayStruct{from} +// fromStringArray starts a fluent diff expression +func fromStringArray(from []string) fromArrayStruct { + return fromArrayStruct{from} } -// DiffsTo completes a fluent dff expression -func (f FromArrayStruct) DiffsTo(toArray []string) (added, deleted, common []string) { +// DiffsTo completes a fluent diff expression +func (f fromArrayStruct) DiffsTo(toArray []string) (added, deleted, common []string) { inFrom := 1 inTo := 2 - m := make(map[string]int) + if f.from == nil { + return toArray, []string{}, []string{} + } + + m := make(map[string]int, len(toArray)) + added = make([]string, 0, len(toArray)) + deleted = make([]string, 0, len(f.from)) + common = make([]string, 0, len(f.from)) for _, item := range f.from { m[item] = inFrom @@ -43,14 +50,14 @@ func (f FromArrayStruct) DiffsTo(toArray []string) (added, deleted, common []str return } -// FromMapStruct utility struct to encompass diffing of string arrays -type FromMapStruct struct { +// fromMapStruct utility struct to encompass diffing of string arrays +type fromMapStruct struct { srcMap map[string]interface{} } -// FromStringMap starts a comparison by declaring a source map -func FromStringMap(srcMap map[string]interface{}) FromMapStruct { - return FromMapStruct{srcMap} +// fromStringMap starts a comparison by declaring a source map +func fromStringMap(srcMap map[string]interface{}) fromMapStruct { + return fromMapStruct{srcMap} } // Pair stores a pair of items which share a key in two maps @@ -60,7 +67,7 @@ type Pair struct { } // DiffsTo - generates diffs for a comparison -func (f FromMapStruct) DiffsTo(destMap map[string]interface{}) (added, deleted, common map[string]interface{}) { +func (f fromMapStruct) DiffsTo(destMap map[string]interface{}) (added, deleted, common map[string]interface{}) { added = make(map[string]interface{}) deleted = make(map[string]interface{}) common = make(map[string]interface{}) diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/difftypes.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/difftypes.go index 34f7a31bc2..32225075fa 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/difftypes.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/difftypes.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "log" ) // SpecChangeCode enumerates the various types of diffs from one spec to another @@ -175,18 +176,18 @@ var toStringSpecChangeCode = map[SpecChangeCode]string{ var toIDSpecChangeCode = map[string]SpecChangeCode{} // Description returns an english version of this error -func (s *SpecChangeCode) Description() (result string) { - result, ok := toLongStringSpecChangeCode[*s] +func (s SpecChangeCode) Description() (result string) { + result, ok := toLongStringSpecChangeCode[s] if !ok { - fmt.Printf("WARNING: No description for %v", *s) + log.Printf("warning: No description for %v", s) result = "UNDEFINED" } return } // MarshalJSON marshals the enum as a quoted json string -func (s *SpecChangeCode) MarshalJSON() ([]byte, error) { - return stringAsQuotedBytes(toStringSpecChangeCode[*s]) +func (s SpecChangeCode) MarshalJSON() ([]byte, error) { + return stringAsQuotedBytes(toStringSpecChangeCode[s]) } // UnmarshalJSON unmashalls a quoted json string to the enum value @@ -228,8 +229,8 @@ var toStringCompatibility = map[Compatibility]string{ var toIDCompatibility = map[string]Compatibility{} // MarshalJSON marshals the enum as a quoted json string -func (s *Compatibility) MarshalJSON() ([]byte, error) { - return stringAsQuotedBytes(toStringCompatibility[*s]) +func (s Compatibility) MarshalJSON() ([]byte, error) { + return stringAsQuotedBytes(toStringCompatibility[s]) } // UnmarshalJSON unmashals a quoted json string to the enum value diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/reporting.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/reporting.go index cf7687bb55..020660f70c 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/reporting.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/reporting.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "io" "net/url" "strings" @@ -153,10 +154,10 @@ var numberWideness = map[string]int{ "integer.int32": 0, } -func prettyprint(b []byte) ([]byte, error) { +func prettyprint(b []byte) (io.ReadWriter, error) { var out bytes.Buffer err := json.Indent(&out, b, "", " ") - return out.Bytes(), err + return &out, err } // JSONMarshal allows the item to be correctly rendered to json diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_analyser.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_analyser.go index f35c9e3751..eb516f3c00 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_analyser.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_analyser.go @@ -59,7 +59,7 @@ func (sd *SpecAnalyser) Analyse(spec1, spec2 *spec.Swagger) error { func (sd *SpecAnalyser) analyseSpecMetadata(spec1, spec2 *spec.Swagger) { // breaking if it no longer consumes any formats - added, deleted, _ := FromStringArray(spec1.Consumes).DiffsTo(spec2.Consumes) + added, deleted, _ := fromStringArray(spec1.Consumes).DiffsTo(spec2.Consumes) node := getNameOnlyDiffNode("Spec") location := DifferenceLocation{Node: node} @@ -74,7 +74,7 @@ func (sd *SpecAnalyser) analyseSpecMetadata(spec1, spec2 *spec.Swagger) { } // // breaking if it no longer produces any formats - added, deleted, _ = FromStringArray(spec1.Produces).DiffsTo(spec2.Produces) + added, deleted, _ = fromStringArray(spec1.Produces).DiffsTo(spec2.Produces) producesLocation := location.AddNode(getNameOnlyDiffNode("produces")) for _, eachAdded := range added { sd.Diffs = sd.Diffs.addDiff(SpecDifference{DifferenceLocation: producesLocation, Code: AddedProducesFormat, Compatibility: NonBreaking, DiffInfo: eachAdded}) @@ -84,7 +84,7 @@ func (sd *SpecAnalyser) analyseSpecMetadata(spec1, spec2 *spec.Swagger) { } // // breaking if it no longer supports a scheme - added, deleted, _ = FromStringArray(spec1.Schemes).DiffsTo(spec2.Schemes) + added, deleted, _ = fromStringArray(spec1.Schemes).DiffsTo(spec2.Schemes) schemesLocation := location.AddNode(getNameOnlyDiffNode("schemes")) for _, eachAdded := range added { @@ -120,7 +120,7 @@ func (sd *SpecAnalyser) analyseEndpointData() { for URLMethod, op2 := range sd.urlMethods2 { if op1, ok := sd.urlMethods1[URLMethod]; ok { - addedTags, deletedTags, _ := FromStringArray(op1.Operation.Tags).DiffsTo(op2.Operation.Tags) + addedTags, deletedTags, _ := fromStringArray(op1.Operation.Tags).DiffsTo(op2.Operation.Tags) location := DifferenceLocation{URL: URLMethod.Path, Method: URLMethod.Method} for _, eachAddedTag := range addedTags { @@ -566,7 +566,7 @@ func (sd *SpecAnalyser) compareEnums(left, right []interface{}) []TypeDiff { for _, eachRight := range right { rightStrs = append(rightStrs, fmt.Sprintf("%v", eachRight)) } - added, deleted, _ := FromStringArray(leftStrs).DiffsTo(rightStrs) + added, deleted, _ := fromStringArray(leftStrs).DiffsTo(rightStrs) if len(added) > 0 { typeChange := strings.Join(added, ",") diffs = append(diffs, TypeDiff{Change: AddedEnumValue, Description: typeChange}) diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_difference.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_difference.go index ead620b36b..222ea89b01 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_difference.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/diff/spec_difference.go @@ -1,8 +1,10 @@ package diff import ( + "bytes" + "errors" "fmt" - "log" + "io" "sort" ) @@ -131,19 +133,23 @@ func (sd SpecDifferences) addDiff(diff SpecDifference) SpecDifferences { } // ReportCompatibility lists and spec -func (sd *SpecDifferences) ReportCompatibility() error { +func (sd *SpecDifferences) ReportCompatibility() (io.Reader, error, error) { + var out bytes.Buffer breakingCount := sd.BreakingChangeCount() if breakingCount > 0 { - fmt.Printf("\nBREAKING CHANGES:\n=================\n") - sd.reportChanges(Breaking) - return fmt.Errorf("compatibility Test FAILED: %d Breaking changes detected", breakingCount) + fmt.Fprintln(&out, "\nBREAKING CHANGES:\n=================") + _, _ = out.ReadFrom(sd.reportChanges(Breaking)) + msg := fmt.Sprintf("compatibility test FAILED: %d breaking changes detected", breakingCount) + fmt.Fprintln(&out, msg) + return &out, nil, errors.New(msg) } - log.Printf("Compatibility test OK. No breaking changes identified.") - return nil + fmt.Fprintf(&out, "compatibility test OK. No breaking changes identified.") + return &out, nil, nil } -func (sd SpecDifferences) reportChanges(compat Compatibility) { +func (sd SpecDifferences) reportChanges(compat Compatibility) io.Reader { toReportList := []string{} + var out bytes.Buffer for _, diff := range sd { if diff.Compatibility == compat { @@ -156,35 +162,36 @@ func (sd SpecDifferences) reportChanges(compat Compatibility) { }) for _, eachDiff := range toReportList { - fmt.Println(eachDiff) + fmt.Fprintln(&out, eachDiff) } + return &out } // ReportAllDiffs lists all the diffs between two specs -func (sd SpecDifferences) ReportAllDiffs(fmtJSON bool) error { +func (sd SpecDifferences) ReportAllDiffs(fmtJSON bool) (io.Reader, error, error) { if fmtJSON { - b, err := JSONMarshal(sd) if err != nil { - log.Fatalf("Couldn't print results: %v", err) - } - pretty, err := prettyprint(b) - if err != nil { - log.Fatalf("Couldn't print results: %v", err) + return nil, fmt.Errorf("couldn't print results: %v", err), nil } - fmt.Println(string(pretty)) - return nil + out, err := prettyprint(b) + return out, err, nil } numDiffs := len(sd) if numDiffs == 0 { - fmt.Println("No changes identified") - return nil + return bytes.NewBuffer([]byte("No changes identified")), nil, nil } + var out bytes.Buffer if numDiffs != sd.BreakingChangeCount() { - fmt.Println("NON-BREAKING CHANGES:\n=====================") - sd.reportChanges(NonBreaking) + fmt.Fprintln(&out, "NON-BREAKING CHANGES:\n=====================") + _, _ = out.ReadFrom(sd.reportChanges(NonBreaking)) } - return sd.ReportCompatibility() + more, err, warn := sd.ReportCompatibility() + if err != nil { + return nil, err, warn + } + _, _ = out.ReadFrom(more) + return &out, nil, warn } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/expand.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/expand.go index 0cffa0275c..202d83f5a1 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/expand.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/expand.go @@ -69,5 +69,5 @@ func writeToFile(swspec *spec.Swagger, pretty bool, format string, output string fmt.Println(string(b)) return nil } - return ioutil.WriteFile(output, b, 0644) + return ioutil.WriteFile(output, b, 0644) // #nosec } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/client.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/client.go index d025c673ba..d46c0ab64d 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/client.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/client.go @@ -20,56 +20,51 @@ import ( "github.com/go-swagger/go-swagger/generator" ) +type clientOptions struct { + ClientPackage string `long:"client-package" short:"c" description:"the package to save the client specific code" default:"client"` +} + +func (co clientOptions) apply(opts *generator.GenOpts) { + opts.ClientPackage = co.ClientPackage +} + // Client the command to generate a swagger client type Client struct { - shared - Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` - Operations []string `long:"operation" short:"O" description:"specify an operation to include, repeat for multiple"` - Tags []string `long:"tags" description:"the tags to include, if not specified defaults to all"` - Principal string `long:"principal" short:"P" description:"the model to use for the security principal"` - Models []string `long:"model" short:"M" description:"specify a model to include, repeat for multiple"` - DefaultScheme string `long:"default-scheme" description:"the default scheme for this client" default:"http"` - DefaultProduces string `long:"default-produces" description:"the default mime type that API operations produce" default:"application/json"` - SkipModels bool `long:"skip-models" description:"no models will be generated when this flag is specified"` - SkipOperations bool `long:"skip-operations" description:"no operations will be generated when this flag is specified"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation"` -} + WithShared + WithModels + WithOperations -func (c *Client) getOpts() (*generator.GenOpts, error) { - return &generator.GenOpts{ - Spec: string(c.Spec), - - Target: string(c.Target), - APIPackage: c.APIPackage, - ModelPackage: c.ModelPackage, - ServerPackage: c.ServerPackage, - ClientPackage: c.ClientPackage, - Principal: c.Principal, - DefaultScheme: c.DefaultScheme, - DefaultProduces: c.DefaultProduces, - IncludeModel: !c.SkipModels, - IncludeValidator: !c.SkipModels, - IncludeHandler: !c.SkipOperations, - IncludeParameters: !c.SkipOperations, - IncludeResponses: !c.SkipOperations, - ValidateSpec: !c.SkipValidation, - Tags: c.Tags, - IncludeSupport: true, - Template: c.Template, - TemplateDir: string(c.TemplateDir), - DumpData: c.DumpData, - ExistingModels: c.ExistingModels, - IsClient: true, - }, nil + clientOptions + schemeOptions + mediaOptions + + SkipModels bool `long:"skip-models" description:"no models will be generated when this flag is specified"` + SkipOperations bool `long:"skip-operations" description:"no operations will be generated when this flag is specified"` + + Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` } -func (c *Client) getShared() *shared { - return &c.shared +func (c Client) apply(opts *generator.GenOpts) { + c.Shared.apply(opts) + c.Models.apply(opts) + c.Operations.apply(opts) + c.clientOptions.apply(opts) + c.schemeOptions.apply(opts) + c.mediaOptions.apply(opts) + + opts.IncludeModel = !c.SkipModels + opts.IncludeValidator = !c.SkipModels + opts.IncludeHandler = !c.SkipOperations + opts.IncludeParameters = !c.SkipOperations + opts.IncludeResponses = !c.SkipOperations + opts.Name = c.Name + + opts.IsClient = true + opts.IncludeSupport = true } func (c *Client) generate(opts *generator.GenOpts) error { - return generator.GenerateClient(c.Name, c.Models, c.Operations, opts) + return generator.GenerateClient(c.Name, c.Models.Models, c.Operations.Operations, opts) } func (c *Client) log(rp string) { diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/contrib.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/contrib.go index accec044e4..196558e70d 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/contrib.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/contrib.go @@ -6,6 +6,7 @@ import ( // contribOptionsOverride gives contributed templates the ability to override the options if they need func contribOptionsOverride(opts *generator.GenOpts) { + // nolint: gocritic switch opts.Template { case "stratoscale": // Stratoscale template needs to regenerate the configureapi on every run. diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/model.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/model.go index 2e14d43ae2..7cbc8559ab 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/model.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/model.go @@ -17,37 +17,83 @@ package generate import ( "errors" "log" + + "github.com/go-swagger/go-swagger/generator" ) -// Model the generate model file command +type modelOptions struct { + ModelPackage string `long:"model-package" short:"m" description:"the package to save the models" default:"models"` + Models []string `long:"model" short:"M" description:"specify a model to include in generation, repeat for multiple (defaults to all)"` + ExistingModels string `long:"existing-models" description:"use pre-generated models e.g. github.com/foobar/model"` + StrictAdditionalProperties bool `long:"strict-additional-properties" description:"disallow extra properties when additionalProperties is set to false"` + KeepSpecOrder bool `long:"keep-spec-order" description:"keep schema properties order identical to spec file"` + AllDefinitions bool `long:"all-definitions" description:"generate all model definitions regardless of usage in operations" hidden:"deprecated"` + StructTags []string `long:"struct-tags" description:"the struct tags to generate, repeat for multiple (defaults to json)"` +} + +func (mo modelOptions) apply(opts *generator.GenOpts) { + opts.ModelPackage = mo.ModelPackage + opts.Models = mo.Models + opts.ExistingModels = mo.ExistingModels + opts.StrictAdditionalProperties = mo.StrictAdditionalProperties + opts.PropertiesSpecOrder = mo.KeepSpecOrder + opts.IgnoreOperations = mo.AllDefinitions + opts.StructTags = mo.StructTags +} + +// WithModels adds the model options group. +// +// This group is available to all commands that need some model generation. +type WithModels struct { + Models modelOptions `group:"Options for model generation"` +} + +// Model the generate model file command. +// +// Define the options that are specific to the "swagger generate model" command. type Model struct { - shared - Name []string `long:"name" short:"n" description:"the model to generate"` - NoStruct bool `long:"skip-struct" description:"when present will not generate the model struct"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation"` + WithShared + WithModels + + NoStruct bool `long:"skip-struct" description:"when present will not generate the model struct" hidden:"deprecated"` + Name []string `long:"name" short:"n" description:"the model to generate, repeat for multiple (defaults to all). Same as --models"` + AcceptDefinitionsOnly bool `long:"accept-definitions-only" description:"accepts a partial swagger spec wih only the definitions key"` +} + +func (m Model) apply(opts *generator.GenOpts) { + m.Shared.apply(opts) + m.Models.apply(opts) + + opts.IncludeModel = !m.NoStruct + opts.IncludeValidator = !m.NoStruct + opts.AcceptDefinitionsOnly = m.AcceptDefinitionsOnly +} + +func (m Model) log(rp string) { + log.Printf(`Generation completed! + +For this generation to compile you need to have some packages in your GOPATH: + + * github.com/go-openapi/validate + * github.com/go-openapi/strfmt + +You can get these now with: go get -u -f %s/... +`, rp) +} + +func (m *Model) generate(opts *generator.GenOpts) error { + return generator.GenerateModels(append(m.Name, m.Models.Models...), opts) } // Execute generates a model file func (m *Model) Execute(args []string) error { - if m.DumpData && len(m.Name) > 1 { + if m.Shared.DumpData && len(append(m.Name, m.Models.Models...)) > 1 { return errors.New("only 1 model at a time is supported for dumping data") } - if m.ExistingModels != "" { + if m.Models.ExistingModels != "" { log.Println("warning: Ignoring existing-models flag when generating models.") } - s := &Server{ - shared: m.shared, - Models: m.Name, - DumpData: m.DumpData, - ExcludeMain: true, - ExcludeSpec: true, - SkipSupport: true, - SkipOperations: true, - SkipModels: m.NoStruct, - SkipValidation: m.SkipValidation, - } - return s.Execute(args) + return createSwagger(m) } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/operation.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/operation.go index dc1f2c2560..8d7c429cf1 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/operation.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/operation.go @@ -21,51 +21,69 @@ import ( "github.com/go-swagger/go-swagger/generator" ) +type operationOptions struct { + Operations []string `long:"operation" short:"O" description:"specify an operation to include, repeat for multiple (defaults to all)"` + Tags []string `long:"tags" description:"the tags to include, if not specified defaults to all" group:"operations"` + APIPackage string `long:"api-package" short:"a" description:"the package to save the operations" default:"operations"` + WithEnumCI bool `long:"with-enum-ci" description:"allow case-insensitive enumerations"` + + // tags handling + SkipTagPackages bool `long:"skip-tag-packages" description:"skips the generation of tag-based operation packages, resulting in a flat generation"` +} + +func (oo operationOptions) apply(opts *generator.GenOpts) { + opts.Operations = oo.Operations + opts.Tags = oo.Tags + opts.APIPackage = oo.APIPackage + opts.AllowEnumCI = oo.WithEnumCI + opts.SkipTagPackages = oo.SkipTagPackages +} + +// WithOperations adds the operations options group +type WithOperations struct { + Operations operationOptions `group:"Options for operation generation"` +} + // Operation the generate operation files command type Operation struct { - shared - Name []string `long:"name" short:"n" required:"true" description:"the operations to generate, repeat for multiple"` - Tags []string `long:"tags" description:"the tags to include, if not specified defaults to all"` - Principal string `short:"P" long:"principal" description:"the model to use for the security principal"` - DefaultScheme string `long:"default-scheme" description:"the default scheme for this API" default:"http"` - NoHandler bool `long:"skip-handler" description:"when present will not generate an operation handler"` - NoStruct bool `long:"skip-parameters" description:"when present will not generate the parameter model struct"` - NoResponses bool `long:"skip-responses" description:"when present will not generate the response model struct"` - NoURLBuilder bool `long:"skip-url-builder" description:"when present will not generate a URL builder"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation"` -} + WithShared + WithOperations + + clientOptions + serverOptions + schemeOptions + mediaOptions -func (o *Operation) getOpts() (*generator.GenOpts, error) { - return &generator.GenOpts{ - Spec: string(o.Spec), - Target: string(o.Target), - APIPackage: o.APIPackage, - ModelPackage: o.ModelPackage, - ServerPackage: o.ServerPackage, - ClientPackage: o.ClientPackage, - Principal: o.Principal, - DumpData: o.DumpData, - DefaultScheme: o.DefaultScheme, - TemplateDir: string(o.TemplateDir), - IncludeHandler: !o.NoHandler, - IncludeResponses: !o.NoResponses, - IncludeParameters: !o.NoStruct, - IncludeURLBuilder: !o.NoURLBuilder, - Tags: o.Tags, - ValidateSpec: !o.SkipValidation, - }, nil + ModelPackage string `long:"model-package" short:"m" description:"the package to save the models" default:"models"` + + NoHandler bool `long:"skip-handler" description:"when present will not generate an operation handler"` + NoStruct bool `long:"skip-parameters" description:"when present will not generate the parameter model struct"` + NoResponses bool `long:"skip-responses" description:"when present will not generate the response model struct"` + NoURLBuilder bool `long:"skip-url-builder" description:"when present will not generate a URL builder"` + + Name []string `long:"name" short:"n" description:"the operations to generate, repeat for multiple (defaults to all). Same as --operations"` } -func (o *Operation) getShared() *shared { - return &o.shared +func (o Operation) apply(opts *generator.GenOpts) { + o.Shared.apply(opts) + o.Operations.apply(opts) + o.clientOptions.apply(opts) + o.serverOptions.apply(opts) + o.schemeOptions.apply(opts) + o.mediaOptions.apply(opts) + + opts.ModelPackage = o.ModelPackage + opts.IncludeHandler = !o.NoHandler + opts.IncludeResponses = !o.NoResponses + opts.IncludeParameters = !o.NoStruct + opts.IncludeURLBuilder = !o.NoURLBuilder } func (o *Operation) generate(opts *generator.GenOpts) error { - return generator.GenerateServerOperation(o.Name, opts) + return generator.GenerateServerOperation(append(o.Name, o.Operations.Operations...), opts) } -func (o *Operation) log(rp string) { +func (o Operation) log(rp string) { log.Printf(`Generation completed! @@ -79,7 +97,7 @@ You can get these now with: go get -u -f %s/... // Execute generates a model file func (o *Operation) Execute(args []string) error { - if o.DumpData && len(o.Name) > 1 { + if o.Shared.DumpData && len(append(o.Name, o.Operations.Operations...)) > 1 { return errors.New("only 1 operation at a time is supported for dumping data") } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/server.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/server.go index a8c4e5a0bd..e506a013c2 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/server.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/server.go @@ -21,87 +21,81 @@ import ( "github.com/go-swagger/go-swagger/generator" ) +type serverOptions struct { + ServerPackage string `long:"server-package" short:"s" description:"the package to save the server specific code" default:"restapi"` + MainTarget string `long:"main-package" short:"" description:"the location of the generated main. Defaults to cmd/{name}-server" default:""` +} + +func (cs serverOptions) apply(opts *generator.GenOpts) { + opts.ServerPackage = cs.ServerPackage +} + // Server the command to generate an entire server application type Server struct { - shared - Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` - Operations []string `long:"operation" short:"O" description:"specify an operation to include, repeat for multiple"` - Tags []string `long:"tags" description:"the tags to include, if not specified defaults to all"` - Principal string `long:"principal" short:"P" description:"the model to use for the security principal"` - DefaultScheme string `long:"default-scheme" description:"the default scheme for this API" default:"http"` - Models []string `long:"model" short:"M" description:"specify a model to include, repeat for multiple"` - SkipModels bool `long:"skip-models" description:"no models will be generated when this flag is specified"` - SkipOperations bool `long:"skip-operations" description:"no operations will be generated when this flag is specified"` - SkipSupport bool `long:"skip-support" description:"no supporting files will be generated when this flag is specified"` - ExcludeMain bool `long:"exclude-main" description:"exclude main function, so just generate the library"` - ExcludeSpec bool `long:"exclude-spec" description:"don't embed the swagger specification"` - WithContext bool `long:"with-context" description:"handlers get a context as first arg (deprecated)"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - FlagStrategy string `long:"flag-strategy" description:"the strategy to provide flags for the server" default:"go-flags" choice:"go-flags" choice:"pflag" choice:"flag"` - CompatibilityMode string `long:"compatibility-mode" description:"the compatibility mode for the tls server" default:"modern" choice:"modern" choice:"intermediate"` - SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation"` - RegenerateConfigureAPI bool `long:"regenerate-configureapi" description:"Force regeneration of configureapi.go"` - KeepSpecOrder bool `long:"keep-spec-order" description:"Keep schema properties order identical to spec file"` - StrictAdditionalProperties bool `long:"strict-additional-properties" description:"disallow extra properties when additionalProperties is set to false"` + WithShared + WithModels + WithOperations + + serverOptions + schemeOptions + mediaOptions + + SkipModels bool `long:"skip-models" description:"no models will be generated when this flag is specified"` + SkipOperations bool `long:"skip-operations" description:"no operations will be generated when this flag is specified"` + SkipSupport bool `long:"skip-support" description:"no supporting files will be generated when this flag is specified"` + ExcludeMain bool `long:"exclude-main" description:"exclude main function, so just generate the library"` + ExcludeSpec bool `long:"exclude-spec" description:"don't embed the swagger specification"` + FlagStrategy string `long:"flag-strategy" description:"the strategy to provide flags for the server" default:"go-flags" choice:"go-flags" choice:"pflag" choice:"flag"` // nolint: staticcheck + CompatibilityMode string `long:"compatibility-mode" description:"the compatibility mode for the tls server" default:"modern" choice:"modern" choice:"intermediate"` // nolint: staticcheck + RegenerateConfigureAPI bool `long:"regenerate-configureapi" description:"Force regeneration of configureapi.go"` + + Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` + // TODO(fredbi): CmdName string `long:"cmd-name" short:"A" description:"the name of the server command, when main is generated (defaults to {name}-server)"` + + //deprecated flags + WithContext bool `long:"with-context" description:"handlers get a context as first arg (deprecated)"` } -func (s *Server) getOpts() (*generator.GenOpts, error) { - // warning: deprecation +func (s Server) apply(opts *generator.GenOpts) { if s.WithContext { log.Printf("warning: deprecated option --with-context is ignored") } - return &generator.GenOpts{ - Spec: string(s.Spec), - Target: string(s.Target), - APIPackage: s.APIPackage, - ModelPackage: s.ModelPackage, - ServerPackage: s.ServerPackage, - ClientPackage: s.ClientPackage, - Principal: s.Principal, - DefaultScheme: s.DefaultScheme, - IncludeModel: !s.SkipModels, - IncludeValidator: !s.SkipModels, - IncludeHandler: !s.SkipOperations, - IncludeParameters: !s.SkipOperations, - IncludeResponses: !s.SkipOperations, - IncludeURLBuilder: !s.SkipOperations, - IncludeMain: !s.ExcludeMain, - IncludeSupport: !s.SkipSupport, - PropertiesSpecOrder: s.KeepSpecOrder, - ValidateSpec: !s.SkipValidation, - ExcludeSpec: s.ExcludeSpec, - StrictAdditionalProperties: s.StrictAdditionalProperties, - Template: s.Template, - RegenerateConfigureAPI: s.RegenerateConfigureAPI, - TemplateDir: string(s.TemplateDir), - DumpData: s.DumpData, - Models: s.Models, - Operations: s.Operations, - Tags: s.Tags, - Name: s.Name, - FlagStrategy: s.FlagStrategy, - CompatibilityMode: s.CompatibilityMode, - ExistingModels: s.ExistingModels, - AllowTemplateOverride: s.AllowTemplateOverride, - }, nil -} + s.Shared.apply(opts) + s.Models.apply(opts) + s.Operations.apply(opts) + s.serverOptions.apply(opts) + s.schemeOptions.apply(opts) + s.mediaOptions.apply(opts) + + opts.IncludeModel = !s.SkipModels + opts.IncludeValidator = !s.SkipModels + opts.IncludeHandler = !s.SkipOperations + opts.IncludeParameters = !s.SkipOperations + opts.IncludeResponses = !s.SkipOperations + opts.IncludeURLBuilder = !s.SkipOperations + opts.IncludeSupport = !s.SkipSupport + opts.IncludeMain = !s.ExcludeMain + opts.FlagStrategy = s.FlagStrategy + opts.CompatibilityMode = s.CompatibilityMode + opts.RegenerateConfigureAPI = s.RegenerateConfigureAPI -func (s *Server) getShared() *shared { - return &s.shared + opts.Name = s.Name + opts.MainPackage = s.MainTarget } func (s *Server) generate(opts *generator.GenOpts) error { - return generator.GenerateServer(s.Name, s.Models, s.Operations, opts) + return generator.GenerateServer(s.Name, s.Models.Models, s.Operations.Operations, opts) } -func (s *Server) log(rp string) { +func (s Server) log(rp string) { var flagsPackage string - if strings.HasPrefix(s.FlagStrategy, "pflag") { + switch { + case strings.HasPrefix(s.FlagStrategy, "pflag"): flagsPackage = "github.com/spf13/pflag" - } else if strings.HasPrefix(s.FlagStrategy, "flag") { + case strings.HasPrefix(s.FlagStrategy, "flag"): flagsPackage = "flag" - } else { + default: flagsPackage = "github.com/jessevdk/go-flags" } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/shared.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/shared.go index 90bd351368..6e233e928f 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/shared.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/shared.go @@ -1,10 +1,12 @@ package generate import ( + "fmt" "io/ioutil" "log" "os" "path/filepath" + "strings" "github.com/go-openapi/analysis" "github.com/go-openapi/swag" @@ -15,8 +17,8 @@ import ( // FlattenCmdOptions determines options to the flatten spec preprocessing type FlattenCmdOptions struct { - WithExpand bool `long:"with-expand" description:"expands all $ref's in spec prior to generation (shorthand to --with-flatten=expand)"` - WithFlatten []string `long:"with-flatten" description:"flattens all $ref's in spec prior to generation" choice:"minimal" choice:"full" choice:"expand" choice:"verbose" choice:"noverbose" choice:"remove-unused" default:"minimal" default:"verbose"` + WithExpand bool `long:"with-expand" description:"expands all $ref's in spec prior to generation (shorthand to --with-flatten=expand)" group:"shared"` + WithFlatten []string `long:"with-flatten" description:"flattens all $ref's in spec prior to generation" choice:"minimal" choice:"full" choice:"expand" choice:"verbose" choice:"noverbose" choice:"remove-unused" default:"minimal" default:"verbose" group:"shared"` // nolint: staticcheck } // SetFlattenOptions builds flatten options from command line args @@ -30,138 +32,159 @@ func (f *FlattenCmdOptions) SetFlattenOptions(dflt *analysis.FlattenOpts) (res * } verboseIsSet := false minimalIsSet := false - //removeUnusedIsSet := false expandIsSet := false if f.WithExpand { res.Expand = true expandIsSet = true } for _, opt := range f.WithFlatten { - if opt == "verbose" { + switch opt { + case "verbose": res.Verbose = true verboseIsSet = true - } - if opt == "noverbose" && !verboseIsSet { - // verbose flag takes precedence - res.Verbose = false - verboseIsSet = true - } - if opt == "remove-unused" { + case "noverbose": + if !verboseIsSet { + // verbose flag takes precedence + res.Verbose = false + verboseIsSet = true + } + case "remove-unused": res.RemoveUnused = true - //removeUnusedIsSet = true - } - if opt == "expand" { + case "expand": res.Expand = true expandIsSet = true - } - if opt == "full" && !minimalIsSet && !expandIsSet { - // minimal flag takes precedence - res.Minimal = false - minimalIsSet = true - } - if opt == "minimal" && !expandIsSet { - // expand flag takes precedence - res.Minimal = true - minimalIsSet = true + case "full": + if !minimalIsSet && !expandIsSet { + // minimal flag takes precedence + res.Minimal = false + minimalIsSet = true + } + case "minimal": + if !expandIsSet { + // expand flag takes precedence + res.Minimal = true + minimalIsSet = true + } } } return } -type shared struct { - Spec flags.Filename `long:"spec" short:"f" description:"the spec file to use (default swagger.{json,yml,yaml})"` - APIPackage string `long:"api-package" short:"a" description:"the package to save the operations" default:"operations"` - ModelPackage string `long:"model-package" short:"m" description:"the package to save the models" default:"models"` - ServerPackage string `long:"server-package" short:"s" description:"the package to save the server specific code" default:"restapi"` - ClientPackage string `long:"client-package" short:"c" description:"the package to save the client specific code" default:"client"` - Target flags.Filename `long:"target" short:"t" default:"./" description:"the base directory for generating the files"` - Template string `long:"template" description:"Load contributed templates" choice:"stratoscale"` - TemplateDir flags.Filename `long:"template-dir" short:"T" description:"alternative template override directory"` - ConfigFile flags.Filename `long:"config-file" short:"C" description:"configuration file to use for overriding template options"` - CopyrightFile flags.Filename `long:"copyright-file" short:"r" description:"copyright file used to add copyright header"` - ExistingModels string `long:"existing-models" description:"use pre-generated models e.g. github.com/foobar/model"` - AdditionalInitialisms []string `long:"additional-initialism" description:"consecutive capitals that should be considered intialisms"` - AllowTemplateOverride bool `long:"allow-template-override" description:"allows overriding protected templates"` - FlattenCmdOptions -} - type sharedCommand interface { - getOpts() (*generator.GenOpts, error) - getShared() *shared - getConfigFile() flags.Filename - getAdditionalInitialisms() []string + apply(*generator.GenOpts) + getConfigFile() string generate(*generator.GenOpts) error log(string) } -func (s *shared) getConfigFile() flags.Filename { - return s.ConfigFile +type schemeOptions struct { + Principal string `short:"P" long:"principal" description:"the model to use for the security principal"` + DefaultScheme string `long:"default-scheme" description:"the default scheme for this API" default:"http"` } -func (s *shared) getAdditionalInitialisms() []string { - return s.AdditionalInitialisms +func (so schemeOptions) apply(opts *generator.GenOpts) { + opts.Principal = so.Principal + opts.DefaultScheme = so.DefaultScheme } -func (s *shared) setCopyright() (string, error) { - var copyrightstr string - copyrightfile := string(s.CopyrightFile) - if copyrightfile != "" { - //Read the Copyright from file path in opts - bytebuffer, err := ioutil.ReadFile(copyrightfile) - if err != nil { - return "", err - } - copyrightstr = string(bytebuffer) - } else { - copyrightstr = "" +type mediaOptions struct { + DefaultProduces string `long:"default-produces" description:"the default mime type that API operations produce" default:"application/json"` + DefaultConsumes string `long:"default-consumes" description:"the default mime type that API operations consume" default:"application/json"` +} + +func (m mediaOptions) apply(opts *generator.GenOpts) { + opts.DefaultProduces = m.DefaultProduces + opts.DefaultConsumes = m.DefaultConsumes + + const xmlIdentifier = "xml" + opts.WithXML = strings.Contains(opts.DefaultProduces, xmlIdentifier) || strings.Contains(opts.DefaultConsumes, xmlIdentifier) +} + +// WithShared adds the shared options group +type WithShared struct { + Shared sharedOptions `group:"Options common to all code generation commands"` +} + +func (w WithShared) getConfigFile() string { + return string(w.Shared.ConfigFile) +} + +type sharedOptions struct { + Spec flags.Filename `long:"spec" short:"f" description:"the spec file to use (default swagger.{json,yml,yaml})" group:"shared"` + Target flags.Filename `long:"target" short:"t" default:"./" description:"the base directory for generating the files" group:"shared"` + Template string `long:"template" description:"load contributed templates" choice:"stratoscale" group:"shared"` + TemplateDir flags.Filename `long:"template-dir" short:"T" description:"alternative template override directory" group:"shared"` + ConfigFile flags.Filename `long:"config-file" short:"C" description:"configuration file to use for overriding template options" group:"shared"` + CopyrightFile flags.Filename `long:"copyright-file" short:"r" description:"copyright file used to add copyright header" group:"shared"` + AdditionalInitialisms []string `long:"additional-initialism" description:"consecutive capitals that should be considered intialisms" group:"shared"` + AllowTemplateOverride bool `long:"allow-template-override" description:"allows overriding protected templates" group:"shared"` + SkipValidation bool `long:"skip-validation" description:"skips validation of spec prior to generation" group:"shared"` + DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files" group:"shared"` + StrictResponders bool `long:"strict-responders" description:"Use strict type for the handler return value"` + FlattenCmdOptions +} + +func (s sharedOptions) apply(opts *generator.GenOpts) { + opts.Spec = string(s.Spec) + opts.Target = string(s.Target) + opts.Template = s.Template + opts.TemplateDir = string(s.TemplateDir) + opts.AllowTemplateOverride = s.AllowTemplateOverride + opts.ValidateSpec = !s.SkipValidation + opts.DumpData = s.DumpData + opts.FlattenOpts = s.FlattenCmdOptions.SetFlattenOptions(opts.FlattenOpts) + opts.Copyright = string(s.CopyrightFile) + opts.StrictResponders = s.StrictResponders + + swag.AddInitialisms(s.AdditionalInitialisms...) +} + +func setCopyright(copyrightFile string) (string, error) { + // read the Copyright from file path in opts + if copyrightFile == "" { + return "", nil } - return copyrightstr, nil + bytebuffer, err := ioutil.ReadFile(copyrightFile) + if err != nil { + return "", err + } + return string(bytebuffer), nil } func createSwagger(s sharedCommand) error { - cfg, erc := readConfig(string(s.getConfigFile())) - if erc != nil { - return erc + cfg, err := readConfig(s.getConfigFile()) + if err != nil { + return err } - setDebug(cfg) + setDebug(cfg) // viper config Debug - opts, ero := s.getOpts() - if ero != nil { - return ero + opts := new(generator.GenOpts) + s.apply(opts) + + opts.Copyright, err = setCopyright(opts.Copyright) + if err != nil { + return fmt.Errorf("could not load copyright file: %v", err) } if opts.Template != "" { contribOptionsOverride(opts) } - if err := opts.EnsureDefaults(); err != nil { + if err = opts.EnsureDefaults(); err != nil { return err } - if err := configureOptsFromConfig(cfg, opts); err != nil { + if err = configureOptsFromConfig(cfg, opts); err != nil { return err } - swag.AddInitialisms(s.getAdditionalInitialisms()...) - - if sharedOpts := s.getShared(); sharedOpts != nil { - // process shared options - opts.FlattenOpts = sharedOpts.FlattenCmdOptions.SetFlattenOptions(opts.FlattenOpts) - - copyrightStr, erc := sharedOpts.setCopyright() - if erc != nil { - return erc - } - opts.Copyright = copyrightStr - } - - if err := s.generate(opts); err != nil { + if err = s.generate(opts); err != nil { return err } - basepath, era := filepath.Abs(".") - if era != nil { - return era + basepath, err := filepath.Abs(".") + if err != nil { + return err } targetAbs, err := filepath.Abs(opts.Target) @@ -204,11 +227,12 @@ func configureOptsFromConfig(cfg *viper.Viper, opts *generator.GenOpts) error { } func setDebug(cfg *viper.Viper) { + // viper config debug if os.Getenv("DEBUG") != "" || os.Getenv("SWAGGER_DEBUG") != "" { if cfg != nil { cfg.Debug() } else { - log.Println("NO config read") + log.Println("No config read") } } } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/spec_go111.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/spec_go111.go index b7780b70a0..72162ba26c 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/spec_go111.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/spec_go111.go @@ -94,7 +94,7 @@ func writeToFile(swspec *spec.Swagger, pretty bool, output string) error { fmt.Println(string(b)) return nil } - return ioutil.WriteFile(output, b, 0644) + return ioutil.WriteFile(output, b, 0644) // #nosec } func marshalToJSONFormat(swspec *spec.Swagger, pretty bool) ([]byte, error) { diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/support.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/support.go index fc32d72521..ad790afdbc 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/support.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/generate/support.go @@ -22,40 +22,33 @@ import ( // Support generates the supporting files type Support struct { - shared - Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` - Operations []string `long:"operation" short:"O" description:"specify an operation to include, repeat for multiple"` - Principal string `long:"principal" description:"the model to use for the security principal"` - Models []string `long:"model" short:"M" description:"specify a model to include, repeat for multiple"` - DumpData bool `long:"dump-data" description:"when present dumps the json for the template generator instead of generating files"` - DefaultScheme string `long:"default-scheme" description:"the default scheme for this API" default:"http"` -} + WithShared + WithModels + WithOperations + + clientOptions + serverOptions + schemeOptions + mediaOptions -func (s *Support) getOpts() (*generator.GenOpts, error) { - return &generator.GenOpts{ - Spec: string(s.Spec), - Target: string(s.Target), - APIPackage: s.APIPackage, - ModelPackage: s.ModelPackage, - ServerPackage: s.ServerPackage, - ClientPackage: s.ClientPackage, - Principal: s.Principal, - DumpData: s.DumpData, - DefaultScheme: s.DefaultScheme, - Template: s.Template, - TemplateDir: string(s.TemplateDir), - }, nil + Name string `long:"name" short:"A" description:"the name of the application, defaults to a mangled value of info.title"` } -func (s *Support) getShared() *shared { - return &s.shared +func (s *Support) apply(opts *generator.GenOpts) { + s.Shared.apply(opts) + s.Models.apply(opts) + s.Operations.apply(opts) + s.clientOptions.apply(opts) + s.serverOptions.apply(opts) + s.schemeOptions.apply(opts) + s.mediaOptions.apply(opts) } func (s *Support) generate(opts *generator.GenOpts) error { - return generator.GenerateSupport(s.Name, nil, nil, opts) + return generator.GenerateSupport(s.Name, s.Models.Models, s.Operations.Operations, opts) } -func (s *Support) log(rp string) { +func (s Support) log(rp string) { log.Printf(`Generation completed! diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/mixin.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/mixin.go index cae058467e..83aa682907 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/mixin.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/mixin.go @@ -16,7 +16,7 @@ import ( const ( // Output messages - nothingToDo = "Nothing to do. Need some swagger files to merge.\nUSAGE: swagger mixin [-c <expected#Collisions>] <primary-swagger-file> <mixin-swagger-file>..." + nothingToDo = "nothing to do. Need some swagger files to merge.\nUSAGE: swagger mixin [-c <expected#Collisions>] <primary-swagger-file> <mixin-swagger-file...>" ) // MixinSpec holds command line flag definitions specific to the mixin diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/serve.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/serve.go index 8598dedf7e..3f13c76a17 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/serve.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/serve.go @@ -4,16 +4,15 @@ import ( "encoding/json" "errors" "fmt" - "github.com/go-openapi/spec" "log" "net" "net/http" - "net/url" "path" "strconv" "github.com/go-openapi/loads" "github.com/go-openapi/runtime/middleware" + "github.com/go-openapi/spec" "github.com/go-openapi/swag" "github.com/gorilla/handlers" "github.com/toqueteos/webbrowser" @@ -43,7 +42,6 @@ func (s *ServeCmd) Execute(args []string) error { } if s.Flatten { - var err error specDoc, err = specDoc.Expanded(&spec.ExpandOptions{ SkipSchemas: false, ContinueOnError: true, @@ -88,17 +86,12 @@ func (s *ServeCmd) Execute(args []string) error { }, handler) visit = fmt.Sprintf("http://%s:%d%s", sh, sp, path.Join(basePath, "docs")) } else if visit != "" || s.Flavor == "swagger" { - if visit == "" { - visit = "http://petstore.swagger.io/" - } - u, err := url.Parse(visit) - if err != nil { - return err - } - q := u.Query() - q.Add("url", fmt.Sprintf("http://%s:%d%s", sh, sp, path.Join(basePath, "swagger.json"))) - u.RawQuery = q.Encode() - visit = u.String() + handler = middleware.SwaggerUI(middleware.SwaggerUIOpts{ + BasePath: basePath, + SpecURL: path.Join(basePath, "swagger.json"), + Path: "docs", + }, handler) + visit = fmt.Sprintf("http://%s:%d%s", sh, sp, path.Join(basePath, "docs")) } } diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/validate.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/validate.go index 6906c7c9c3..220c8b853a 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/validate.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/commands/validate.go @@ -26,7 +26,7 @@ import ( const ( // Output messages - missingArgMsg = "The validate command requires the swagger document url to be specified" + missingArgMsg = "the validate command requires the swagger document url to be specified" validSpecMsg = "\nThe swagger spec at %q is valid against swagger specification %s\n" invalidSpecMsg = "\nThe swagger spec at %q is invalid against swagger specification %s.\nSee errors below:\n" warningSpecMsg = "\nThe swagger spec at %q showed up some valid but possibly unwanted constructs." diff --git a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/swagger.go b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/swagger.go index 2a83ac43b8..6c4a0ecc3e 100644 --- a/vendor/github.com/go-swagger/go-swagger/cmd/swagger/swagger.go +++ b/vendor/github.com/go-swagger/go-swagger/cmd/swagger/swagger.go @@ -29,11 +29,6 @@ func init() { loads.AddLoader(fmts.YAMLMatcher, fmts.YAMLDoc) } -var ( - // Debug is true when the SWAGGER_DEBUG env var is not empty - Debug = os.Getenv("SWAGGER_DEBUG") != "" -) - var opts struct { // General options applicable to all commands Quiet func() `long:"quiet" short:"q" description:"silence logs"` diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/application.go b/vendor/github.com/go-swagger/go-swagger/codescan/application.go index 6008191443..d6d3f1c51a 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/application.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/application.go @@ -3,6 +3,7 @@ package codescan import ( "fmt" "go/ast" + "go/token" "go/types" "log" "os" @@ -290,7 +291,7 @@ func (s *scanCtx) FindModel(pkgPath, name string) (*entityDecl, bool) { } } if decl, found := s.FindDecl(pkgPath, name); found { - s.app.Models[decl.Ident] = decl + s.app.ExtraModels[decl.Ident] = decl return decl, true } return nil, false @@ -352,6 +353,36 @@ func (s *scanCtx) FindComments(pkg *packages.Package, name string) (*ast.Comment return nil, false } +func (s *scanCtx) FindEnumValues(pkg *packages.Package, enumName string) (list []interface{}, _ bool) { + for _, f := range pkg.Syntax { + for _, d := range f.Decls { + gd, ok := d.(*ast.GenDecl) + if !ok { + continue + } + + if gd.Tok != token.CONST { + continue + } + + for _, s := range gd.Specs { + if vs, ok := s.(*ast.ValueSpec); ok { + if vsIdent, ok := vs.Type.(*ast.Ident); ok { + if vsIdent.Name == enumName { + if len(vs.Values) > 0 { + if bl, ok := vs.Values[0].(*ast.BasicLit); ok { + list = append(list, getEnumBasicLitValue(bl)) + } + } + } + } + } + } + } + } + return list, true +} + func newTypeIndex(pkgs []*packages.Package, excludeDeps bool, includeTags, excludeTags map[string]bool, includePkgs, excludePkgs []string) (*typeIndex, error) { @@ -359,6 +390,7 @@ func newTypeIndex(pkgs []*packages.Package, ac := &typeIndex{ AllPackages: make(map[string]*packages.Package), Models: make(map[*ast.Ident]*entityDecl), + ExtraModels: make(map[*ast.Ident]*entityDecl), excludeDeps: excludeDeps, includeTags: includeTags, excludeTags: excludeTags, @@ -374,6 +406,7 @@ func newTypeIndex(pkgs []*packages.Package, type typeIndex struct { AllPackages map[string]*packages.Package Models map[*ast.Ident]*entityDecl + ExtraModels map[*ast.Ident]*entityDecl Meta []metaSection Routes []parsedPathContent Operations []parsedPathContent @@ -483,12 +516,12 @@ func (a *typeIndex) processDecl(pkg *packages.Package, file *ast.File, n node, g def, ok := pkg.TypesInfo.Defs[ts.Name] if !ok { debugLog("couldn't find type info for %s", ts.Name) - //continue + continue } nt, isNamed := def.Type().(*types.Named) if !isNamed { debugLog("%s is not a named type but a %T", ts.Name, def.Type()) - //continue + continue } decl := &entityDecl{ Comments: gd.Doc, @@ -516,16 +549,16 @@ func (a *typeIndex) walkImports(pkg *packages.Package) error { if a.excludeDeps { return nil } - for k := range pkg.Imports { - if _, known := a.AllPackages[k]; known { + for _, v := range pkg.Imports { + if _, known := a.AllPackages[v.PkgPath]; known { continue } - pk := pkg.Imports[k] - a.AllPackages[pk.PkgPath] = pk - if err := a.processPackage(pk); err != nil { + + a.AllPackages[v.PkgPath] = v + if err := a.processPackage(v); err != nil { return err } - if err := a.walkImports(pk); err != nil { + if err := a.walkImports(v); err != nil { return err } } diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/enum.go b/vendor/github.com/go-swagger/go-swagger/codescan/enum.go new file mode 100644 index 0000000000..b8bd8aff30 --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/codescan/enum.go @@ -0,0 +1,23 @@ +package codescan + +import ( + "go/ast" + "strconv" + "strings" +) + +func getEnumBasicLitValue(basicLit *ast.BasicLit) interface{} { + switch basicLit.Kind.String() { + case "INT": + if result, err := strconv.ParseInt(basicLit.Value, 10, 64); err == nil { + return result + } + case "FLOAT": + if result, err := strconv.ParseFloat(basicLit.Value, 64); err == nil { + return result + } + default: + return strings.Trim(basicLit.Value, "\"") + } + return nil +} diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/meta.go b/vendor/github.com/go-swagger/go-swagger/codescan/meta.go index ddfa50ebdf..1115d0203c 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/meta.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/meta.go @@ -201,9 +201,10 @@ func parseContactInfo(line string) (*spec.ContactInfo, error) { name, email = addr.Name, addr.Address } return &spec.ContactInfo{ - URL: url, - Name: name, - Email: email, + ContactInfoProps: spec.ContactInfoProps{ + URL: url, + Name: name, + Email: email,}, }, nil } @@ -215,8 +216,10 @@ func setInfoLicense(swspec *spec.Swagger, lines []string) error { line := lines[0] name, url := splitURL(line) info.License = &spec.License{ - Name: name, - URL: url, + LicenseProps: spec.LicenseProps{ + Name: name, + URL: url, + }, } return nil } diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/parameters.go b/vendor/github.com/go-swagger/go-swagger/codescan/parameters.go index 10a578b7c6..b5f0a9364d 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/parameters.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/parameters.go @@ -59,6 +59,10 @@ func (pt paramTypable) AddExtension(key string, value interface{}) { } } +func (pt paramTypable) WithEnum(values ...interface{}) { + pt.param.WithEnum(values...) +} + type itemsTypable struct { items *spec.Items level int @@ -90,6 +94,10 @@ func (pt itemsTypable) AddExtension(key string, value interface{}) { pt.items.AddExtension(key, value) } +func (pt itemsTypable) WithEnum(values ...interface{}) { + pt.items.WithEnum(values...) +} + type paramValidations struct { current *spec.Parameter } @@ -286,6 +294,11 @@ func (p *parameterBuilder) buildFromStruct(decl *entityDecl, tpe *types.Struct, continue } + if !fld.Exported() { + debugLog("skipping field %s because it's not exported", fld.Name()) + continue + } + tg := tpe.Tag(i) var afld *ast.Field diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/parser.go b/vendor/github.com/go-swagger/go-swagger/codescan/parser.go index bbdae2dffa..8c45aedf41 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/parser.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/parser.go @@ -200,6 +200,7 @@ type swaggerTypable interface { Schema() *spec.Schema Level() int AddExtension(key string, value interface{}) + WithEnum(...interface{}) } // Map all Go builtin types that have Json representation to Swagger/Json types. diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/responses.go b/vendor/github.com/go-swagger/go-swagger/codescan/responses.go index 407a804c4e..7c92c4884a 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/responses.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/responses.go @@ -72,13 +72,19 @@ func (ht responseTypable) Schema() *spec.Schema { func (ht responseTypable) SetSchema(schema *spec.Schema) { ht.response.Schema = schema } + func (ht responseTypable) CollectionOf(items *spec.Items, format string) { ht.header.CollectionOf(items, format) } + func (ht responseTypable) AddExtension(key string, value interface{}) { ht.response.AddExtension(key, value) } +func (ht responseTypable) WithEnum(values ...interface{}) { + ht.header.WithEnum(values) +} + type headerValidations struct { current *spec.Header } @@ -185,6 +191,7 @@ func (r *responseBuilder) buildFromField(fld *types.Var, tpe types.Type, typable if err := sb.buildFromType(ftpe.Elem(), schemaTypable{schema, typable.Level() + 1}); err != nil { return err } + r.postDecls = append(r.postDecls, sb.postDecls...) return nil case *types.Named: if decl, found := r.ctx.DeclForType(ftpe.Obj().Type()); found { diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/schema.go b/vendor/github.com/go-swagger/go-swagger/codescan/schema.go index 21f254b8fc..81349a7c40 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/schema.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/schema.go @@ -65,11 +65,17 @@ func (st schemaTypable) AdditionalProperties() swaggerTypable { st.schema.Typed("object", "") return schemaTypable{st.schema.AdditionalProperties.Schema, st.level + 1} } + func (st schemaTypable) Level() int { return st.level } + func (st schemaTypable) AddExtension(key string, value interface{}) { addExtension(&st.schema.VendorExtensible, key, value) } +func (st schemaTypable) WithEnum(values ...interface{}) { + st.schema.WithEnum(values...) +} + type schemaValidations struct { current *spec.Schema } @@ -182,8 +188,8 @@ func (s *schemaBuilder) buildFromDecl(decl *entityDecl, schema *spec.Schema) err debugLog("map: %v -> [%v]%v", s.decl.Ident.Name, tpe.Key().String(), tpe.Elem().String()) case *types.Named: o := tpe.Obj() - debugLog("got the named type object: %s.%s | isAlias: %t | exported: %t", o.Pkg().Path(), o.Name(), o.IsAlias(), o.Exported()) if o != nil { + debugLog("got the named type object: %s.%s | isAlias: %t | exported: %t", o.Pkg().Path(), o.Name(), o.IsAlias(), o.Exported()) if o.Pkg().Name() == "time" && o.Name() == "Time" { schema.Typed("string", "date-time") return nil @@ -263,6 +269,10 @@ func (s *schemaBuilder) buildFromType(tpe types.Type, tgt swaggerTypable) error tgt.Typed("string", "date-time") return nil } + if pkg.PkgPath == "encoding/json" && tio.Name() == "RawMessage" { + tgt.Typed("object", "") + return nil + } cmt, hasComments := s.ctx.FindComments(pkg, tio.Name()) if !hasComments { cmt = new(ast.CommentGroup) @@ -298,7 +308,12 @@ func (s *schemaBuilder) buildFromType(tpe types.Type, tgt swaggerTypable) error } if enumName, ok := enumName(cmt); ok { - debugLog(enumName) + enumValues, _ := s.ctx.FindEnumValues(pkg, enumName) + if len(enumValues) > 0 { + tgt.WithEnum(enumValues...) + enumTypeName := reflect.TypeOf(enumValues[0]).String() + _ = swaggerSchemaForType(enumTypeName, tgt) + } return nil } @@ -693,6 +708,11 @@ func (s *schemaBuilder) buildFromStruct(decl *entityDecl, st *types.Struct, sche break } + if afld == nil { + debugLog("can't find source associated with %s", fld.String()) + continue + } + // if the field is annotated with swagger:ignore, ignore it if ignored(afld.Doc) { continue @@ -973,6 +993,21 @@ func schemaVendorExtensibleSetter(meta *spec.Schema) func(json.RawMessage) error } } +type tagOptions []string + +func (t tagOptions) Contain(option string) bool { + for i := 1; i < len(t); i++ { + if t[i] == option { + return true + } + } + return false +} + +func (t tagOptions) Name() string { + return t[0] +} + func parseJSONTag(field *ast.Field) (name string, ignore bool, isString bool, err error) { if len(field.Names) > 0 { name = field.Names[0].Name @@ -988,19 +1023,21 @@ func parseJSONTag(field *ast.Field) (name string, ignore bool, isString bool, er if strings.TrimSpace(tv) != "" { st := reflect.StructTag(tv) - jsonParts := strings.Split(st.Get("json"), ",") - jsonName := jsonParts[0] + jsonParts := tagOptions(strings.Split(st.Get("json"), ",")) - if len(jsonParts) > 1 && jsonParts[1] == "string" { + if jsonParts.Contain("string") { // Need to check if the field type is a scalar. Otherwise, the // ",string" directive doesn't apply. isString = isFieldStringable(field.Type) } - if jsonName == "-" { + switch jsonParts.Name() { + case "-": return name, true, isString, nil - } else if jsonName != "" { - return jsonName, false, isString, nil + case "": + return name, false, isString, nil + default: + return jsonParts.Name(), false, isString, nil } } return name, false, false, nil diff --git a/vendor/github.com/go-swagger/go-swagger/codescan/spec.go b/vendor/github.com/go-swagger/go-swagger/codescan/spec.go index 4da0ddc34f..726787c11b 100644 --- a/vendor/github.com/go-swagger/go-swagger/codescan/spec.go +++ b/vendor/github.com/go-swagger/go-swagger/codescan/spec.go @@ -1,6 +1,8 @@ package codescan import ( + "go/ast" + "github.com/go-openapi/spec" ) @@ -193,11 +195,35 @@ func (s *specBuilder) buildModels() error { if !s.scanModels { return nil } + for _, decl := range s.ctx.app.Models { if err := s.buildDiscoveredSchema(decl); err != nil { return err } } + + return s.joinExtraModels() +} + +func (s *specBuilder) joinExtraModels() error { + tmp := make(map[*ast.Ident]*entityDecl, len(s.ctx.app.ExtraModels)) + for k, v := range s.ctx.app.ExtraModels { + tmp[k] = v + s.ctx.app.Models[k] = v + delete(s.ctx.app.ExtraModels, k) + } + + // process extra models and see if there is any reference to a new extra one + for _, decl := range tmp { + if err := s.buildDiscoveredSchema(decl); err != nil { + return err + } + } + + if len(s.ctx.app.ExtraModels) > 0 { + return s.joinExtraModels() + } + return nil } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/bindata.go b/vendor/github.com/go-swagger/go-swagger/generator/bindata.go index d2ff442c64..d9ded7df9f 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/bindata.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/bindata.go @@ -1,36 +1,43 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: -// templates/additionalpropertiesserializer.gotmpl (2.813kB) -// templates/client/client.gotmpl (4.702kB) -// templates/client/facade.gotmpl (3.932kB) -// templates/client/parameter.gotmpl (12.349kB) -// templates/client/response.gotmpl (6.436kB) -// templates/contrib/stratoscale/client/client.gotmpl (3.68kB) -// templates/contrib/stratoscale/client/facade.gotmpl (2.159kB) -// templates/contrib/stratoscale/server/configureapi.gotmpl (5.93kB) +// templates/client/client.gotmpl (5.125kB) +// templates/client/facade.gotmpl (3.83kB) +// templates/client/parameter.gotmpl (12.261kB) +// templates/client/response.gotmpl (6.363kB) +// templates/contrib/stratoscale/client/client.gotmpl (3.591kB) +// templates/contrib/stratoscale/client/facade.gotmpl (2.078kB) +// templates/contrib/stratoscale/server/configureapi.gotmpl (6.644kB) // templates/contrib/stratoscale/server/server.gotmpl (236B) -// templates/docstring.gotmpl (265B) -// templates/header.gotmpl (519B) -// templates/model.gotmpl (785B) -// templates/modelvalidator.gotmpl (447B) -// templates/schema.gotmpl (11.283kB) -// templates/schemabody.gotmpl (12.811kB) -// templates/schematype.gotmpl (854B) -// templates/schemavalidator.gotmpl (31.015kB) -// templates/server/builder.gotmpl (16.812kB) -// templates/server/configureapi.gotmpl (6.171kB) -// templates/server/doc.gotmpl (1.247kB) -// templates/server/main.gotmpl (5.969kB) -// templates/server/operation.gotmpl (3.803kB) -// templates/server/parameter.gotmpl (28.79kB) -// templates/server/responses.gotmpl (11.315kB) -// templates/server/server.gotmpl (23.074kB) +// templates/docstring.gotmpl (270B) +// templates/header.gotmpl (432B) +// templates/model.gotmpl (700B) +// templates/schema.gotmpl (5.504kB) +// templates/schemabody.gotmpl (14.007kB) +// templates/schemaembedded.gotmpl (551B) +// templates/schemapolymorphic.gotmpl (2.061kB) +// templates/schematype.gotmpl (965B) +// templates/schemavalidator.gotmpl (31.954kB) +// templates/serializers/additionalpropertiesserializer.gotmpl (2.824kB) +// templates/serializers/aliasedserializer.gotmpl (480B) +// templates/serializers/allofserializer.gotmpl (7.467kB) +// templates/serializers/basetypeserializer.gotmpl (2.894kB) +// templates/serializers/marshalbinaryserializer.gotmpl (550B) +// templates/serializers/schemaserializer.gotmpl (679B) +// templates/serializers/subtypeserializer.gotmpl (6.461kB) +// templates/serializers/tupleserializer.gotmpl (2.34kB) +// templates/server/builder.gotmpl (18.967kB) +// templates/server/configureapi.gotmpl (6.786kB) +// templates/server/doc.gotmpl (1.52kB) +// templates/server/main.gotmpl (5.965kB) +// templates/server/operation.gotmpl (3.868kB) +// templates/server/parameter.gotmpl (28.728kB) +// templates/server/responses.gotmpl (12.037kB) +// templates/server/server.gotmpl (23.049kB) // templates/server/urlbuilder.gotmpl (7.641kB) -// templates/structfield.gotmpl (1.522kB) -// templates/swagger_json_embed.gotmpl (848B) -// templates/tupleserializer.gotmpl (16.512kB) -// templates/validation/customformat.gotmpl (611B) -// templates/validation/primitive.gotmpl (2.173kB) +// templates/structfield.gotmpl (1.91kB) +// templates/swagger_json_embed.gotmpl (759B) +// templates/validation/customformat.gotmpl (473B) +// templates/validation/primitive.gotmpl (2.225kB) // templates/validation/structfield.gotmpl (909B) package generator @@ -51,7 +58,7 @@ import ( func bindataRead(data []byte, name string) ([]byte, error) { gz, err := gzip.NewReader(bytes.NewBuffer(data)) if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %w", name, err) } var buf bytes.Buffer @@ -59,7 +66,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %w", name, err) } if clErr != nil { return nil, err @@ -100,27 +107,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _templatesAdditionalpropertiesserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x56\x5d\x6f\xdb\x36\x14\x7d\xd7\xaf\x38\x33\xb6\x54\x1a\x54\x79\x49\xdf\xb2\x79\x40\x87\x6e\xc0\x06\x34\x1b\xd2\x75\x2f\x41\x1e\x18\xe9\xda\x66\x43\x93\x1a\x49\xcb\xcb\x04\xfd\xf7\x81\x1f\xb5\xa4\x56\x32\xdc\xbc\xcc\x4f\x16\x45\x9d\x7b\xee\xb9\xf7\x1e\xb2\x6d\x51\xd1\x9a\x4b\xc2\x82\x55\x15\xb7\x5c\x49\x26\xfe\xd0\xaa\x26\x6d\x39\x99\x77\xa4\x39\x13\xfc\x5f\xd2\x0b\x74\x5d\xb2\x5c\xe2\xbd\xdc\x31\x6d\xb6\x4c\xfc\xf6\xee\xf7\x1b\xec\x3f\x3e\x19\xd8\x2d\x37\x50\x0f\x1f\xa8\xb4\x38\x70\xbb\x45\x8f\x87\xfa\x08\x88\xb5\x56\x3b\xb8\x6f\x93\xf5\x5e\x96\x48\xdb\xb6\xb8\xa5\x92\x78\x43\xfa\x86\xed\xa8\xeb\xf0\x6d\xdb\xa2\x66\xa6\xf4\x71\x51\xb8\x55\x74\x5d\x36\x8e\x9c\x56\xcc\x32\xdc\xdd\x3f\x3c\x59\xca\x40\x5a\x2b\x8d\x36\x01\x96\x4b\x18\xcb\x36\x84\xcb\x1c\x0f\x5c\x56\xb0\x5b\x1a\x84\x4f\x80\x86\xe9\xb0\xe5\x12\x6d\x0b\x4b\xbb\x5a\x30\x4b\x58\x38\xce\x6a\x6f\x5f\x1f\x59\xff\xa4\xaa\xa7\x05\x0a\x97\x37\xc0\xd7\x2e\x08\xae\x57\xf8\x60\x94\x2c\x8e\x5c\x3c\x8f\x1c\x17\x01\x31\xfb\xde\xef\xfa\x6a\x05\xc9\x85\xe7\x03\x68\xb2\x7b\x2d\xdd\x7a\x02\x74\x91\x80\x2e\x1b\x4c\xa6\x99\xc0\xad\x6b\x26\x37\x84\xa2\xaf\x43\x78\xa3\xcb\xa6\x98\xfc\x0a\xab\x98\xd2\xf4\xeb\x00\x4a\xb2\x0a\xff\x9d\xc0\x23\xd1\x03\x82\x2e\x9b\x64\xa8\xe0\x55\x0e\x4d\x3b\xd5\x0c\xf5\x03\x93\x95\x2b\x2c\xac\xc2\x8e\xd5\x09\xc2\xde\x2b\x27\xcc\x8e\x3d\x52\xba\x63\xf5\x9d\xb1\x9a\xcb\xcd\x7d\xdb\x3a\xd5\x8a\xd7\x13\x6d\x85\xae\xf3\x32\xde\xb2\xc3\x5b\x32\x86\x6d\xc8\xf1\x13\xc6\x31\xe1\xd2\x92\x5e\xb3\x92\xda\xee\x48\x3a\x3b\xb7\x02\x57\x67\x54\xe0\xa4\xc4\x15\x09\xb2\x94\x06\xb0\xdc\xd7\x48\x73\x69\xd7\x58\x7c\xf3\xf7\xa2\x6f\xc6\x91\xa2\xe1\xe1\x44\xae\x43\x55\x5f\xe5\x5e\xbf\xe9\xe1\x68\x98\xd8\xfb\x26\xe5\x6b\x08\x92\x91\x46\x86\x1f\xf1\xdd\x31\x17\xb3\x17\x76\x46\xee\xbe\x99\x4d\xb9\xa5\x1d\xfb\xf3\xa9\xa6\xc5\x2c\xab\xcc\x03\xae\x95\xc6\x63\x8e\xc6\x41\x06\x4d\x62\x45\x43\xbc\xd0\xae\x56\x39\xce\x5f\x1c\x21\x22\xcc\x56\xae\x71\x02\xf3\x35\xa4\xb2\xd3\x18\xc5\xaf\xe6\x66\x2f\x04\x7b\x10\x4e\xf5\x8b\xa3\xe4\x9e\xcf\x54\xa9\x3f\x2b\xb7\xfb\x7d\xe4\x11\xb4\xbb\x7b\xbc\xc7\x2a\x64\x94\xf4\x6f\xdd\x48\xfc\xe5\xd4\xff\xf9\x9f\x5a\x93\x31\x5c\xc9\x38\x15\xfe\xa3\x38\xba\x7d\x97\x26\x27\x3e\x09\x02\x7e\xda\x22\x91\x96\xe4\x22\xe9\x12\xe7\xa4\x6f\x07\x3e\xfa\xa5\x2e\xca\xa5\x55\x60\xde\x47\xe3\xee\x59\x3b\x9d\x71\xd3\x41\xf4\x34\x43\x1a\x9c\x34\x0f\x4e\x9a\x79\x35\x9f\x67\x94\xf3\xa3\x75\xca\xa1\xb0\x9a\x91\xf3\x53\x15\x97\x4b\xdf\xf8\xc3\xcc\x43\x0b\x4b\x75\x90\x63\xa3\x77\x0f\x26\x1f\xb5\x5e\x4c\x3a\x8d\x6e\xdd\xbb\xca\x94\x5f\x48\x2e\xf2\xa1\x69\xc4\x99\x9c\xe6\x99\x61\xb5\x1a\x0c\xa9\x07\x88\x04\x5c\xc5\x23\xc4\x1c\x7b\x77\x48\x4d\x16\x3a\xc1\x60\x7d\x3a\x97\x19\x3e\xcf\xca\xcd\x33\xce\xf0\x03\x5e\x8d\xb7\x0f\x39\x8c\xd3\x29\x95\x2c\x99\x25\xe9\x3a\xc3\x65\x71\x15\xd3\x3a\x16\xe0\xae\xc7\x7d\x79\xe9\x26\xef\x45\xfe\xa2\x9f\x06\x56\xd7\x24\xab\x34\x2a\xd5\x87\xb9\xbb\xbc\xbe\x2f\x8a\x22\xcb\xe3\xbc\x0c\x7a\x60\x70\x63\x91\x6a\xca\x34\x9e\x7b\x67\xd9\x72\x41\xa8\xb8\x61\x42\xa8\x03\x97\x9b\xff\xe7\x02\xe3\xa6\xce\xcb\x71\xfe\xd0\xf9\x63\xab\x3c\x36\xc6\x0d\x1d\xde\x50\xa9\x2a\xd2\xa9\x03\x37\x6e\xe1\x96\x98\x7b\x76\x31\xb3\x2c\xec\x2f\xde\xc4\x54\xdf\x4b\x3f\x3c\xbf\x70\x12\x95\x49\xc7\x47\xad\xdf\xe7\xc1\xd2\x8b\x50\xc4\x33\xcf\xd7\x97\xf8\xda\xdd\x71\xae\x57\xf8\xec\xaa\x71\xd2\x24\x26\xae\x26\xb3\x8e\xe1\x09\x9d\x75\xe3\x19\x79\x6f\xff\xe2\xbf\x00\x00\x00\xff\xff\x1f\x93\x9a\x78\xfd\x0a\x00\x00") - -func templatesAdditionalpropertiesserializerGotmplBytes() ([]byte, error) { - return bindataRead( - _templatesAdditionalpropertiesserializerGotmpl, - "templates/additionalpropertiesserializer.gotmpl", - ) -} - -func templatesAdditionalpropertiesserializerGotmpl() (*asset, error) { - bytes, err := templatesAdditionalpropertiesserializerGotmplBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "templates/additionalpropertiesserializer.gotmpl", size: 2813, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x34, 0xfe, 0xa9, 0x3a, 0xd0, 0x9a, 0x6d, 0x64, 0x2f, 0x4c, 0x3b, 0x33, 0x7c, 0xfb, 0x8b, 0x89, 0x14, 0x21, 0x56, 0x9e, 0x41, 0x9c, 0x30, 0x30, 0x13, 0xf8, 0x23, 0x36, 0x7e, 0xf1, 0xaf, 0x91}} - return a, nil -} - -var _templatesClientClientGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x4b\x6f\xdb\xc6\x13\xbf\xf3\x53\xcc\x5f\x7f\x27\x90\x04\x9a\x6c\xaf\x2c\x7c\x30\xec\x14\xf1\x21\xb6\x11\x09\xcd\xb1\x58\x91\x23\x72\x61\x72\x97\xd9\x87\x14\x85\xe0\x77\x2f\xf6\xc1\x95\x28\xc9\x72\x0e\x6d\x91\x43\x2f\x36\xb9\xf3\xfe\xcd\x83\xb3\x4a\x53\xb8\xe3\x05\x42\x89\x0c\x05\x51\x58\xc0\x6a\x07\x25\xbf\x96\x5b\x52\x96\x28\x7e\x83\xfb\x27\x78\x7c\x5a\xc2\x87\xfb\x87\x65\x12\x45\x51\xd7\x01\x5d\x43\x72\xc7\xdb\x9d\xa0\x65\xa5\xe0\xba\xef\xd3\x14\xba\x0e\x72\xde\x34\xc8\xd4\x11\xad\xeb\x00\x59\x01\x7d\x1f\x45\x51\x4b\xf2\x17\x52\xa2\x61\x4e\x1e\x49\x83\xf6\x34\x4d\x61\x59\x51\x09\x6b\x5a\x23\x6c\x89\x1c\x7b\xa2\x2a\x04\xef\x0a\x28\xce\xeb\xc4\xf0\x7f\x28\xa8\xa2\xac\x04\x15\xe4\x1a\x6b\xae\x15\x7c\x83\xb0\xd6\xca\xaa\xaa\x90\xc1\x8e\x6b\x10\x78\x2d\x34\x1b\x69\x1a\x4c\x58\x9f\x09\x2b\xa2\x88\x36\x2d\x17\x0a\xa6\x11\xc0\x84\xa1\x4a\x2b\xa5\xda\x89\x79\x29\xa9\xaa\xf4\x2a\xc9\x79\x93\x96\xfc\x9a\xb7\xc8\x48\x4b\x53\x14\x82\x0b\x79\x81\xc1\x58\xba\x40\x16\x9a\x29\xda\xe0\x05\x8e\x0d\xa9\x69\x41\x14\x4e\xa2\x08\x40\x2a\xb1\x6e\xd4\xab\xb6\x2c\xd5\x32\x76\x1d\x08\xc2\x4a\x84\xe4\x1e\xd7\x44\xd7\xea\xc1\xc6\x25\xc1\x26\xa2\x15\x94\xa9\x35\x4c\xde\x7d\x9d\x40\xd2\xf7\x8e\xdf\x67\xe7\x40\xf6\xea\x05\x77\x31\x5c\x6d\x48\xad\x11\xb2\x1b\x48\x46\x4a\x0c\x15\xfa\x1e\x8e\xf4\x79\xf6\x23\xad\x33\x9b\xdf\x47\xdc\x42\x2e\x90\x28\x94\x40\x80\xe1\xd6\x70\x54\xba\x21\x8c\x7e\xc7\x50\x0a\x70\xfb\xfc\x00\x79\x4d\x91\xa9\x24\x5a\x6b\x96\x1b\xb9\xa9\x12\x84\x49\x9b\x1b\x8f\x59\x72\x67\x59\x96\xc3\x79\x0c\x6b\x2e\x1a\xa2\xa4\x47\x29\xf9\x8c\x25\x95\x4a\xec\x66\x30\x77\xac\xd0\x45\x00\x02\x95\x16\x0c\xde\xbb\xa3\x2e\xa8\xcd\x40\x9d\x68\xca\x86\x87\x3e\x32\x05\x3a\x8f\x06\x3d\xae\xf6\x17\xba\x69\x88\xd8\x39\x38\xc6\x6f\x86\x7c\x8f\x32\x17\xb4\x55\x94\x33\x5b\xe0\x5d\x07\xab\x9a\xe7\x2f\xa1\x3f\xc6\x0c\x01\x2c\xf3\x50\x4b\x3c\xd6\x61\x09\x6f\x29\x30\x72\x7d\xbf\xe6\xe2\x55\x64\xf7\x39\x99\xa7\x91\xda\xb5\x08\x3e\x28\xa9\x84\xce\x1d\x46\x6f\x62\x1d\xc1\x6b\x60\x47\x2e\x50\x5f\x7c\x4f\xad\x69\x2f\xca\x99\xa9\x19\x03\xa0\x29\x16\x22\x73\x52\x8f\xdc\x3a\x87\x67\x5b\x6b\x61\xd9\x7e\xa7\x42\xaa\x2f\x5c\x14\x30\xdd\x07\xe4\x59\x67\x3f\x03\xda\x3f\x84\xb4\xad\xe3\x29\x19\x4a\x71\x06\x67\x91\x98\xb6\x44\x90\x46\xc2\xfc\x2c\xf5\xd9\x12\x7d\xbc\xb7\x5a\x55\x5c\xd0\xef\x68\x2c\xc4\x40\xb4\xaa\x1e\xd8\x9a\x1f\x65\xec\xd6\x1f\x7f\x11\x54\xa1\xe8\x3a\x64\x45\x40\xec\x23\x91\x0b\x25\x90\x34\x94\x95\x9f\x51\xb6\x9c\xd9\x70\x62\xd8\x5a\x66\xa0\x3c\x19\xc4\x7c\x20\xb3\x7d\xa6\xf2\x1c\xa5\x3c\x90\x9a\xee\x93\x7e\x44\x34\xa9\x3f\x1f\x4f\x0c\xa3\x2c\xd8\x07\x3b\x50\x5f\xb5\x32\x0b\x7c\xb6\x4e\xcd\x27\xe3\xe9\xfe\x29\x83\x3f\xfc\x90\xb4\xc3\xdd\x63\xb8\xc2\x35\x17\x08\x12\x59\x41\x59\x19\x81\x51\xe9\x49\x37\x37\xc0\x68\x6d\x55\x40\x38\x33\x53\xe6\x02\xec\xd3\x59\x04\xe0\x87\xda\x55\x8d\xac\x54\x95\x99\x89\x35\xb2\xb3\x11\x3b\xc6\xf3\x51\x08\x94\xba\x56\x5d\x67\xea\xa7\xef\xff\x0c\x31\xc5\x80\x42\x18\xa5\x24\x09\x1d\x98\x2c\xf4\xaa\xa1\x6a\xfa\x7e\x9c\xd7\xd0\x58\x2e\x86\x87\xfb\xec\x78\x0e\x07\x90\x2d\xc3\x27\x54\x15\x2f\x4e\x99\xdc\x79\x60\x7b\x26\xaa\x7a\x26\x4a\xa1\x60\xa7\xbc\x86\xb8\xe7\x14\xbc\xd0\x39\xca\x4f\x58\x50\xb2\xdc\xb5\x28\xc7\x02\xff\xdf\x18\x89\x13\xa6\x20\x7f\xc7\x99\xd4\xcd\x1b\xf2\xa7\x4c\x41\x7e\x91\x57\xd8\x9c\x15\xf2\x94\x83\x98\x4c\xfa\x32\x9f\x67\x77\xf6\x19\x49\x81\x22\x83\xf7\x67\x13\xee\xa8\x5d\xf8\x08\x90\xc4\x3f\xfe\x58\xe3\x64\xfe\x7f\xc8\x6b\x1f\x9f\xeb\x59\xeb\xc8\xd0\x9f\x59\x68\xe0\xd8\x89\x79\xfa\x1d\x67\x0a\xbf\xa9\xc1\xfb\xc4\xbf\x7b\x0c\x6d\x29\x04\xda\xc7\xe5\xf2\xd9\x1d\x19\x72\x3f\x73\x25\x6f\x4a\xea\x7f\x87\xf5\xee\x3f\x80\xaf\x56\xa7\x85\xa4\x58\x68\x21\xb8\x66\x05\x4c\x18\xad\x27\xfe\xef\x2f\xa1\xf2\x47\xcd\x8b\x42\x84\xde\xb8\x7e\x45\xab\x35\xed\xc9\xf8\x35\xe8\xf9\xd5\x91\xa4\xe3\x8f\x81\xbf\x98\xfa\x77\x0d\x92\x4c\x8f\xc6\xc6\x91\xd6\x21\x5d\x3e\x50\xfe\x32\x0e\x70\xd0\xc9\x68\xed\xbd\x4b\x53\xd0\x0c\xbf\xb5\x98\x9b\xa5\xd2\xd3\x8d\x31\xab\xce\xca\xee\x43\xf0\x7b\xd3\x08\x98\x74\x6e\x48\x04\x0a\x47\x0b\xa2\x40\xa5\xdd\x39\x69\x81\x45\x6c\x16\xd1\xda\xad\xa4\x84\x15\x83\x37\x84\x81\x1d\x6d\x30\x4f\x6d\xc4\x7b\x47\x7c\x54\x17\xe2\x3e\x72\xe5\x30\x6e\xaf\x9d\xd1\x3a\x0e\x93\xff\x11\xb7\xb7\xcf\x0f\x1f\x8c\xb5\xe9\xe4\x42\xc0\x19\xe4\xa6\x9a\x98\x02\xb2\x21\xb4\x26\xab\x1a\x81\xc8\x33\xc1\x79\xd7\x27\xf1\xa9\xd7\x67\x8e\x12\x73\x8d\x98\xce\x66\x07\x78\xfa\x0f\xa5\x4b\x81\x24\x6b\x2c\x35\x11\x45\x06\xcc\xb4\x55\x5d\xef\x62\x20\x2b\x69\x1d\x39\xb1\x6e\x0c\xbc\x30\xbe\x65\x27\xee\xcb\x13\x68\xc9\x8a\x6f\x30\x03\xc9\x1d\xfa\x26\x01\x90\xf3\x02\x4b\x64\x40\xa5\xd4\x26\xc5\x8d\x2c\x0d\xd2\x66\x65\x59\xb8\xb9\x71\x11\x23\xf0\xab\xd4\x80\x79\xe6\x96\x53\xce\x94\x20\xb9\x02\xc6\x15\x20\x5b\x73\x91\xbb\x5b\x8a\x44\xb1\x41\x91\x0c\x2b\x55\x50\xab\x38\x94\xa8\x82\xa7\x31\xac\xb4\x82\x92\xab\x0c\xde\x2d\x27\xb1\xcf\xbb\x41\xac\x25\x8c\xe6\xd3\x46\x96\x23\xf8\x58\x71\xd8\x41\x61\xed\x48\xe7\x20\x71\x83\x82\xd4\xd0\x72\x29\xa9\x49\xe0\x29\x4a\xbe\xe0\xe4\x96\xaa\xbc\x82\xb0\xcc\x0f\xb5\x66\x56\xc0\x99\xef\x1c\xa7\xdf\x2f\xff\xd4\xac\xfe\x76\xed\x3f\xff\x79\xcb\x89\xc4\xa3\x45\xe5\x6a\x13\x70\x3a\x1a\x35\xa3\x89\x62\x7d\x18\x66\xca\x15\x1d\x0d\x15\xd7\xad\x27\x91\xf7\xff\x6e\x77\xbe\x39\x29\xfe\xde\xf6\xfd\xe1\x91\xfb\x5f\x8b\xff\x73\x2d\x7e\xf5\x53\xf5\xf8\xfe\x32\x7e\x88\xed\x7e\xdc\x47\x23\xbe\x3e\x3a\x78\x31\x37\xed\x05\xee\x2f\x6b\x90\x57\xa6\xa3\xa5\x5d\x8e\xf7\x57\x3b\xee\x7e\x0a\x71\x17\xed\xd3\xfb\xc9\xa1\x86\xb7\x2f\xdf\x6e\x82\x1c\xec\xad\x70\xb3\x37\x15\xf5\xd1\x5f\x01\x00\x00\xff\xff\xfc\xd2\xf3\xdf\x5e\x12\x00\x00") +var _templatesClientClientGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x4d\x6f\xdb\x38\x13\x3e\x57\xbf\x62\x5e\xbf\x69\x61\x1b\x8a\xb4\x7b\xf5\x22\x87\x20\xe9\xa2\x39\x34\x09\x62\x63\x7b\x5c\xd0\xd2\x48\x22\x22\x91\x2a\x49\xd9\x75\x05\xfd\xf7\x05\x3f\x44\x4b\xfe\x48\xb2\xc0\x6e\xb1\x87\x5e\x62\x49\xf3\xc1\x99\x67\xe6\x19\x92\x89\x63\xb8\xe1\x29\x42\x8e\x0c\x05\x51\x98\xc2\x7a\x07\x39\xbf\x94\x5b\x92\xe7\x28\x7e\x83\xdb\x07\xb8\x7f\x58\xc1\xc7\xdb\xbb\x55\x14\x04\x41\xdb\x02\xcd\x20\xba\xe1\xf5\x4e\xd0\xbc\x50\x70\xd9\x75\x71\x0c\x6d\x0b\x09\xaf\x2a\x64\xea\x40\xd6\xb6\x80\x2c\x85\xae\x0b\x82\xa0\x26\xc9\x33\xc9\x51\x2b\x47\xf7\xa4\x42\xf3\x35\x8e\x61\x55\x50\x09\x19\x2d\x11\xb6\x44\x8e\x23\x51\x05\x82\x0b\x05\x14\xe7\x65\xa4\xf5\x3f\xa6\x54\x51\x96\x83\xf2\x76\x95\x59\xae\x16\x7c\x83\x90\x35\xca\xb8\x2a\x90\xc1\x8e\x37\x20\xf0\x52\x34\x6c\xe4\xa9\x5f\xc2\xc4\x4c\x58\x1a\x04\xb4\xaa\xb9\x50\x30\x0d\x00\x26\x59\xa5\x26\xfa\x97\x72\xf3\xc3\x50\xc5\x85\x52\xf5\x24\xd0\x6f\x39\x55\x45\xb3\x8e\x12\x5e\xc5\x39\xbf\xe4\x35\x32\x52\xd3\x18\x85\xe0\x42\x4e\xce\x2b\x88\x86\x29\x5a\xe1\x0b\x1a\x52\x89\x7e\xe1\x33\x0a\x5b\x92\xbf\x20\xde\x90\x92\xa6\x44\xa1\x09\x53\x57\xc9\x64\x24\x21\xba\xc5\x8c\x34\xa5\xba\x73\xef\x5d\x77\x20\x1f\x08\x66\xa6\x1c\xf7\xb8\x85\x44\x20\x51\x28\x81\x00\xc3\xad\x56\x2f\x9a\x8a\x30\xfa\x1d\x7d\xe5\xe0\xfa\xf1\x0e\x92\x92\x22\x53\x51\x90\x35\x2c\xd1\x76\x53\x25\x08\x93\x06\x4a\x97\x71\x74\x63\x54\x56\xfd\xf7\x10\x32\x2e\x2a\xa2\x24\xd8\x84\xa3\x27\xcc\xa9\x54\x62\x37\x03\xab\xb9\x44\xb1\xa1\x09\x42\x1b\x00\x08\x54\x8d\x60\xf0\xc1\x4a\x5a\xef\x7c\x01\xea\xc8\xdf\xa2\x7f\xe8\x02\xdd\x55\xf3\xc0\x1a\x81\x6b\xd8\x65\x53\x55\x44\xec\xc0\x74\xe4\xf8\x4d\x8b\x6f\x51\x26\x82\xd6\x8a\x72\x66\xba\xb2\x6d\x61\x5d\xf2\xe4\xd9\x37\xf5\x58\xc1\x77\xb5\x7e\x28\x25\x1e\xfa\x30\x82\xd7\x1c\x68\xbb\xae\xcb\xb8\x38\x8b\xef\x9e\x3c\xf3\x38\x50\xbb\x1a\x1d\x46\x1a\xbb\x26\x51\x06\xa3\x57\x11\x0f\xe0\x1c\xe4\x81\xa5\xdf\x18\x77\x2a\x0d\x55\x28\x53\x28\x32\x92\xa0\x36\xee\x97\xad\x50\x15\x3c\x95\xc3\x50\xbc\x99\xd7\x6f\x83\x77\x6d\x0b\x82\xb0\x1c\x21\x7a\xa8\x35\xd1\x28\x67\xa6\xbf\xb4\xa0\x26\x32\x21\xe5\x30\xd3\x69\x4d\x04\xa9\x24\xcc\x4f\x4a\x1f\x8d\xd0\x95\xe9\xba\x51\x05\x17\xf4\x3b\x6a\x50\x42\x20\x8d\x2a\xee\x58\xc6\x0f\x52\xbf\x76\x9f\xbf\x08\xaa\x50\xb4\x2d\xb2\xd4\x17\xfa\x13\x91\x4b\x25\x90\x54\x94\xe5\x4f\x28\x6b\xce\x4c\x15\x42\xd8\x1a\x65\xa0\x3c\xea\xcd\x1c\xf6\xb3\x7d\x0b\x25\x09\x4a\x39\xb0\x9a\xee\x13\x3d\x10\xea\x74\x4f\xe7\x13\xc2\xa8\x79\xcc\x83\x19\x1f\x67\x57\x99\xed\xdb\xe0\xdd\x60\x9c\xbe\x5b\xe2\xbe\xc8\xaf\x13\x6f\x16\xd8\xb6\x3e\x59\x98\x78\x6e\x87\xc2\x71\xb8\x27\xf9\x53\x97\x8d\x30\x6a\xbf\x53\x21\xd5\x17\x2e\x52\x98\xee\x1b\xd8\xa9\xce\xce\xb3\xcb\xac\xf5\x83\xf8\xf5\x26\x6e\x99\xf9\x35\x25\x30\xb7\xa0\xcd\x4e\x63\xf1\xb3\x51\xdf\xda\xa8\x66\x32\xe9\x9d\xfd\xe1\xf6\x61\x01\x7f\xb8\xad\xc9\x0c\x16\x87\xe1\x1a\x33\x2e\x10\x24\xb2\x94\xb2\x3c\x00\xed\xd2\x89\xae\xae\x80\xd1\xd2\xb8\x00\xff\x4d\xef\x2e\x2f\xc0\x3e\x9d\x05\x00\x6e\x67\xbb\x28\x91\xe5\xaa\x80\xc5\x15\x94\xc8\x4e\x66\xec\xb6\xc0\x93\x59\x08\x94\x4d\xa9\xda\x56\xf7\x4f\xd7\xfd\xe9\x73\x0a\x01\x85\xd0\x4e\x49\xe4\xc9\x16\x2d\x9b\x75\x45\xd5\xf4\xc3\xb8\xae\x9e\x5c\x36\x87\xbb\xdb\x85\x69\x28\x41\x99\xca\x60\xf2\xfe\xeb\x64\x0f\xb2\x51\xf8\x6c\xe6\xea\xb1\x92\xfd\xee\xd5\x1e\x89\x2a\x1e\x89\x52\x28\xd8\xb1\xae\x16\xee\x35\x05\x4f\x9b\x04\xe5\x67\x4c\x29\x59\xed\x6a\x94\x63\x83\xff\x6f\xb4\xc5\x91\x92\xb7\xbf\xe1\x4c\x36\xd5\x2b\xf6\xc7\x4a\xde\x7e\x99\x14\x58\x9d\x34\x72\x92\x41\x4e\xba\x7c\x0b\x57\x67\xfb\xed\x09\x49\x8a\x62\x01\x1f\x4e\x16\xdc\x4a\x5b\xbf\xed\x93\xc8\x3d\xbe\x8d\x38\x0b\xf7\xeb\xeb\xda\x85\xa7\x38\x6b\x02\xe9\xf9\xb9\xf0\x04\x0e\xad\x99\x93\xdf\x70\xa6\xf0\x9b\xea\xa3\x8f\xdc\xbb\xc3\xd0\xb4\x82\x97\x7d\x5a\xad\x1e\xed\x27\x2d\xee\x66\xb6\xe5\x75\x4b\xfd\x6f\xd8\xef\xee\xc8\x73\xb6\x3b\x0d\x24\xe9\xb2\x11\x82\x37\x2c\x85\x09\xa3\xe5\xc4\xfd\xfd\xc5\x77\xfe\x88\xbc\x28\x84\xe7\xc6\xe5\x19\xaf\x66\x69\x27\xc6\xaf\xde\xcf\xaf\x56\x24\xad\x7e\x08\xfc\x59\xf7\xbf\x25\x48\x34\x3d\x18\x1b\x07\x5e\xfb\x72\xb9\x44\xf9\xf3\x38\xc1\xde\x27\xa3\xa5\x8b\x2e\x8e\xa1\x61\xf8\xad\xc6\x44\x9f\xfd\x9d\x5c\x2f\x66\xdc\x19\xdb\x7d\x0a\xee\x50\x3b\x02\x26\x9e\x6b\x11\x81\xd4\xca\xbc\xa9\x3e\xd2\xe8\xab\x01\x4d\x31\x0d\xf5\x7d\xa1\xb4\x37\x07\xc2\xd2\x3e\x1a\xc2\xc0\x8c\x36\x98\xc7\x26\xe3\x7d\x20\x2e\xab\x17\xf2\x3e\x08\x65\x98\xb7\xf3\xce\x68\x19\xfa\xc9\x7f\x8f\xdb\xeb\xc7\xbb\x8f\x7a\xb5\xe9\xe4\x85\x84\x17\x90\xe8\x6e\x62\x0a\xc8\x86\xd0\x92\xac\x4b\x04\x22\x4f\x24\xe7\x42\x9f\x84\xc7\x51\x9f\xf8\x14\xe9\xdb\xde\x74\x36\x1b\xe0\xe9\x36\x4a\x5b\x02\x49\x32\xcc\x1b\x22\xd2\x05\x30\x4d\xab\xb2\xdc\x85\x40\xd6\xd2\x04\x72\xb4\xba\x5e\xe0\x99\xf1\x2d\x3b\x0a\x5f\x1e\x41\x4b\xd6\x7c\x83\x0b\x90\xdc\xa2\xaf\x0b\x00\x09\x4f\x31\x47\x06\x54\xca\x46\x97\xb8\x92\xb9\x46\x5a\x1f\x52\x97\x76\x6e\xbc\x88\x11\xb8\xc3\x73\x8f\xf9\xc2\x5e\x4a\x38\x53\x82\x24\x0a\x18\x57\x80\x2c\xe3\x22\xb1\x97\x49\x89\x62\x83\x22\xea\x4f\xb3\xde\xad\xe2\x90\xa3\xf2\x91\x86\xb0\x6e\x14\xe4\x5c\x2d\xe0\xfd\x6a\x12\xba\xba\x6b\xc4\x6a\xc2\x68\x32\xad\x64\x3e\x82\x8f\xa5\x43\x06\xf9\x63\x47\x3c\x07\x89\x1b\x14\xa4\x84\x9a\x4b\x49\x75\x01\x8f\x51\x72\x0d\x27\xb7\x54\x25\x05\x6c\x48\xd9\xe0\xb0\xd7\xf4\x49\x7b\xe6\x98\x63\xfd\xdb\x6d\xfc\x82\x86\x70\xb1\xd1\x9a\x67\xb6\xb7\x84\x48\x3c\x38\xa8\x5c\x6c\x3c\x4e\x07\xa3\x66\x34\x51\x4c\x0c\xfd\x4c\xb9\xa0\xa3\xa1\x62\xd9\x7a\x94\x79\xf7\x63\xd9\xf9\xea\xa4\xf8\x67\xe9\xfb\xe6\x91\xfb\x93\xe2\xff\x1e\xc5\x2f\xfe\x53\x1c\xef\x5f\xc7\xd8\xee\xc7\x7d\x30\xd2\xeb\x82\xc1\x8b\xbe\x71\x0f\x6f\x6e\x90\x14\x9a\xd1\xf6\xd6\xbd\xbf\xc5\x71\xfb\x1f\x2b\xfb\x0f\x96\xe3\xfb\xc9\xdf\xbc\xfb\x99\x09\x32\x38\xb7\xc2\xd5\x7e\xa9\xa0\x0b\xfe\x0a\x00\x00\xff\xff\xf0\x51\xfe\x20\x05\x14\x00\x00") func templatesClientClientGotmplBytes() ([]byte, error) { return bindataRead( @@ -135,12 +122,12 @@ func templatesClientClientGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/client/client.gotmpl", size: 4702, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x73, 0xb2, 0x83, 0x60, 0xa9, 0x9b, 0xc5, 0xf6, 0x7e, 0x25, 0xa0, 0x91, 0xf4, 0x4a, 0x31, 0x2e, 0x4b, 0x8, 0xf9, 0xda, 0x18, 0xa9, 0xb6, 0xb7, 0x11, 0x3b, 0x28, 0xf, 0xa7, 0xa1, 0x55, 0x49}} + info := bindataFileInfo{name: "templates/client/client.gotmpl", size: 5125, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9, 0xac, 0x8a, 0xfb, 0x5d, 0x8, 0x2b, 0x9d, 0x80, 0xd2, 0x63, 0x29, 0xb4, 0x26, 0x94, 0xeb, 0x1a, 0x5f, 0x8, 0x86, 0x2, 0x61, 0xde, 0x72, 0xdf, 0x36, 0xfa, 0xb4, 0xdd, 0xc0, 0xef, 0xd9}} return a, nil } -var _templatesClientFacadeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\x4f\x6f\xe3\xb6\x13\xbd\xf3\x53\x0c\xf2\xdb\x5f\x21\x07\x8e\x74\x4f\xe1\x4b\x93\x45\x77\x0f\x4d\x82\xae\x81\x1e\x8a\x1e\x68\x6a\x24\x11\x91\x48\x95\xa4\x6c\x78\x0d\x7d\xf7\x82\x14\xa9\x7f\x91\x1d\xa7\xdd\x9c\x62\x72\x38\x7c\x6f\xde\xe8\x0d\x93\x04\x1e\x64\x8a\x90\xa3\x40\x45\x0d\xa6\xb0\x3b\x42\x2e\xef\xf4\x81\xe6\x39\xaa\x9f\xe1\xf1\x19\x9e\x9e\xb7\xf0\xf9\xf1\xeb\x36\x26\x84\x9c\x4e\xc0\x33\x88\x1f\x64\x7d\x54\x3c\x2f\x0c\xdc\xb5\x6d\x92\xc0\xe9\x04\x4c\x56\x15\x0a\x33\xdb\x3b\x9d\x00\x45\x0a\x6d\x4b\x08\xa9\x29\x7b\xa5\x39\xda\xe0\xf8\xc5\xff\x6f\x37\x92\x04\xb6\x05\xd7\x90\xf1\x12\xe1\x40\xf5\x14\x8c\x29\x10\x3c\x1a\x30\x52\x96\xb1\x8d\xff\x9c\x72\xc3\x45\x0e\xa6\x3f\x57\xb9\x1b\x6b\x25\xf7\x08\x59\x63\x5c\xaa\x02\x05\x1c\x65\x03\x0a\xef\x54\x23\x26\x99\xc2\x15\x0e\x36\x15\x29\x21\x84\x57\xb5\x54\x06\x22\x02\x70\x23\xd0\x24\x85\x31\xf5\x8d\xfd\x91\x73\x53\x34\xbb\x98\xc9\x2a\xc9\xe5\x9d\xac\x51\xd0\x9a\x27\xaa\x11\x86\x57\x68\x23\x6c\xa4\x51\x54\x68\x97\xe0\x72\x7c\xc2\x4a\x8e\xc2\x5c\x48\x6c\x21\x5e\xda\xae\x91\x5d\xd8\x46\xa5\xa4\xd2\xd7\xe0\x26\x00\xda\xa8\xac\x3a\x8b\xb8\xdb\x75\x81\xa7\x13\x28\x2a\x72\x84\xf8\x11\x33\xda\x94\xe6\xab\x2b\x96\x06\xa7\x70\xad\xb8\x30\x19\xdc\xfc\xff\xef\x1b\x88\xdb\xb6\x8b\xf7\xb2\x8f\xce\x7e\x7a\xc5\xe3\x1a\x3e\xed\x69\xd9\x20\xdc\x6f\x20\x9e\x24\xb1\xbb\xd0\xb6\x30\xcb\xe7\xc3\x67\x59\x57\xae\x6b\x3c\x16\xbb\x5e\x34\x15\x15\xfc\x3b\x42\xfc\x44\x2b\x1b\x0e\x5f\xb6\xdb\x17\xe8\x8a\x1d\x93\x3d\x55\x7d\xf4\x06\x9e\xf0\x60\x77\x1f\xdc\x66\x24\x78\xb9\x22\x84\x49\xa1\x3b\xf1\x01\x86\xd4\x5f\xa4\x36\xc0\xb5\x6b\x9d\xd4\x9f\xb7\x6b\x21\x2c\x93\x8d\x48\x81\x0b\xf8\x0d\x0d\x85\x88\x8b\x4c\xae\x40\x23\x33\x5c\x0a\x90\x19\x58\xb1\x5c\x7f\xba\x03\xe3\xa4\xda\x28\xdb\xc0\x9b\x09\xdf\xff\xed\x6f\x20\x76\xdb\x8e\xef\x18\xc9\x2f\x54\xe3\x0b\x35\xc5\x1c\x4d\x58\xff\x4f\x88\xfa\xe4\xe7\x51\xf5\x21\xf3\xea\x7f\x63\x05\x56\xa8\x81\x2a\x9c\x00\xd3\x7e\xfd\x7a\x40\x23\x91\x42\xd2\x05\x20\x61\xcb\x3b\xc7\x44\x4b\x60\x0a\xa9\xb1\x60\x40\xe0\xe1\x8a\xbe\xc8\x1a\xc1\x66\xed\x90\x49\x55\x51\xa3\xfd\xb7\x11\xff\x8e\x39\xd7\x46\x1d\x57\x70\x6b\xa1\x50\xcd\x68\x39\xc9\x77\x22\x00\x0a\x4d\xa3\xc4\x34\xd1\x1f\xdc\x14\x0f\x52\x64\x3c\x0f\x29\xd7\xe0\x5a\x6d\x01\xf7\x10\xfb\x41\x06\x6b\x9b\xaa\xd1\x56\x33\x0a\xac\xd1\x46\x56\xfc\x3b\xdd\x95\x08\x83\x1f\x31\x97\x78\x89\xeb\x5b\x88\x73\xd6\x6b\x60\x59\x0e\xb7\xdb\x90\xac\x8b\xbe\x58\x8b\x24\x01\x14\xba\x51\x08\xa2\x29\x4b\x87\xa5\xa6\x8a\x56\x68\x50\x69\x28\xe8\xbe\x6f\x11\x02\x76\x96\xd8\x0b\x36\x1b\x5b\x1a\x77\x1c\xba\x85\xd0\x08\xb3\x9b\xa3\x15\x01\x68\x49\x77\x4d\x57\xaa\x11\x53\x2a\x52\x5f\x17\x02\xa3\xe5\xfb\xcd\xd4\xa1\xe3\x27\x3c\x44\x2c\xcb\xdd\x97\xe6\x18\xf6\xdd\xdd\xfd\xf2\x2d\xb6\x9a\x28\x1b\xf5\xe7\xd7\xe0\xab\x35\xd2\xf2\x1a\xdd\x3c\xb4\xa0\xc3\x90\x10\xbc\x27\xc7\x9d\x2c\xdb\x37\x17\x7d\xa8\x19\x3f\x2a\x40\xb8\x63\x22\x42\xbf\x18\xae\x7e\xec\x8f\xb8\xf2\xb3\x92\xdb\xba\x0a\x3c\x44\x8b\x48\x56\x5d\x4c\xdc\x73\x81\xcd\xa0\xc8\x64\xa0\x3c\xd7\x76\x10\x73\x29\x7e\x55\xb2\xa9\x75\xe7\x7c\xf6\xe8\x32\x43\xe7\x08\xe1\x57\x7c\x4e\x97\xe9\x04\xf2\x22\xb2\x92\x7b\xc1\x96\x9b\x6b\xa4\xe1\x7c\xe7\xc0\x4d\x61\xdd\xcd\x1e\xee\x0d\x0e\x8d\x7d\x83\x68\x30\xf4\x15\x05\x64\x4a\x56\xce\x00\x2b\xeb\x73\x23\x83\x73\xcf\x8e\x60\x72\xfe\x33\x3c\xd7\xdd\x6f\x3e\x35\x2f\x87\x67\xf0\xd3\xf2\xae\xfd\xb3\xbd\x7c\x3f\x9e\x30\xeb\x7e\x2b\x34\xf7\xfd\xdc\xee\x87\x10\xdf\xf1\xf7\x33\xff\xed\x02\x5a\x5f\xb5\x37\xe5\x92\xc2\x50\x2e\xba\x79\x34\x6a\x66\x2c\xdd\xdb\xcd\x3a\xbd\xf3\xa7\x7e\x02\x5c\x51\x1d\x73\xac\xf1\xcd\x45\xda\xa8\x86\x19\x4f\x76\x34\x3d\xc9\x98\xdd\x78\x2d\xcc\x88\x3f\xff\xf2\x8b\x1d\x01\xeb\x77\xee\xb8\xdc\xa3\x52\x3c\xc5\xe9\x28\x2d\x5c\xd5\x92\xc4\xbd\x22\x79\x3a\x3c\x3f\xaf\x51\x34\x5a\x36\xca\x70\x65\x54\x0c\xb0\xcf\xaa\x1c\x3c\x09\x36\x0e\xcb\x58\x79\x96\x8d\x49\xf4\x9c\x97\x89\xec\x7a\x7d\x7f\x3c\x99\x70\x75\xb4\x9b\xd6\xfd\x22\xa9\x1e\xef\xa6\xc7\x76\x9e\x5c\x10\x6f\x99\x9b\x0e\x9d\xf9\xe3\xa9\xf9\x8b\x23\x3d\xeb\x9e\x8b\xd4\x86\x97\x8a\x3f\xb6\x4c\x6c\xd9\xcc\xb8\xf5\x9a\x6e\x2c\x58\xef\x5a\x1c\x1b\xdd\x27\xb1\x7c\x7e\xf4\x61\xbc\x63\xa8\xcb\xe7\x6f\xc7\x5e\xfa\x10\x26\xe7\xd8\x3a\xb7\xef\xcd\x28\xcb\xcf\x12\xfc\x86\xc3\x1a\xb0\xc2\x42\x99\x1b\x83\xec\x1c\xc0\xf3\xb5\xc3\x9a\x96\x25\x70\x3b\xde\x9a\x9d\x42\x2d\x1b\xc5\x50\x07\x99\x2c\xb8\x19\xe4\xb6\x5d\x4d\xee\x79\x7f\x82\xae\x5c\x6d\xd8\xbf\x1e\x43\xcb\x43\x28\x5e\x06\x31\x1d\x3b\x2d\xf9\x27\x00\x00\xff\xff\x80\x39\x20\xde\x5c\x0f\x00\x00") +var _templatesClientFacadeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x56\x4d\x6f\xe3\x36\x10\xbd\xf3\x57\x0c\x52\xb4\x90\x17\x89\x74\x4f\xe1\x43\x9b\x2c\xba\x7b\x68\x12\x34\x06\x7a\x28\x7a\xa0\xe9\x91\x44\xac\x44\x0a\x24\x65\x23\x6b\xe8\xbf\x17\x43\x91\xb2\xa4\xc8\xde\xa4\xbb\x39\xc5\xe4\x7c\xbd\x79\xc3\x37\xca\x32\xb8\xd3\x3b\x84\x02\x15\x1a\xee\x70\x07\xdb\x17\x28\xf4\x8d\x3d\xf0\xa2\x40\xf3\x2b\xdc\x3f\xc2\xc3\xe3\x06\x3e\xde\x7f\xde\xa4\x8c\xb1\xe3\x11\x64\x0e\xe9\x9d\x6e\x5e\x8c\x2c\x4a\x07\x37\x5d\x97\x65\x70\x3c\x82\xd0\x75\x8d\xca\xcd\xee\x8e\x47\x40\xb5\x83\xae\x63\x8c\x35\x5c\x7c\xe1\x05\x92\x71\xfa\x14\xfe\xa7\x8b\x2c\x83\x4d\x29\x2d\xe4\xb2\x42\x38\x70\x3b\x2d\xc6\x95\x08\xa1\x1a\x70\x5a\x57\x29\xd9\x7f\xdc\x49\x27\x55\x01\x6e\xf0\xab\x7d\xc6\xc6\xe8\x3d\x42\xde\x3a\x1f\xaa\x44\x05\x2f\xba\x05\x83\x37\xa6\x55\x93\x48\x31\x85\x2f\x9b\xab\x1d\x63\x4c\xd6\x8d\x36\x0e\x12\x06\x70\xa5\xd0\x65\xa5\x73\xcd\x15\xa3\x5f\x85\x74\x65\xbb\x4d\x85\xae\xb3\x42\xdf\xe8\x06\x15\x6f\x64\x86\xc6\x68\x63\xaf\xce\x1b\x98\x56\x39\x59\x23\x59\x50\x2c\x67\xb8\xb2\x3e\xc5\x65\xfb\x4c\x54\x12\x95\xbb\x10\xd8\x36\x28\x2e\x5d\x3b\x93\xd7\x17\xfd\x0f\xbc\xf0\xc8\x88\x4d\x8f\xda\x42\x7a\x8f\x39\x6f\x2b\xf7\x39\xfc\xee\xba\xd9\xfd\xe8\x62\xe5\x39\x0b\x0e\x64\x54\xb6\x35\x57\xf2\x2b\x42\xfa\xc0\x6b\x22\x15\x3e\x6d\x36\x4f\xd0\x03\x49\xd9\x9e\x9b\xc1\x7a\x0d\x0f\x78\xa0\xdb\x3b\x7f\x99\x28\x59\xad\x18\x13\x5a\xd9\xbe\xf5\x00\xa7\xd0\x9f\xb4\x75\x20\xad\x27\x6e\x17\xfc\xe9\x2c\x9a\xe5\xba\x55\x3b\x90\x0a\xfe\x44\xc7\x21\x91\x2a\xd7\x2b\xb0\x28\x9c\xd4\x0a\x74\x0e\xd4\x27\x3f\x1d\xde\x61\x1c\xd4\x3a\x43\xe3\xb3\xa6\xe2\x1b\x23\x95\xcb\xe1\xea\xe7\x9f\xf6\x57\x90\xfa\x6b\x0f\x7e\x5c\xc9\xef\xdc\xe2\x13\x77\xe5\xbc\x9a\x78\xfe\x5d\x15\x0d\xc1\xcf\x57\x35\x98\xcc\xbb\xff\x2c\x4a\xac\xd1\x02\x37\x38\x29\xcc\x86\xf3\xb7\x17\x34\x22\x29\x06\x5d\x28\x24\x5e\x85\x77\x3b\xe1\x12\x84\x41\xee\xa8\x18\x50\x78\x78\xc3\x5c\xe4\xad\x12\xb3\x71\xc8\xb5\xa9\xb9\xb3\xd0\xcf\x70\xfa\x17\x16\xd2\x3a\xf3\xb2\x82\x0f\x54\x0a\xb7\x82\x57\x93\x78\x47\x06\x60\xd0\xb5\x46\x4d\x03\xfd\x2d\x5d\x79\xa7\x55\x2e\x8b\x18\xf2\x1a\xfc\xa8\x2d\xd4\x7d\xb2\x7d\x27\x82\x6b\x0a\xd5\x5a\xe2\x8c\x83\x68\xad\xd3\xb5\xfc\xca\xb7\x15\xc2\xe9\xad\x0b\x1f\x78\x09\xeb\xeb\x12\xe7\xa8\xaf\x41\xe4\x05\x7c\xd8\xc4\x60\xbd\xf5\xc5\x5e\x64\x19\xa0\xb2\xad\x41\x50\x6d\x55\xf9\x5a\x1a\x6e\x78\x8d\x0e\x8d\x85\x92\xef\x87\x11\x61\x40\x4a\x4e\x09\xd6\x6b\x6a\x8d\x77\x87\xfe\x20\x0e\xc2\x2c\x73\xb2\x62\x00\x1d\xeb\xd3\xf4\xad\x1a\x21\xe5\x6a\x17\xfa\xc2\x60\x74\x7c\xbb\x9e\xaa\x5f\xfa\x80\x87\x44\xe4\x85\x7f\x69\x1e\xe1\x30\xdd\xfd\xaf\x30\x62\xab\x09\xb3\xc9\xe0\x7f\x0d\xa1\x5b\x23\x2e\xdf\xc2\x5b\x28\x2d\xf2\x70\x0a\x08\x41\x77\xd3\x9e\x96\xcd\xab\x44\xef\x1a\xc6\xf7\x12\x10\x73\x4c\x48\x18\x0e\x63\xea\xfb\xc1\xc5\xb7\x5f\x54\x92\xfa\xaa\xf0\x90\x2c\x56\xb2\xea\x6d\xd2\x01\x0b\xac\x4f\x8c\x78\x5d\xbf\x01\xc3\x55\x81\x90\x3e\x36\xb4\x07\xa5\x56\x7f\x18\xdd\x36\x41\xf7\xc9\x77\x19\xe2\x7a\xbc\xbd\x7f\xab\x24\x27\x8f\xf4\x1c\x41\x7d\xa6\xf0\x01\x30\xd0\x29\x2a\x19\xa8\x5b\x1e\xb3\x11\x9b\xf3\x9b\x83\x74\x25\xe9\x1c\x39\x0f\x52\x87\x8e\xbe\x05\x2c\x38\xfe\x05\x15\xe4\x46\xd7\x5e\x0a\x6b\x52\xbc\x91\xd4\xf9\xf5\x1f\xe5\x2e\x3c\xc8\x73\x73\xfe\xea\xd1\x05\x62\x02\x82\x5f\x96\x6f\xe9\x8f\xa6\xfa\x76\xbc\x6b\xae\x87\xab\x38\xe6\xb7\x73\xe1\x3f\x99\x84\xd9\xbf\x9d\x29\x71\x6f\xd0\x85\xae\xbd\x6a\x97\x56\x8e\x4b\xd5\x6f\xa6\xd1\x58\x63\xe5\xbf\xa1\x48\xf3\xbd\x52\x0d\xbb\xe0\x0d\xdd\x71\x2f\x0d\xbe\x4a\x64\x9d\x69\x85\x0b\x60\x47\x7b\x94\x8d\xd1\x8d\xcf\xe2\xb6\xf8\xe7\xdf\x70\xd8\x03\x20\xe5\xf3\xee\x7a\x8f\xc6\xc8\x1d\x4e\x97\x6a\xe9\xbb\x96\x65\xfe\x6b\x4e\xee\x4e\x9f\x81\x6f\x61\x34\x59\x96\xcc\x98\x32\x29\x4f\x65\x9f\x65\x39\xaa\x13\xac\x7d\x2d\x63\xe6\x45\x3e\x06\x31\x60\x5e\x06\xb2\x1d\xf8\xfd\xf1\x60\x62\xea\x64\x3b\xed\xfb\x45\x50\x43\xbd\xeb\xa1\xb6\xf3\xe0\x22\x79\xcb\xd8\x6c\x9c\xcc\x1f\x0f\x2d\x24\x4e\xec\x6c\x7a\x2e\x42\x3b\x7d\xb3\x04\xb7\x65\x60\xcb\xaa\x26\x49\x6b\xfa\x05\x41\xe2\xb5\xb8\x40\xfa\x27\xb1\xec\x3f\x7a\x18\xc7\xe3\x45\x65\x85\x33\x11\x96\x54\xb5\xdf\x47\xcf\x68\xf6\x52\x60\x1f\x7a\x90\xd2\xcd\xb7\xb6\x17\xe1\x25\xc0\xcf\x78\x3a\x03\x51\x52\x69\x73\xa1\xd0\xbd\x22\x04\xfc\xb4\xc6\x79\x55\x81\xa4\xc5\xd7\x6e\x0d\x5a\xdd\x1a\x81\x36\xd2\x46\xcb\x6f\x06\xa0\xeb\x56\x93\x3c\xdf\xde\xad\x2b\xdf\x2b\xf1\xff\x17\xd4\xf2\x7a\x4a\x97\xab\x98\x2d\xa2\x8e\xfd\x17\x00\x00\xff\xff\xcb\x7a\x92\x89\xf6\x0e\x00\x00") func templatesClientFacadeGotmplBytes() ([]byte, error) { return bindataRead( @@ -155,12 +142,12 @@ func templatesClientFacadeGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/client/facade.gotmpl", size: 3932, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb9, 0x2e, 0xbf, 0x0, 0xaf, 0xc1, 0xff, 0x75, 0x86, 0x0, 0x51, 0xe9, 0xb9, 0x2d, 0x58, 0x1d, 0x9e, 0xca, 0x82, 0x15, 0xf4, 0xa2, 0x7b, 0x6a, 0x41, 0x12, 0x24, 0x3a, 0x8, 0x5e, 0x5e, 0xa9}} + info := bindataFileInfo{name: "templates/client/facade.gotmpl", size: 3830, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf7, 0xd, 0xcc, 0x4f, 0xcb, 0x4c, 0xff, 0x4a, 0x57, 0x54, 0x9b, 0x29, 0xd, 0x15, 0xd4, 0xe7, 0x30, 0x76, 0x28, 0x32, 0x9b, 0x67, 0xf5, 0x35, 0x68, 0xcd, 0x48, 0x59, 0xa0, 0x7a, 0xef, 0xd3}} return a, nil } -var _templatesClientParameterGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x73\xdb\xb8\x11\x7f\xe7\xa7\xd8\xaa\xee\x55\xf4\x38\xd4\x3d\xfb\x46\x9d\xc9\xd9\xbe\xc6\x9d\x69\xce\x4d\x3c\xd7\x87\x4c\xa6\x03\x93\x2b\x09\x17\x12\xa0\x01\x50\x8a\xaa\xe1\x77\xef\xe0\x0f\x49\x90\x22\x25\x2a\x89\xe3\xcb\x34\x4f\x92\x40\x60\xb1\xfb\xdb\xdf\xfe\x01\xa8\xd9\x0c\xae\x78\x82\xb0\x44\x86\x82\x28\x4c\xe0\x61\x0b\x4b\xfe\x42\x6e\xc8\x72\x89\xe2\x27\xb8\xfe\x15\x5e\xff\x7a\x0f\x37\xd7\xb7\xf7\x51\x10\x04\xbb\x1d\xd0\x05\x44\x57\x3c\xdf\x0a\xba\x5c\x29\x78\x51\x96\xb3\x19\xec\x76\x10\xf3\x2c\x43\xa6\x3a\xcf\x76\x3b\x40\x96\x40\x59\x06\x41\x90\x93\xf8\x03\x59\xa2\x9e\x1c\xdd\xb9\xef\xfa\xc1\x6c\x06\xf7\x2b\x2a\x61\x41\x53\x84\x0d\x91\x6d\x65\xd4\x0a\xc1\x69\x03\x8a\xf3\x34\xd2\xf3\x6f\x12\xaa\x28\x5b\x82\xaa\xd7\x65\x66\xc7\x5c\xf0\x35\xc2\xa2\x50\x46\xd4\x0a\x19\x6c\x79\x01\x02\x5f\x88\x82\xb5\x24\x55\x5b\x18\xb5\x09\x4b\x82\x80\x66\x39\x17\x0a\xa6\x01\xc0\x24\xe6\x4c\xe1\x47\x35\xd1\xdf\x19\xaa\xd9\x4a\xa9\x7c\x12\xe8\x5f\x4b\xaa\x56\xc5\x43\x14\xf3\x6c\xb6\xe4\x2f\x78\x8e\x8c\xe4\x74\x26\x0a\xa6\x68\x86\x93\xe1\x19\x7a\xdf\x03\x8f\x51\x08\x2e\xe4\x81\x09\x6b\x92\xd2\x84\x28\xb3\x45\x2c\x8e\xe8\x31\x8b\x53\x8a\x4c\x19\x8d\xa5\x12\x8b\x4c\x0d\xaa\x65\x9e\x9a\x89\xbb\x1d\x08\xc2\x96\x08\xd1\x35\x2e\x48\x91\xaa\x5b\x03\x88\x04\xe3\xc4\x5c\x50\xa6\x16\x30\xf9\xcb\xe3\x04\xa2\xb2\xb4\xf3\x9d\x67\xbd\xb5\x67\x1f\x70\x7b\x01\x67\x6b\x92\x16\x08\x97\x73\x88\x5a\x42\xf4\x53\x28\x4b\xe8\xc8\x73\xd3\x3b\x52\x43\x43\x8c\xd7\xb8\xd1\xb3\x89\x8c\x49\x4a\xff\x8b\x10\xbd\x26\x99\x9e\x7a\x47\x04\xc9\x24\xc4\x02\x89\x42\x09\x04\x18\x6e\xe0\xd0\x4c\xfe\xf0\x3b\xc6\x4a\x8b\xdc\x50\xb5\x32\x5c\x48\xac\x9d\x60\xb6\x97\x40\x19\x55\xd4\xac\x4d\xa2\x60\x51\xb0\xf8\xc8\xe6\xd3\x10\xce\x0f\xed\xb8\xb3\xe6\xe8\x70\x71\x23\x65\xb9\x26\xc2\x30\xac\x01\xbb\x7e\xe4\xa6\xbe\x22\xd2\xe1\x5f\x8f\x31\xae\x20\xba\x95\xbf\xd0\x14\xcd\x6c\xfb\x60\x4d\x04\xd3\xfb\x45\xb7\xd7\x65\x59\x2d\x99\x57\x3b\xde\xca\x3b\x41\x33\xaa\xe8\x1a\xf5\xec\xe8\xef\xfc\x7e\x9b\x63\x59\x4e\x2d\xc0\x6d\x9f\xfe\x79\x3d\xa9\xbd\xde\x68\xe2\x89\x80\xb2\x0c\x3b\xfe\xb6\xdf\xbd\x2f\x46\x6a\x00\xd0\x9a\x28\x50\x15\x82\xc1\x0f\xfb\x38\x55\x30\xed\x4e\x42\x63\x4f\xc8\xa5\x33\x98\xb0\x04\xa6\x0e\xa8\x97\x42\x90\x6d\x58\xff\xfc\x27\xc9\xab\x1f\x5a\x1c\x95\xb1\x36\x8b\x11\xc5\x45\x08\x53\x2e\xf4\x9c\xd7\x45\x9a\x92\x87\x14\x01\x42\x28\xcb\x1f\x7c\xfb\x3c\x9c\xa1\x06\xfa\xa2\x17\x84\x00\xc0\x0c\xc7\x24\x43\xab\xe4\x3d\xcd\x90\x17\xca\x11\xe3\x12\x62\x51\xe1\xec\x9e\x68\x41\x65\x50\x8e\xe0\xfa\xbf\xa9\x5a\xb9\x45\x4f\x45\xfb\x0b\x03\xa3\x9e\x43\x1e\x68\x4a\xd5\x16\x14\x07\x89\x0a\x08\x28\xb7\x33\x67\x40\x40\xe0\x63\x81\x52\x8d\x09\x12\x4f\xeb\x69\x25\x43\x7f\x46\xd7\x85\x20\x8a\x72\xf6\x3d\x88\x9e\x33\x88\xb4\xd9\xdf\x58\x08\xa9\x4f\x09\x9c\x2b\x5b\xd0\x9f\x21\x70\x5c\x2b\x01\x0b\x2e\x4e\x8f\x1c\xa7\xf6\x34\x56\x1f\x2b\x41\x91\x1b\x7b\xde\xb8\x69\xdc\x63\x69\xf8\x7f\x18\x3a\x5f\xab\xfe\xb4\xa1\x1e\x15\x3f\x8e\x22\x97\x10\xab\x8f\xa7\xc5\xc9\xab\xfb\xfb\xbb\x2b\xd3\x3c\x3e\x47\xa8\x14\x52\xf1\x0c\x3c\x1d\x3e\x29\x68\x9a\xf5\x53\xdb\x07\xc3\xb9\xee\xdf\x23\x3b\xf6\x3d\x6e\xbe\xc7\x4d\x0f\x0e\x0d\x69\x2e\xc1\xb2\xa6\x09\x9c\x83\x84\xd1\x69\x99\x50\x26\x81\xa4\xa9\xa1\x75\xae\xc7\x51\xa1\x90\x96\xd9\x9a\xed\xdc\x3c\x79\x79\x77\xab\x77\xcb\x39\x65\x2a\xd0\xd4\xd6\x83\xbb\x1d\xac\x8a\x8c\x30\x5f\x34\xf0\x1c\x6d\x77\x04\x6a\x9b\xd3\x98\xa4\xa9\x39\x07\x4b\x04\x22\x10\x36\x82\x2a\x85\x4c\x8b\x25\x60\xa8\xfd\xc6\x45\xc8\xf9\x2c\x50\xdb\x1c\x0f\x46\xab\x54\xa2\x88\x15\xec\x82\x7e\x07\x0e\x58\xbb\xdb\x69\xb7\x5e\xa3\x76\x42\x6e\x34\xab\x08\xf5\x90\xf2\xf8\x43\x7d\xf8\xef\xcc\xf0\xb1\x3e\x9f\xd9\x5f\xad\xf6\xc3\x1d\x07\x3f\x87\x09\x6e\xd2\x2d\x53\x28\x16\x24\xc6\x66\xe8\xad\x12\x48\xb2\x01\xb2\x9c\xfb\x24\x18\x0c\x58\x17\x80\x8e\x2a\xa9\xd4\xdf\xdc\x29\xdb\x40\x93\xbc\x41\x92\x5c\xa5\x5c\xa2\x68\x42\xc9\xbb\xf4\x38\xd8\xcc\xb4\x3b\xe1\xa0\x4e\xdc\xdd\x5a\x1f\x80\x9f\x14\xfd\x6c\xe6\x12\xbb\x4e\x7b\x6d\x64\x3b\x1b\x91\x24\x91\x86\x6e\x75\x0f\xce\x87\xd9\x67\x18\x2c\x6d\xba\xd5\x79\x27\x7a\x83\x31\xd2\x35\x8a\x6a\xc2\xa1\x80\x08\x8f\x2a\xf3\x39\xe7\x80\xae\x2a\xd1\x5b\x54\x63\xf6\x0a\x9b\x9c\xd6\x23\xc5\xa1\x78\x44\xd6\x57\x05\x71\xa4\x5d\x5d\x0c\x87\x60\x3a\x44\xc2\x79\x65\x8f\x47\xa6\x8a\x88\xb5\xc9\x55\x1b\xfb\xc4\xbc\xf9\xec\x86\xb7\x8f\x20\x9e\xd0\xb1\x3c\x78\x0e\xfb\xdb\x9a\xee\x9b\x3f\x64\x61\xa5\xeb\x5c\xb7\x7b\x9e\x0f\xbd\x94\x51\x9b\xe1\x8d\x3d\xb1\x27\xbf\x44\x17\xd6\xe7\xcc\x3d\xb9\x63\x5d\xfa\x7c\x70\xf4\x69\xdd\x41\x63\xc8\x60\x4f\xc1\xb9\xeb\x4b\xb4\x45\x3d\x75\xbb\xbf\x0c\xd8\x02\x5b\xdb\xeb\x9f\xc5\xcd\x16\xa6\x08\xed\x5b\x7e\x36\x68\xfa\xd9\x11\xdb\xcf\x8e\x57\x03\xa3\xd3\xb4\x57\x95\x2f\xd3\x09\x7c\xed\xb2\xef\xe4\x75\x39\x7d\xd6\x4f\xea\x3d\x04\xf7\x6b\xd8\x30\x42\x9f\x56\xc7\xf6\x59\xd0\x69\x8e\x9f\x9e\x06\x27\xd8\xf8\xad\xb3\x60\xd0\xcf\x7d\x4e\x99\xf7\xc6\xa4\x8b\x71\xd7\x44\xea\xc8\x16\x54\xe1\x3d\x77\x7d\xbe\x39\x01\xa0\x74\x47\x02\xeb\x1b\x7b\x1a\xa8\x5e\x6f\xb5\x8e\xcc\x9f\x92\xc1\x5b\xfb\x4d\x05\x54\x66\xdb\x64\xe4\xc6\x2f\x40\xe0\xd2\xbd\x61\x8a\xde\xe0\x92\x4a\x25\xb6\x21\x98\x97\x59\xf6\x80\x41\x17\xfa\x17\x5c\xce\x41\x68\x9a\x57\x37\xc1\x27\xb6\x28\xe1\x4f\x46\xca\x9f\xe6\xc0\x68\x6a\xf0\xad\xa3\x00\x85\x30\xe7\x34\xd0\x20\x82\x40\x09\xef\xde\x9b\xfd\x8d\x13\x5a\x49\xb2\x6a\xc7\x9d\xbb\x1d\x2f\x0c\xb5\x1c\xa9\xf4\xc7\xcf\x3c\xd9\x9a\xf9\x61\x7d\xc2\x71\x64\xf4\x49\x64\x49\xf6\x32\x4d\xf9\xe6\x26\xcb\xd5\xf6\x37\x92\x16\xa8\x57\xd0\x85\x09\x4c\xf3\xfb\xe6\x63\x2e\x50\x4a\x7b\x14\xaa\xb5\x87\xea\x24\xdf\xdc\x34\xdc\xca\x7f\x15\x28\xb6\x15\xf3\x02\x80\xd9\x0c\x1e\xf5\x90\x75\xae\x11\x59\xc5\xb8\xb7\xaa\x56\xc7\xde\x51\x3c\x8a\x5e\x9f\x42\x8b\xc9\xd6\x29\x47\x74\x34\x08\x0f\x89\x9b\x1b\xee\xf4\x2c\xd7\x8e\x68\x02\x65\x68\xf9\xe5\x7c\x60\x77\x0f\x97\xc7\xbe\x2b\x03\xb7\x52\x9b\xfe\x0b\x17\x19\x51\x0a\x85\x8b\x53\xff\xf7\x74\x60\xe3\xf0\xa8\x6a\x35\xae\x57\xe6\x22\xca\x17\x1a\xbd\x55\x82\xb2\xe5\x34\x74\x87\xbc\xfa\xa3\x4e\x1e\x1d\x2e\xd4\x48\xf7\x98\xe2\x90\x9e\x4c\x6a\x32\xd4\xb3\xfd\x60\x69\x38\x31\xed\xbe\x80\x75\x52\x2e\x06\xa4\x8f\x8a\x97\x83\xba\x97\xdd\x5b\x23\x0d\x9c\xbb\x5c\x22\x6a\xd5\x66\x6a\x4e\xd4\xaa\x97\xa8\x1d\x83\xea\x95\xc3\xf6\x8c\xf1\x6f\x1f\xfd\xcf\x1b\x87\xf4\x30\xcb\x73\xfd\x7e\x6d\xe9\x38\x3b\x3c\x49\xf2\xe9\x94\x19\xeb\x1b\x0f\xf1\x57\x48\x12\x14\x6d\xcc\x57\x66\x6c\x0c\xea\xde\xea\xef\xb8\x9f\x84\xbb\x96\xea\xa1\x5e\xef\xe9\x77\x09\x7d\xe9\x78\x7c\x92\x6d\xae\x8c\x8c\x53\x17\x5c\x64\xf6\xdf\x2c\x7d\x7e\xdd\xf3\x6c\xad\xc7\x41\xbf\xf6\xf9\xa5\x07\x8b\x0e\x1a\x7e\x8e\xe8\x9a\xd6\xf3\xef\x0f\xe7\xe5\xa0\x31\xe3\x94\xc2\xb5\xf8\xb2\x85\x6b\x48\xdc\xc8\xc2\x35\xb4\x7c\x4c\xe1\x5a\x7c\x4e\xe1\x1a\xd8\x38\x3c\xaa\xda\x93\x14\xae\x1e\x53\x46\x16\xae\x3a\x6e\x86\x79\xd9\x2f\xfc\x09\xea\xd6\xc0\xf7\x53\x5a\xba\xd2\xbf\xd8\xf5\xd2\x83\xed\x1c\xcb\x8e\x4e\x5e\x07\xd9\x78\xe6\x6a\x45\xd3\xe6\xb0\xa1\x1b\x4f\x33\xe2\xb9\xdf\x0d\xf4\xb9\x50\x47\x88\x7d\x8f\xd6\xef\x91\x77\xef\xa5\xf1\xb1\xa6\x1f\x17\xf0\x9f\x0b\x58\x1b\x57\x98\xde\xf7\x94\xb3\x94\x77\x66\xf2\x80\x09\x8f\x26\x63\xe7\xa9\x43\x3a\xce\x81\xe4\x39\xb2\x64\x7a\x60\x92\xcd\x56\x5d\x60\xda\x18\xee\x55\x24\xeb\xd4\x75\x6b\xce\x91\x38\x68\x1d\xfc\x7a\xc4\x36\x53\xc2\x4e\x59\xd0\xbe\x18\xb6\xb1\x8e\xf2\x03\x68\xd7\x00\xb7\xd0\x3f\x09\xed\xfe\xcc\xfb\x07\x53\xec\x77\x4e\x19\x26\x43\xc9\x50\x9f\x52\xa3\x7f\x70\xca\x7e\xde\x5a\xe0\x0f\xd3\x62\xb2\xdb\x45\x57\x3c\x4d\x31\x56\x94\x33\xbb\xa2\x2c\x27\xe1\xe0\x01\xaa\x3e\x3d\x11\x13\xa2\x23\x9a\xa4\x31\xbd\xf6\x90\x4d\x9a\x5d\x51\x74\x6a\x7f\xe1\xd2\x8f\xdf\x63\x54\xa5\x73\xb4\xd6\x23\x12\xed\x93\x28\xed\x1f\x01\xaa\xfe\x7f\x58\x69\x7b\x23\xd5\xac\x49\x38\x4a\x93\x2b\x65\x91\x9b\xbf\xdc\xae\x89\xa0\x24\x11\x34\x06\x22\x96\x45\x86\x4c\xc9\x0b\x90\x94\xc5\x08\x1b\x84\x42\x62\x02\x3e\x59\xac\xc8\x0d\x42\x4c\x98\x7b\xbf\xba\x42\x58\x50\x21\x15\x50\x85\x19\x50\xfb\x57\x5f\xab\x11\x91\x40\xd5\x5f\x9b\xd7\xb3\x7a\x86\x04\xbe\xb0\xef\x6a\x05\xae\x29\x2f\xa4\x15\x69\x17\x58\xc4\x40\xf1\x25\xaa\x15\x0a\x8b\x7a\x8a\x6c\x7a\x00\xca\x10\xfe\x06\x3f\x56\x8d\xd4\xe9\xa7\x9e\x03\x92\xdf\xfd\xf8\x7e\x74\xb7\xd6\xff\x86\x3f\xd8\x7f\x21\x69\x43\xa6\xae\x53\x5e\x09\xd3\xa5\xe9\x6d\xbc\xc2\x8c\xf8\x6f\x54\xbd\x31\x9b\x27\x60\x6a\x98\x50\x8f\xba\x4b\x14\x93\x4b\xc3\xee\x43\x73\xb1\xd2\xff\xa8\x53\x7c\xf7\x2e\xf3\x74\xd2\x19\xd1\xf5\xb5\xfa\xe8\x0e\xfc\xb5\x95\xd3\x2f\xd2\x0b\xff\x11\x01\x2a\xa1\xd5\xa1\x98\x6f\xad\xc3\x85\x23\xb0\x40\xe9\x13\xb5\xb1\x91\x0b\x19\x5d\xf1\x2c\xe7\x92\x2a\xfc\xcd\xfe\xd3\x9c\x72\x76\xa3\x9f\xe8\x55\x3a\x53\x38\x7e\xb9\x45\x8c\xa6\x41\x19\xfc\x2f\x00\x00\xff\xff\x0b\x22\x41\xbc\x3d\x30\x00\x00") +var _templatesClientParameterGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x5f\x73\xdb\xb8\x11\x7f\xe7\xa7\xd8\xaa\xe9\x55\xf4\x38\xd4\x3d\xfb\x46\x9d\xc9\xd9\xb9\xc6\x9d\x69\x2e\x4d\x3c\xd7\x87\x4c\xa6\x03\x93\x2b\x09\x77\x24\x40\x03\xa0\x14\x95\xc3\xef\xde\xc1\x1f\x92\x20\x45\x4a\x54\x12\xc7\x77\xd3\x3c\x59\x04\x81\xc5\xee\x6f\x7f\xfb\x07\xa0\x17\x0b\xb8\xe6\x09\xc2\x1a\x19\x0a\xa2\x30\x81\xfb\x3d\xac\xf9\x73\xb9\x23\xeb\x35\x8a\x1f\xe0\xe6\x67\x78\xfd\xf3\x1d\xbc\xbc\xb9\xbd\x8b\x82\x20\x28\x4b\xa0\x2b\x88\xae\x79\xbe\x17\x74\xbd\x51\xf0\xbc\xaa\x16\x0b\x28\x4b\x88\x79\x96\x21\x53\xbd\x77\x65\x09\xc8\x12\xa8\xaa\x20\x08\x72\x12\xff\x46\xd6\xa8\x27\x47\x6f\xdc\x6f\xfd\x62\xb1\x80\xbb\x0d\x95\xb0\xa2\x29\xc2\x8e\xc8\xae\x32\x6a\x83\xe0\xb4\x01\xc5\x79\x1a\xe9\xf9\x2f\x13\xaa\x28\x5b\x83\x6a\xd6\x65\x66\xc7\x5c\xf0\x2d\xc2\xaa\x50\x46\xd4\x06\x19\xec\x79\x01\x02\x9f\x8b\x82\x75\x24\xd5\x5b\x18\xb5\x09\x4b\x82\x80\x66\x39\x17\x0a\xe6\x01\xc0\x2c\xe6\x4c\xe1\x47\x35\xd3\xbf\x19\xaa\xc5\x46\xa9\xdc\x3c\x28\x9a\xe1\x2c\xd0\xbf\xd6\x54\x6d\x8a\xfb\x28\xe6\xd9\x62\xcd\x9f\xf3\x1c\x19\xc9\xe9\x02\x85\xe0\x42\xce\xc6\x27\x88\x82\x59\x19\x00\xb1\x38\x31\x69\x11\xa7\x14\x99\x3a\x22\x4d\x2a\xb1\xca\x8e\x4e\xd8\x91\xf5\x91\xd7\x5b\x92\xd2\x84\x28\x6b\x92\x76\xad\xc1\x40\x42\x74\x83\x2b\x52\xa4\xea\xd6\x3d\x57\x55\xef\xbd\xf7\x22\x34\x0e\x7c\x8d\xbb\xb2\x84\x9c\xc8\x98\xa4\xf4\xbf\x08\xd1\x6b\x92\x69\xef\xbe\x21\x82\x64\x12\x62\x81\x44\xa1\x04\x02\x0c\x77\x70\x6c\x26\xbf\xff\x15\x63\xa5\x45\xee\xa8\xda\x18\x9f\x25\x56\x19\xd8\x92\xb4\x40\x09\x94\x51\x45\xcd\xda\x24\x0a\x56\x05\x8b\x4f\x6c\x3e\x0f\xe1\xe2\xd8\x8e\xa5\xb3\x6d\xa5\x59\x69\x46\xaa\x6a\x4b\x84\x61\x42\x59\x82\x20\x6c\x8d\xde\x2b\x37\xf5\x15\x91\x0e\xa4\x66\x8c\x71\x05\xd1\xad\xfc\x89\xa6\x68\x66\xdb\x17\x5b\x22\x98\xde\x2f\xba\xbd\xa9\xaa\x7a\xc9\xb2\xde\xf1\x56\xbe\x11\x34\xa3\x8a\x6e\x51\xcf\x8e\xfe\xce\xef\xf6\x39\x56\xd5\xdc\x06\x8e\x91\x90\x0b\xca\xd4\x0a\x66\x7f\xf9\xf3\x76\xd6\xb8\xa6\xd5\xc4\x13\x01\x55\x15\xb6\x11\x67\xd4\xb7\xbf\xbd\x1f\x46\x6a\x00\xd0\x99\x28\x50\x15\x82\xc1\x77\x87\x38\xd5\x30\x95\x67\xa1\x71\x20\xe4\xca\x19\x4c\x58\x02\x73\x07\xd4\x0b\x21\xc8\x3e\x6c\x1e\xff\x49\xf2\xfa\x41\x8b\xa3\x32\xd6\x66\x31\xa2\xb8\x08\x61\xce\x85\x9e\xf3\xba\x48\x53\x72\x9f\x22\x40\x08\x55\xf5\x9d\x6f\x9f\x87\x33\x34\x40\x5f\x0e\x82\x10\x00\x98\xe1\x98\x64\x68\x95\xbc\xa3\x19\xf2\x42\x39\x62\x5c\x41\x2c\x6a\x9c\xdd\x1b\x2d\xa8\x0a\xaa\x09\x5c\xff\x37\x55\x1b\xb7\xe8\xb1\x68\x7f\x69\x60\xd4\x73\xc8\x3d\x4d\xa9\xda\x83\xe2\x20\x51\x01\x01\xe5\x76\xe6\x0c\x08\x08\x7c\x28\x50\xaa\x29\x41\xe2\x69\x3d\xaf\x65\xe8\xbf\xd1\x4d\x21\x88\xa2\x9c\x7d\x0b\xa2\xa7\x0c\x22\x6d\xf6\x1f\x2c\x84\xd4\xa7\x04\xce\xb5\x2d\xbc\x4f\x10\x38\xae\xe4\xc3\x8a\x8b\xf3\x23\xc7\xa9\x3d\x8f\xd5\xc7\x5a\x50\xe4\xc6\x9e\x36\x6e\x5a\xf7\x58\x1a\xfe\x1f\x86\xce\xd7\xaa\x3f\x5d\xa8\x27\xc5\x8f\xa3\xc8\x15\xc4\xea\xe3\x79\x71\xf2\xea\xee\xee\xcd\xb5\xe9\x0e\x9f\x22\x54\x0a\xa9\x78\x06\x9e\x0e\x9f\x14\x34\xed\xfa\xb9\x6d\x74\xe1\x42\xf7\xd9\x91\x1d\xfb\x16\x37\xdf\xe2\x66\x00\x87\x96\x34\x57\x60\x59\xd3\x06\xce\x51\xc2\xe8\xb4\x4c\x28\x93\x40\xd2\xd4\xd0\x3a\xd7\xe3\xa8\x50\x48\xcb\x6c\xcd\x76\x6e\xde\xbc\x78\x73\xab\x77\xcb\x39\x65\x2a\xd0\xd4\xd6\x83\x65\x09\x9b\x22\x23\xcc\x17\x0d\x3c\x47\xdb\x1d\x81\xda\xe7\x34\x26\x69\x6a\xce\xab\x12\x81\x08\x84\x9d\xa0\x4a\x21\xd3\x62\x09\x18\x6a\xbf\x75\x11\x72\xb1\x08\xd4\x3e\xc7\xa3\xd1\x2a\x95\x28\x62\x05\x65\x30\xec\xc0\x11\x6b\xcb\x52\xbb\xf5\x06\xb5\x13\x72\xa3\x59\x4d\xa8\xfb\x94\xc7\xbf\x35\x87\xf4\xde\x0c\x1f\xeb\x8b\x85\x7d\xea\xb4\x1f\xda\xda\xcf\x64\x82\x9b\x74\xcb\x14\x8a\x15\x89\xb1\x1d\x7a\xa7\x04\x92\x6c\x84\x2c\x17\x3e\x09\x46\x03\xd6\x05\xa0\xa3\x4a\x2a\xf5\x2f\x77\x8c\x36\xd0\x24\x6f\x91\x24\xd7\x29\x97\x28\xda\x50\xf2\x2e\x27\x8e\x36\x33\xdd\x4e\x38\x68\x12\x77\xbf\xd6\x07\xe0\x27\x45\x3f\x9b\xb9\xc4\xae\xd3\x5e\x17\xd9\xde\x46\x24\x49\xa4\xa1\x5b\xd3\x83\xf3\x71\xf6\x19\x06\x4b\x9b\x6e\x75\xde\x89\xde\x62\x8c\x74\x8b\xa2\x9e\x70\x2c\x20\xc2\x93\xca\x7c\xce\x39\xa0\xaf\x4a\xf4\x0e\xd5\x94\xbd\xc2\x36\xa7\x0d\x48\x71\x28\x9e\x90\xf5\x55\x41\x9c\x68\x57\x1f\xc3\x31\x98\x8e\x91\x70\x59\xdb\xe3\x91\xa9\x26\x62\x63\x72\xdd\xc6\x3e\x32\x6f\x3e\xbb\xe1\x1d\x22\x88\x27\x74\x2a\x0f\x9e\xc2\xfe\xae\xa6\x87\xe6\x8f\x59\x58\xeb\xba\xd4\xed\x9e\xe7\x43\x2f\x65\x34\x66\x78\x63\x8f\xec\xc9\x2f\xd1\x85\x0d\x39\xf3\x40\xee\x54\x97\x3e\x1d\x1c\x43\x5a\xf7\xd0\x18\x33\xd8\x53\x70\xe9\xfa\x12\x6d\xd1\x40\xdd\x1e\x2e\x03\xb6\xc0\x36\xf6\xfa\x67\x71\xb3\x85\x29\x42\x87\x96\x3f\x1b\x35\xfd\xd9\x09\xdb\x9f\x9d\xae\x06\x46\xa7\xf9\xa0\x2a\x5f\xa6\x13\xf8\xda\x65\xdf\xc9\xeb\x73\xfa\xd9\x30\xa9\x0f\x10\x3c\xac\x61\xe3\x08\x7d\x5a\x1d\x3b\x64\x41\xaf\x39\x7e\x7c\x1a\x9c\x61\xe3\x1f\x9d\x05\xa3\x7e\x1e\x72\xca\x72\x30\x26\x5d\x8c\xbb\x26\x52\x47\xb6\xa0\x0a\xef\xb8\xeb\xf3\xcd\x09\x00\xa5\x3b\x12\x58\xdf\xd8\xd3\x40\xfd\x19\xaa\x73\x64\xfe\x94\x0c\xde\xd9\x6f\x2e\xa0\x36\xdb\x26\x23\x37\x7e\x09\x02\xd7\x60\x3f\x16\x45\x6f\x71\x4d\xa5\x12\xfb\x10\xcc\xc7\x2a\x7b\xc0\xa0\x2b\xfd\x04\x57\x4b\x10\x9a\xe6\xf5\x4d\xf0\x99\x2d\x4a\xf8\x83\x91\xf2\xa7\x25\x30\x9a\x1a\x7c\x9b\x28\x40\x21\xcc\x39\x0d\x34\x88\x20\x50\xc2\xfb\x0f\x66\x7f\xe3\x84\x4e\x92\xac\xdb\x71\xe7\x6e\xc7\x0b\x43\x2d\x47\x2a\xfd\xe7\x47\x9e\xec\xcd\xfc\xb0\xfd\x3a\x65\xc9\xe8\x93\xc8\x92\xec\x45\x9a\xf2\xdd\xcb\x2c\x57\xfb\x5f\x48\x5a\xa0\x5e\x41\x57\x26\x30\xcd\xf3\xcb\x8f\xb9\x40\x29\xed\x51\xa8\xd1\x1e\xea\x93\x7c\x7b\xd3\x70\x2b\xff\x55\xa0\xd8\xd7\xcc\x0b\x00\x16\x0b\x78\xd0\x43\xd6\xb9\x46\x64\x1d\xe3\xde\xaa\x46\x1d\x7b\x47\xf1\x20\x06\x7d\x0a\x1d\x26\x5b\xa7\x9c\xd0\xd1\x20\x3c\x26\x6e\x69\xb8\x33\xb0\x5c\x3b\xa2\x0d\x94\xb1\xe5\x57\xcb\x91\xdd\x3d\x5c\x1e\x86\xae\x0c\xdc\x4a\x6d\xfa\x4f\x5c\x64\x44\x29\x14\x2e\x4e\xfd\xe7\xf9\xc8\xc6\xe1\x49\xd5\x1a\x5c\xaf\xcd\x45\x94\x2f\x34\x7a\xa7\x04\x65\xeb\x79\xe8\x0e\x79\xcd\x9f\x26\x79\xf4\xb8\xd0\x20\x3d\x60\x8a\x43\x7a\x36\x6b\xc8\xd0\xcc\xf6\x83\xa5\xe5\xc4\xdc\xbf\xf4\x79\x98\x35\x52\x2e\x47\xa4\x4f\x8a\x97\xa3\xba\x57\xfd\x5b\x23\x0d\x9c\xbb\x5c\x22\x6a\xd3\x65\x6a\x4e\xd4\x66\x90\xa8\x3d\x83\x9a\x95\xe3\xf6\x4c\xf1\xef\x10\xfd\x2f\x5a\x87\x0c\x30\xcb\x73\xfd\x61\x6d\xe9\x39\x3b\x3c\x4b\xf2\xf9\x94\x99\xea\x1b\x0f\xf1\x57\x48\x12\x14\x5d\xcc\x37\x66\x6c\x0a\xea\xde\xea\x6f\xb8\x9f\x85\xbb\x96\xea\xa1\xde\xec\xe9\x77\x09\x43\xe9\x78\x7a\x92\x6d\xaf\x8c\x8c\x53\x57\x5c\x64\xf6\xbf\x4e\x86\xfc\x7a\xe0\xd9\x46\x8f\xa3\x7e\x1d\xf2\xcb\x00\x16\x3d\x34\xfc\x1c\xd1\x37\xad\x7b\xc5\xd5\xa2\x56\x73\xd3\x98\x71\x4e\xe1\x5a\x7d\xd9\xc2\x35\x26\x6e\x62\xe1\x1a\x5b\x3e\xa5\x70\xad\x3e\xa7\x70\x8d\x6c\x1c\x9e\x54\xed\x51\x0a\xd7\x80\x29\x13\x0b\x57\x13\x37\xe3\xbc\x1c\x16\xfe\x08\x75\x6b\xe4\xf7\x39\x2d\x5d\xe5\x5f\xec\x7a\xe9\xc1\x76\x8e\x55\x4f\x27\xaf\x83\x6c\x3d\x73\xbd\xa1\x69\x7b\xd8\xd0\x8d\xa7\x19\xf1\xdc\xef\x06\x86\x5c\xa8\x23\xc4\x7e\x47\x1b\xf6\xc8\xfb\x0f\xd2\xf8\x58\xd3\x8f\x0b\xf8\xcf\x25\x6c\x8d\x2b\x4c\xef\x7b\xce\x59\xca\x3b\x33\x79\xc0\x84\x27\x93\xb1\xf3\xd4\x31\x1d\x97\x40\xf2\x1c\x59\x32\x3f\x32\xc9\x66\xab\x3e\x30\x5d\x0c\x0f\x2a\x92\x75\xea\xb6\x33\xe7\x44\x1c\x74\x0e\x7e\x03\x62\xdb\x29\x61\xaf\x2c\x68\x5f\x8c\xdb\xd8\x44\xf9\x11\xb4\x1b\x80\x3b\xe8\x9f\x85\xf6\x70\xe6\xfd\x9d\x29\xf6\x2b\xa7\x0c\x93\xb1\x64\xa8\x4f\xa9\xd1\x3f\x38\x65\x3f\xee\x2d\xf0\xc7\x69\x31\x2b\xcb\xe8\x9a\xa7\x29\xc6\x8a\x72\x66\x57\x54\xd5\x2c\x1c\x3d\x40\x35\xa7\x27\x62\x42\x74\x42\x93\x34\xa5\xd7\x1e\xb3\x49\xb3\x2b\x8a\xce\xed\x2f\x5c\xfa\xf1\x7b\x8c\xba\x74\x4e\xd6\x7a\x42\xa2\x7d\x14\xa5\xfd\x23\x40\xdd\xff\x8f\x2b\x6d\x6f\xa4\xda\x35\x09\x47\x69\x72\xa5\x2c\x72\xf3\xaf\xb1\x5b\x22\x28\x49\x04\x8d\x81\x88\x75\x91\x21\x53\xf2\x12\x24\x65\x31\xc2\x0e\xa1\x90\x98\x80\x4f\x16\x2b\x72\x87\x10\x13\xe6\xbe\xaf\x6e\x10\x56\x54\x48\x05\x54\x61\x06\xd4\xfe\x4b\xae\xd5\x88\x48\xa0\xea\xaf\xed\xe7\x59\x3d\x43\x02\x5f\xd9\x6f\xb5\x02\xb7\x94\x17\xd2\x8a\xb4\x0b\x2c\x62\xa0\xf8\x1a\xd5\x06\x85\x45\x3d\x45\x36\x3f\x02\x65\x08\x7f\x83\xef\xeb\x46\xea\xfc\x53\xcf\x11\xc9\xef\xbf\xff\x30\xb9\x5b\x1b\xfe\xc2\x1f\x1c\x7e\x90\xb4\x21\xd3\xd4\x29\xaf\x84\xe9\xd2\xf4\x2e\xde\x60\x46\xfc\x2f\xaa\xde\x98\xcd\x13\x30\x37\x4c\x68\x46\xdd\x25\x8a\xc9\xa5\x61\xff\xa5\xb9\x58\x19\x7e\xd5\x2b\xbe\x07\x97\x79\x3a\xe9\x4c\xe8\xfa\x3a\x7d\x74\x0f\xfe\xc6\xca\xf9\x17\xe9\x85\x7f\x8f\x00\x55\xd0\xe9\x50\xcc\xaf\xce\xe1\xc2\x11\x58\xa0\xf4\x89\xda\xda\xc8\x85\x8c\xae\x79\x96\x73\x49\x15\xfe\x62\xff\x77\x9b\x72\xf6\x52\xbf\xd1\xab\x74\xa6\x70\xfc\x72\x8b\x18\x4d\x83\x2a\xf8\x5f\x00\x00\x00\xff\xff\x42\x0a\x05\x41\xe5\x2f\x00\x00") func templatesClientParameterGotmplBytes() ([]byte, error) { return bindataRead( @@ -175,12 +162,12 @@ func templatesClientParameterGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/client/parameter.gotmpl", size: 12349, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf8, 0xe8, 0x6f, 0x8f, 0xfc, 0x7e, 0xc1, 0xb6, 0xd8, 0x28, 0x41, 0x7d, 0x34, 0x8, 0x3c, 0xe3, 0xaa, 0x53, 0x5c, 0x7b, 0x67, 0x78, 0x8e, 0x81, 0x74, 0x3e, 0x4a, 0x36, 0x3e, 0x43, 0xd8, 0x34}} + info := bindataFileInfo{name: "templates/client/parameter.gotmpl", size: 12261, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x90, 0xd8, 0x41, 0xd2, 0x6, 0xe3, 0x24, 0x53, 0x68, 0xa4, 0xc6, 0xcc, 0x6d, 0xa3, 0x61, 0xd3, 0x49, 0x4e, 0xe2, 0x3d, 0xf3, 0x9b, 0x1e, 0x12, 0x19, 0xf, 0xd3, 0xd4, 0x4c, 0x37, 0x6f, 0x72}} return a, nil } -var _templatesClientResponseGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x59\xcd\x73\xdc\xb6\x15\x3f\x17\x7f\xc5\x2b\x6b\x7b\x96\xea\x8a\x9b\xf4\xa8\x8c\x0e\x89\xac\x38\x3a\xc4\xd6\x48\xee\xf4\x90\xc9\x74\x60\xf2\xed\x2e\x2a\x12\x60\x00\x50\x9b\x2d\x87\xff\x7b\x07\x1f\x24\xc1\x25\xb8\x92\xdb\x53\xe3\x8b\xb9\xf8\x78\x9f\xbf\xf7\xf0\x03\xd4\xb6\x50\xe0\x96\x71\x84\x24\x2f\x19\x72\x2d\x51\xd5\x82\x2b\x4c\xa0\xeb\x36\x1b\xf8\x88\x87\xb6\x85\x9a\xaa\x9c\x96\xec\xdf\x08\xd9\x47\x5a\x21\x74\x1d\xe4\x12\xa9\x46\x05\x14\xe2\xf3\x07\xa6\xf7\x46\x34\x6d\x4a\x0d\x7b\xa4\x05\x4a\x05\xcf\xb4\x6c\x50\x91\x6d\xc3\xf3\x45\xc9\xab\xb6\x05\xb6\x05\xfc\x0d\xb2\x1b\x51\x20\x5c\x7e\x0b\x5d\x97\x9b\x2f\xc6\x75\xdb\x02\xf2\x02\xba\xce\x2d\xca\x1e\xf3\x3d\x56\x74\xf8\x4d\x79\x01\xab\x60\x67\xda\xaf\xc8\xee\xd4\xa3\x96\x48\x2b\xe8\xba\x35\xb4\x2d\xf2\xe2\x44\x46\xb8\xe2\x20\x99\x46\x09\x4c\x64\xff\xb0\x5f\xa1\x56\xf7\x91\xc2\x45\xdc\xed\x96\x00\x48\xd4\x8d\xe4\xf0\x2e\xba\xc2\x2c\x00\x88\xf9\xf8\x4f\xa5\xa9\x6e\x94\x19\xb8\x02\xe3\xf0\xba\x5f\x3a\x28\x97\x94\xef\x10\xb2\x9f\x7c\x38\x07\x17\x7e\xa2\xea\xbd\x0f\xb5\x1d\x9b\xab\xbd\xb2\x69\x92\x8c\xeb\x2d\x24\x6f\xff\xf2\x9c\x40\x36\xee\x98\x2b\x3a\x17\xe4\x48\xc0\xee\xe9\xb1\x14\xb4\xb8\x02\x17\xb9\x25\x79\x1d\xe9\x08\xd9\x44\x22\xd7\x75\xb0\xa7\xbc\x28\x51\x81\xde\x33\x05\x39\x55\x18\x43\x90\x07\x50\x46\x88\x37\xe5\x3d\xaa\x5c\xb2\x5a\x33\xc1\x9d\xa2\x2f\xa5\xc8\x9f\x72\x51\x55\xc8\xf5\x7c\x1a\x4b\x85\x0b\x01\x32\xe6\xee\x9b\x8a\xf2\x49\xb2\x1c\x50\xc8\xc5\x86\xe8\x63\x8d\x0b\x50\x57\x5a\x36\xb9\xb6\xa9\x8f\xe5\x95\x00\x04\xa9\x35\x28\x26\xe4\x75\x69\x9d\x9a\x6f\x03\x77\xce\x3f\x02\x70\xb1\x19\xe4\x3a\x1d\x71\x47\xb3\x0f\xe2\xb3\xf1\xa7\x5f\x15\xee\x98\x64\x9c\x00\xf8\xdc\x42\x50\x61\x5c\xe8\x00\x05\x3f\x50\x85\x46\x5a\x7a\x3a\x71\xc7\x35\xca\x2d\xcd\x31\x2c\xc3\x1b\x51\xd5\x25\xfe\xfe\xe9\xcb\xbf\x30\xd7\xa7\x3b\x1c\xa0\x52\xe8\xba\x8b\x13\x10\x2e\x2e\x34\xde\xf8\xe1\xc1\x29\xb3\xb7\x54\xe6\x2b\x28\x61\x97\xc9\xd0\xdd\x2e\x9a\x2d\xb2\xd9\x80\xfd\xb9\x43\x6d\xe0\x88\xe0\x92\x67\x4b\x12\xb6\x42\xda\xb1\x18\x5a\xa0\xef\x9d\xae\xc1\x99\x46\x96\x3d\x60\x8e\xec\x19\x65\xbf\x24\xde\x36\x52\xab\x71\x95\x1a\x70\x84\x2d\x24\x22\x21\x0b\xb0\x44\x3a\x32\x7a\x43\xfe\x0b\xad\xb7\x52\x0a\xb9\x4a\x0d\x82\x19\xdf\x41\x4b\xfe\xe4\x15\x6f\x2b\x9d\x3d\xba\x76\xb1\x4a\x7e\x69\x5b\x68\xea\x1a\x25\x64\x3f\xa3\xde\x8b\xa2\x47\xd1\x3d\xd5\x7b\xe8\xba\x5f\x7f\x79\x5b\xfc\xda\x43\x67\xa8\x9c\x09\xe0\x7c\x3a\x1a\xfe\xc4\xc5\x81\x03\x1a\xbd\xb0\xd8\x67\xe0\xed\x5f\x9f\x87\xc9\x64\x1d\xad\xaa\x17\x42\x33\xea\x34\x0b\xed\xb6\x33\x8d\x6d\x0d\x22\xf3\x38\x1f\x5b\xbc\x69\x56\xb3\x7a\xf8\xfa\x18\x7f\x40\xed\x45\xaf\xd2\x3f\x46\x11\x05\x38\x19\xc2\x36\x85\xe2\xd7\x47\x49\x22\x2d\x1e\x7c\xf9\xac\xfa\x3a\x02\xd9\x70\xcd\x2a\xcc\x6e\x2c\x35\xe9\xe7\xd7\x90\x0b\xae\x9a\x0a\xe5\xb8\xc0\x0f\xac\x4d\x81\x56\x54\x2b\x03\x69\x03\xe2\x07\xdc\x31\xa5\xe5\x31\xed\x31\xe7\x3a\xc0\xac\xe3\x12\x80\xcd\x66\x28\xe0\xfe\xb8\x69\x5b\x7f\x3c\xd9\x5d\x06\x09\x37\x82\x3f\xa3\x34\xec\xc0\x46\x28\xa7\x15\x4e\x3c\x59\x1b\x3d\x70\x75\x0d\x0e\x76\xe3\xe2\xc1\xa9\xec\x03\x6a\xa7\x77\x95\x04\x55\x92\xa4\x29\x01\x0b\x73\x29\xe1\xcf\xd7\xc0\x59\x09\x8e\x2b\xf8\x50\x5b\xfb\x55\x76\xc7\x9f\x69\xc9\x0a\x93\xa4\x55\x50\x83\x6b\x48\x9c\xcd\xc9\x1a\x92\x49\x87\x4f\xd6\xf0\x2a\xd5\xbe\x37\xce\x8a\x2a\x7e\x88\x58\x07\x67\xde\xfb\xf6\x6a\x60\x63\x82\x75\xa7\x6e\x1a\xa5\x45\xf5\xa3\xcd\x89\x8b\x83\x5b\xb2\x1c\x37\x9f\xbf\xec\x9e\x4a\x65\x3d\x1c\x48\xcb\x6f\x09\x64\x8f\x07\xba\xdb\xa1\x74\x02\xed\xb6\x3f\x5a\x58\x2f\x56\xb1\xf0\x64\xab\x8b\x89\x76\x2b\xda\x87\x3a\xde\x0b\x97\xe4\xbf\x68\xb4\x15\x3c\x3f\x2c\xa3\xdc\xe0\x94\x10\xf6\x5d\x6c\x5e\x50\xb5\x67\x11\x54\x99\x33\xce\x75\x34\x30\x9c\x8a\x40\x3f\x17\x96\x8e\x16\xf7\x34\x7f\xa2\x3b\xb4\x66\x65\x3f\x8b\x02\x4b\xe5\x87\x8c\x77\x7f\xe7\x15\x95\x6a\x4f\xcb\xb6\xb5\x87\x57\xdd\xcf\x9d\xb4\xb1\xd5\x79\x49\x69\x84\xd4\x7e\x2f\x25\x3d\x76\xdd\x63\xc9\x72\x1c\xdc\x1f\xab\xf7\x07\x51\x1c\x57\xe9\xd8\x82\x5e\x86\xd7\x19\x10\xf4\xdc\xea\xba\x8f\xc1\x49\x01\x2d\x34\xfc\xee\x65\x79\x1c\x0f\xab\x58\x57\x4f\x4f\xa8\x27\xdb\x42\xfc\x20\x5a\x4c\xe1\xe8\xef\xd5\xf5\x10\x85\xbe\x01\xcf\xe3\x34\xea\x58\x09\xb9\xe8\x51\xec\x50\x7a\xe7\xec\x8c\xc3\xdb\x7b\x9a\x7e\x17\x46\xfe\xdd\xbb\xfe\x17\x13\xd9\xed\xa7\x1f\xcf\xa4\xe2\xe4\x66\x32\x52\x2e\xce\xca\xf0\x2c\x1b\xc9\x20\x47\x49\x35\x16\xf0\xe5\x08\x3b\x71\xa9\x5c\x23\xfa\x0e\xde\x7f\x82\x8f\x9f\x3e\xc3\xed\xfb\xbb\xcf\x19\x19\x08\xc3\x8d\xa8\x8f\x92\xed\xf6\x1a\x2e\xad\x0c\x53\xd3\x3d\x69\x9f\xcc\x85\xfc\xad\xf6\xa8\x74\xfd\xa7\xc7\xba\x25\xa4\x9f\xcd\xad\x68\xcb\x4a\x84\x03\x55\x53\x63\x2c\x43\x75\xd6\x80\x16\xa2\xcc\xcc\xfa\xdb\x82\x69\xc3\xe8\xf4\xb0\xaf\xb2\x1a\x6b\x29\x9e\x11\xb6\x8d\xb6\xa2\xf6\xc8\xe1\x28\x1a\x90\x78\x29\x1b\x3e\x91\xd4\xab\xb0\x66\x53\x5e\x10\x42\x58\x55\x0b\xa9\x61\x45\x00\x12\x26\x12\xf3\x1f\x47\xbd\xd9\x6b\x5d\x27\xe6\x46\x93\xec\x98\xde\x37\x5f\xb2\x5c\x54\x9b\x9d\xb8\x14\x35\x72\x5a\xb3\x8d\x3f\xa2\x93\xe5\x15\x46\xe7\x99\x69\xd7\xa1\xcf\x2c\xb0\x9d\x9b\xea\x73\x2a\x06\x23\x08\x78\x66\xb0\x68\x8c\x9d\x4d\xc8\x84\x27\xf8\xab\xf2\x9d\x8d\x80\xbf\xa0\x4d\xce\xa5\x58\xb3\x74\x7b\xdf\x3c\xe1\x71\x0d\x6f\xec\xc5\xd5\x54\x4c\x36\x11\x62\x66\x3d\x45\x0e\xe5\xf9\xe5\x27\x52\x53\x0b\x85\x68\x63\x7f\x70\x7c\x85\x29\xa0\xe0\xbf\x83\x9b\xca\xe2\x9d\xb5\x91\x98\x9d\xb9\xd9\x7a\x49\xc1\xfd\x76\x81\x5d\x8d\xcf\x10\xae\x7c\x19\xdf\xf5\x64\xcd\x39\xe1\x5f\x54\x22\x4f\x2a\xc4\x01\xfc\x21\xe0\x7f\x96\x0c\x1a\x4f\x14\xca\x67\x43\xf2\xfa\x71\xc6\xb5\xb0\x3e\x49\xd7\x0d\x8a\x68\x13\xfc\x6a\xf6\xe9\xdc\x4c\x27\x36\xfc\x0f\x1c\x34\x85\xd5\x70\xc4\xb5\x8e\xd8\x08\x99\x7a\xe6\x79\x69\x03\xd5\x4b\x51\x36\x38\xea\xc0\x74\xbe\x1f\x4f\x66\x7f\x17\xec\x37\x04\x98\xba\xec\x01\x39\x08\x70\x33\xe0\x5e\x4c\x82\xab\xce\x95\x1d\x35\x5d\x4d\x35\xa5\x36\xc0\x7b\xe1\xbd\xed\x15\xaf\x3c\x06\xaf\xb3\x68\x1f\x96\x5e\xc8\xbc\x01\xe3\x59\xe1\x4c\xc9\xa2\x4c\x7f\x0c\xa7\x3d\x31\xe6\x6a\x3c\xf0\xa6\xfd\xbe\xf5\x3a\xc2\xe6\xbd\xf6\x7d\xde\xfc\xeb\xc8\x64\xd6\x3b\x76\xa7\x1e\x9b\x3c\x47\x65\x62\xe7\x6c\x5a\x9b\x8d\xfd\xeb\x90\x95\xe1\xc6\x43\x1e\x74\x92\x07\xf7\x3c\x63\xbb\xc2\x14\xe9\x6e\xda\xbe\x5d\x2d\x2d\x18\x24\xbc\x39\x01\x02\xf4\xcf\x5d\x57\xc1\xba\x41\xed\x2b\xd3\x79\x02\xa3\x57\x67\x77\x21\xf0\xff\x0f\xf9\x65\xdb\x59\xf1\x6c\xe0\xdb\x6f\xbe\x81\xeb\x6b\xf8\xdb\x5c\x4a\x90\xf4\x38\x50\x02\x08\x90\x59\x1a\xec\x8f\x32\x4c\xf7\x2b\x52\x19\x49\x64\xa0\xc9\x37\x90\x8f\x78\xf8\xfe\xfe\xce\xbd\xc9\x24\x93\xa7\x92\xe0\xb2\xb1\x3e\x75\x35\x5d\x82\xe7\xd4\xa0\x13\x14\xbb\xb7\x8d\x58\x37\x31\xec\x1b\xab\xba\x34\x87\xff\xec\x6f\x02\x99\x5f\xe1\xa5\x0c\xef\x94\x33\x9c\x9f\x97\x12\xdf\xd0\x13\xa1\xd1\xb0\xdb\xdf\xb5\xa4\x0e\xaa\xd6\xb6\xd8\xdb\xb1\x3f\x3e\x47\x6d\x85\xc8\xdd\x7b\x96\x37\xd7\x53\x9a\xab\xca\x50\x7f\x08\xee\x3a\xe4\x62\x33\xb5\x53\x59\x4d\x33\x2f\xff\x13\x00\x00\xff\xff\x72\xd1\x45\xae\x24\x19\x00\x00") +var _templatesClientResponseGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x58\xcd\x72\xe4\xb6\x11\x3e\x07\x4f\xd1\x61\xbc\x5b\x43\x65\xc4\xb1\x73\x94\x4b\x07\x5b\x2b\xaf\x75\xf0\xae\x4a\xda\x54\x0e\x2e\x57\x0a\x22\x7b\x66\x90\x25\x01\x1a\x00\x35\x9e\xb0\xf8\xee\x29\xfc\x90\x04\x87\xe0\x48\x9b\x9c\xb2\xba\x68\x08\x34\xba\xd1\xdd\x5f\x7f\x68\xa0\x6d\xa1\xc0\x2d\xe3\x08\x49\x5e\x32\xe4\x5a\xa2\xaa\x05\x57\x98\x40\xd7\x6d\x36\xf0\x01\x0f\x6d\x0b\x35\x55\x39\x2d\xd9\xbf\x11\xb2\x0f\xb4\x42\xe8\x3a\xc8\x25\x52\x8d\x0a\x28\xc4\xe7\x0f\x4c\xef\x8d\x6a\xda\x94\x1a\xf6\x48\x0b\x94\x0a\x9e\x69\xd9\xa0\x22\xdb\x86\xe7\x8b\x9a\x57\x6d\x0b\x6c\x0b\xf8\x3b\x64\x37\xa2\x40\xb8\xfc\x0e\xba\x2e\x37\xbf\x18\xd7\x6d\x0b\xc8\x0b\xe8\x3a\x27\x94\x3d\xe6\x7b\xac\xe8\xf0\x4d\x79\x01\xab\x60\x65\xda\x4b\x64\x77\xea\x51\x4b\xa4\x15\x74\xdd\x1a\xda\x16\x79\x71\xa2\x23\x94\x38\x48\xa6\x51\x02\x13\xd9\x3f\xec\xaf\xd0\xaa\xfb\x91\xc2\x45\xdc\xed\x96\x00\x48\xd4\x8d\xe4\xf0\x36\x2a\x61\x04\x00\x62\x3e\xfe\x53\x69\xaa\x1b\x65\x06\xae\xc0\x38\xbc\xee\x45\x07\xe3\x92\xf2\x1d\x42\xf6\xb3\x0f\xe7\xe0\xc2\xcf\x54\xbd\xf3\xa1\xb6\x63\x73\xb3\x57\x36\x4d\x92\x71\xbd\x85\xe4\xcd\x5f\x9e\x13\xc8\xc6\x15\x73\x43\xe7\x82\x1c\x09\xd8\x3d\x3d\x96\x82\x16\x57\xe0\x22\xb7\xa4\xaf\x23\x1d\x21\x9b\x48\xe4\xba\x0e\xf6\x94\x17\x25\x2a\xd0\x7b\xa6\x20\xa7\x0a\x63\x08\xf2\x00\xca\x08\xf1\x5b\x79\x87\x2a\x97\xac\xd6\x4c\x70\x67\xe8\xa9\x14\xf9\xe7\x5c\x54\x15\x72\x3d\x9f\xc6\x52\xe1\x42\x80\xcc\x76\xf7\x4d\x45\xf9\x24\x59\x0e\x28\xe4\x62\x43\xf4\xb1\xc6\x05\xa8\x2b\x2d\x9b\x5c\xdb\xd4\xc7\xf2\x4a\x00\x82\xd4\x1a\x14\x13\xf2\xba\xb4\x4e\xb7\x6f\x03\x77\xce\x3f\x02\x70\xb1\x19\xf4\x3a\x1b\x71\x47\xb3\xf7\xe2\x93\xf1\xa7\x97\x0a\x57\x4c\x32\x4e\x00\x7c\x6e\x21\xa8\x30\x2e\x74\x80\x82\x1f\xa9\x42\xa3\x2d\x3d\x9d\xb8\xe3\x1a\xe5\x96\xe6\x18\x96\xe1\x8d\xa8\xea\x12\xff\xf8\xf8\xf4\x2f\xcc\xf5\xe9\x0a\x07\xa8\x14\xba\xee\xe2\x04\x84\x8b\x82\xc6\x1b\x3f\x3c\x38\x65\xd6\x96\xca\xfc\x0a\x4a\xd8\x65\x32\x74\xb7\x8b\x66\x8b\x6c\x36\x60\x3f\x77\xa8\x0d\x1c\x11\x5c\xf2\x6c\x49\xc2\x56\x48\x3b\x16\x43\x0b\xf4\xdc\xe9\x08\xce\x10\x59\xf6\x80\x39\xb2\x67\x94\xbd\x48\x9c\x36\x52\x6b\x71\x95\x1a\x70\x84\x14\x12\xd1\x90\x05\x58\x22\x1d\x19\xbd\x21\xff\x85\xd5\x5b\x29\x85\x5c\xa5\x06\xc1\x8c\xef\xa0\x25\x7f\xf2\x86\xb7\x95\xce\x1e\x1d\x5d\xac\x92\x5f\xdb\x16\x9a\xba\x46\x09\xd9\x2f\xa8\xf7\xa2\xe8\x51\x74\x4f\xf5\x1e\xba\xee\xb7\x5f\xdf\x14\xbf\xf5\xd0\x19\x2a\x67\x02\x38\x9f\x8e\x86\x7f\xe6\xe2\xc0\x01\x8d\x5d\x58\xe4\x19\x78\xf3\xd7\xe7\x61\x32\x59\x47\xab\xea\x85\xd0\x8c\x36\x8d\xa0\x5d\x76\x86\xd8\xd6\x20\x32\x8f\xf3\x91\xe2\x0d\x59\xcd\xea\xe1\xcb\x63\xfc\x1e\xb5\x57\xbd\x4a\xbf\x8e\x22\x0a\x70\x32\x84\x6d\x0a\xc5\x2f\x8f\x92\x44\x5a\x3c\xf8\xf2\x59\xf5\x75\x04\xb2\xe1\x9a\x55\x98\xdd\xd8\xd6\xa4\x9f\x5f\x43\x2e\xb8\x6a\x2a\x94\xa3\x80\x1f\x58\x9b\x02\xad\xa8\x56\x06\xd2\x06\xc4\x0f\xb8\x63\x4a\xcb\x63\xda\x63\xce\x31\xc0\x8c\x71\x09\xc0\x66\x33\x14\x70\x7f\xdc\xb4\xad\x3f\x9e\xec\x2a\x83\x84\x1b\xc1\x9f\x51\x9a\xee\xc0\x46\x28\xa7\x15\x4e\x3c\x59\x1b\x3b\x70\x75\x0d\x0e\x76\xa3\xf0\xe0\x54\xf6\x1e\xb5\xb3\xbb\x4a\x82\x2a\x49\xd2\x94\x80\x85\xb9\x94\xf0\xe7\x6b\xe0\xac\x04\xd7\x2b\xf8\x50\xdb\xfd\xab\xec\x8e\x3f\xd3\x92\x15\x26\x49\xab\xa0\x06\xd7\x90\xb8\x3d\x27\x6b\x48\x26\x0c\x9f\xac\xe1\x55\xa6\x3d\x37\xce\x8a\x2a\x7e\x88\x58\x07\x67\xde\x7b\x7a\x35\xb0\x31\xc1\xba\x53\x37\x8d\xd2\xa2\xfa\xc9\xe6\xc4\xc5\xc1\x89\x2c\xc7\xcd\xe7\x2f\xbb\xa7\x52\x59\x0f\x87\xa6\xe5\xf7\x04\xb2\xc7\x03\xdd\xed\x50\x3a\x85\x76\xd9\xd7\x16\xd6\x8b\x55\x2c\x3c\xd9\xea\x62\x62\xdd\xaa\xf6\xa1\x8e\x73\xe1\x92\xfe\x17\x37\x6d\x15\xcf\x0f\xcb\x68\x6f\x70\xda\x10\xf6\x2c\x36\x2f\xa8\xda\x77\x11\x54\x99\x33\xce\x31\x1a\x98\x9e\x8a\x40\x3f\x17\x96\x8e\x16\xf7\x34\xff\x4c\x77\x68\xb7\x95\xfd\x22\x0a\x2c\x95\x1f\x32\xde\xfd\x9d\x57\x54\xaa\x3d\x2d\xcd\xfd\x45\x8a\xba\x9f\x8a\xb1\xd8\x64\x87\x3f\x48\x49\x8f\x5d\xf7\x58\xb2\x1c\x07\xe7\xc6\xda\xfc\x51\x14\xc7\x55\x3a\x12\xcc\xcb\xe0\x39\x93\xe2\xbe\x73\xba\xee\x3d\x3c\x29\x8f\x05\x3a\xef\x5e\xd6\xc7\xf1\xb0\x8a\x71\x76\x7a\xd2\x58\xb2\x2d\xc4\x8f\x99\xc5\x04\x8d\xfe\x5e\x5d\x0f\x51\xe8\xe9\x75\x1e\xa7\xd1\xc6\x4a\xc8\x45\x8f\x62\x47\xce\x5b\xb7\xcf\x38\x78\xbd\xa7\xe9\xf7\x61\xe4\xdf\xbe\xed\xbf\x98\xc8\x6e\x3f\xfe\x74\x26\x15\x27\xf7\x8e\xb1\xa1\xe2\xac\x0c\x4f\xaa\xb1\xd5\xe3\x28\xa9\xc6\x02\x9e\x8e\xb0\x13\x97\xca\xd1\xcc\xf7\xf0\xee\x23\x7c\xf8\xf8\x09\x6e\xdf\xdd\x7d\xca\xc8\xd0\x0e\xdc\x88\xfa\x28\xd9\x6e\xaf\xe1\xd2\xea\x30\x15\xdb\xb7\xe4\x93\xb9\xb0\x3b\xab\x3d\x44\x1d\xbb\xf4\x48\xb6\xed\xe6\x27\x73\xe7\xd9\xb2\x12\xe1\x40\xd5\x74\x33\xb6\xff\x74\xbb\x01\x2d\x44\x99\x19\xf9\xdb\x82\x69\xd3\xaf\xe9\x61\x5d\x65\x2d\xd6\x52\x3c\x23\x6c\x1b\x6d\x55\xed\x91\xc3\x51\x34\x20\xf1\x52\x36\x7c\xa2\xa9\x37\x61\xb7\x4d\x79\x41\x08\x61\x55\x2d\xa4\x86\x15\x01\x48\x98\x48\xcc\x3f\x8e\x7a\xb3\xd7\xba\x4e\xcc\x7d\x25\xd9\x31\xbd\x6f\x9e\xb2\x5c\x54\x9b\x9d\xb8\x14\x35\x72\x5a\xb3\x8d\xa3\xcf\x64\x59\xc0\x9f\xd0\x67\x24\xdc\x49\x7d\x4e\xe0\x40\x77\x67\xa6\x2d\x71\x53\x8d\x89\xbf\x56\x39\x4f\xd4\x70\xc1\xbd\xf3\xdf\x03\x63\xf5\xf3\xc1\x44\x6a\xf3\x10\xe5\xcc\x07\xd7\x0a\x30\x05\x14\xfc\xef\xe0\x12\xb0\x78\x1d\x6c\x24\x66\x67\x2e\x8d\x5e\x53\x70\x75\x5c\x68\x5c\xc6\x1b\xbe\xab\x1d\xc6\x77\x7d\x1f\xe4\x3c\xf2\x8f\x15\x91\xd7\x0a\xe2\xd0\xf5\x10\xb4\x56\xb6\xcf\x32\x9e\x28\x94\xcf\xa6\x7f\xea\xc7\x19\xd7\xc2\xfa\x24\x5d\x29\x16\x51\x06\xfa\xe2\xc6\xce\xb9\x99\x4e\xf6\xf0\x3f\xb4\x77\x29\xac\x86\xd3\xa3\x75\x3d\x83\x90\xa9\x6f\xea\x2e\x6d\xa0\x7a\x2d\xca\x06\x47\x1d\x98\xce\xf7\xe3\xa1\xe7\xaf\x59\xfd\x82\xe0\x6c\xbb\xec\x7b\xc2\x41\x81\x9b\x01\xf7\x18\x11\xdc\x22\xae\xec\xa8\xa1\x14\xd5\x94\xda\xf0\xe4\x0b\x4f\x59\xaf\x78\x40\x69\x5b\xf8\x66\x16\xed\xc3\xd2\xe3\x93\xdf\xc0\x48\xd4\x6e\x2b\x59\xb4\x89\x1e\xc3\x69\xe9\x7a\x6e\xc6\x03\x6f\x4a\xb6\xad\xb7\x11\x32\xe7\xda\x93\xac\xf9\xeb\xc8\x64\xd6\x3b\x76\xa7\x1e\x9b\x3c\x47\x65\x62\xe7\xf6\xb4\x36\x0b\xfb\x87\x17\xab\xc3\x8d\x87\x2d\xc6\x49\x1e\xdc\xcb\x87\x2d\xdd\x29\xd2\xdd\xb4\x7d\x16\x5a\x12\x18\x34\x7c\x73\x02\x04\xe8\x5f\x92\xae\x02\xb9\xc1\xec\x2b\xd3\x79\x02\xa3\x57\x67\x77\x21\xf0\xff\x0f\xf9\x65\xdb\x59\xf1\x6c\xe0\xbb\x6f\xbf\x85\xeb\x6b\xf8\xdb\x5c\x4b\x90\xf4\x38\x50\x02\x08\x90\x59\x1a\xec\x47\x19\xa6\xfb\x15\xa9\x8c\x24\x32\xb0\xe4\x09\xe4\x03\x1e\x7e\xb8\xbf\x73\xcf\x1d\xc9\xc0\x3f\xe1\xc3\x4e\x21\x50\xd9\x46\xa6\xa2\x86\x31\x28\x3f\xc2\x89\x1c\x2a\xff\x54\x5e\xf8\x03\x80\x29\x63\xb8\x16\x8c\x6b\x60\xd3\x03\x56\xd5\x98\x07\x37\x84\xf5\x69\x10\xd3\x25\xe0\x4f\x5d\x3d\xa9\x0f\xf7\x20\x11\xe3\x29\xd3\x32\x63\x55\x97\xe6\x4c\x9f\x3d\xe4\x67\x5e\xc2\x6b\x19\x1e\x17\x67\x15\x74\x5e\x4b\x7c\x41\xdf\xdf\x8c\x1b\xbb\xfd\x43\x4b\xea\x8a\xc0\xee\x2d\xf6\xe0\xeb\x9f\x85\x46\x6b\x85\xc8\xdd\x23\x94\xdf\xae\x0f\xe4\x55\x65\x3a\x7f\x08\x2e\x28\xe4\x62\x43\x4c\x48\xc6\xa5\xca\x9a\x1a\xdc\x1c\xa2\xf5\x9f\x00\x00\x00\xff\xff\x4c\xb6\xa9\x92\xdb\x18\x00\x00") func templatesClientResponseGotmplBytes() ([]byte, error) { return bindataRead( @@ -195,12 +182,12 @@ func templatesClientResponseGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/client/response.gotmpl", size: 6436, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2a, 0x28, 0xb9, 0x15, 0x9f, 0x1a, 0x7a, 0x38, 0x12, 0xb5, 0x7a, 0x55, 0xaa, 0xe9, 0x20, 0x89, 0xda, 0xaf, 0xf7, 0x76, 0xc6, 0x97, 0x48, 0xcf, 0x12, 0xcf, 0xb0, 0x15, 0x8a, 0x3d, 0x50, 0xdb}} + info := bindataFileInfo{name: "templates/client/response.gotmpl", size: 6363, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x40, 0x2e, 0x8b, 0x3b, 0xc7, 0xb, 0xf9, 0x2c, 0x74, 0x50, 0xe2, 0xd0, 0xb6, 0xa3, 0x6a, 0x54, 0xe0, 0x84, 0x11, 0xaa, 0xa1, 0x6c, 0xe4, 0x98, 0xd1, 0x66, 0x16, 0x20, 0x23, 0x3d, 0x60, 0x14}} return a, nil } -var _templatesContribStratoscaleClientClientGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\xcd\x6e\xe3\x38\x0c\xbe\xeb\x29\xb8\xd9\x6e\x91\x04\x89\xbd\x7b\xf5\x62\x0e\x45\x3b\x8b\xc9\x61\xda\xa0\x0d\x30\xc7\x85\x6a\xd3\xb6\x50\x5b\xf2\x48\x72\xd3\x8c\xe1\x77\x5f\xe8\x27\x4a\xec\x24\xed\xdc\xf6\x32\x97\x44\x26\x3f\x92\x12\xf9\x91\x52\x1c\xc3\xad\xc8\x10\x0a\xe4\x28\xa9\xc6\x0c\x9e\x77\x50\x88\xa5\xda\xd2\xa2\x40\xf9\x37\xdc\x3d\xc0\xfd\xc3\x06\x3e\xdf\xad\x36\x11\x21\xa4\xeb\x80\xe5\x10\xdd\x8a\x66\x27\x59\x51\x6a\x58\xf6\x7d\x1c\x43\xd7\x41\x2a\xea\x1a\xb9\x1e\xe9\xba\x0e\x90\x67\xd0\xf7\x84\x90\x86\xa6\x2f\xb4\x40\x03\x8e\xee\x69\x8d\x56\x1a\xc7\xb0\x29\x99\x82\x9c\x55\x08\x5b\xaa\x86\x3b\xd1\x25\x82\xdf\x0a\x68\x21\xaa\xc8\xe0\x3f\x67\x4c\x33\x5e\x80\x0e\x76\xb5\x0d\xd7\x48\xf1\x8a\x90\xb7\xda\xba\x2a\x91\xc3\x4e\xb4\x20\x71\x29\x5b\x3e\xf0\xb4\x0f\x61\xf7\x4c\x79\x46\x08\xab\x1b\x21\x35\x4c\x09\xc0\x84\xa3\x8e\x4b\xad\x9b\x89\xf9\x28\x98\x2e\xdb\xe7\x28\x15\x75\x5c\x88\xa5\x68\x90\xd3\x86\xc5\x28\xa5\x90\xea\x1d\x80\x89\xf4\x8e\x5a\xb6\x5c\xb3\x1a\xdf\x41\xbc\xd2\x8a\x65\x54\xe3\x84\x10\x00\xa5\x65\x5e\xeb\x8b\xb1\xac\xd6\x02\xbb\x0e\x24\xe5\x05\x42\x74\x87\x39\x6d\x2b\xbd\xb2\xe7\x52\x60\x0b\xd1\x48\xc6\x75\x0e\x93\x3f\xbe\x4f\x20\xea\x7b\x87\xf7\xd5\x39\xb2\xbd\x7a\xc1\xdd\x02\xae\x5e\x69\xd5\x22\x24\x9f\x20\x1a\x38\x31\x5a\xe8\x7b\x18\xf9\xf3\xf0\x91\xd7\x99\xa9\x6f\x21\x92\x90\xf0\x5a\xa4\x2f\x28\x77\xb0\xe4\xa6\xfe\x37\xeb\x15\x2c\x19\x6f\x5e\x0a\xcb\x03\xf3\xc9\x94\xad\x14\xe3\x1a\x65\x4e\x53\x04\x91\x5b\x41\xd7\x41\xd9\xd6\x94\xb3\x1f\x18\xc8\x03\x69\xc5\x90\x6b\xa2\x77\x8d\xf3\x75\xb0\xea\xc8\x21\x15\x0f\x8d\x89\xcd\x04\x57\x86\x90\x24\x9e\x1b\x5d\x43\x55\x4a\xab\x81\x37\x4f\xed\xa7\xb6\xae\xa9\xdc\xf9\x94\x55\xad\xb4\xb0\x7f\x98\x54\xfa\x9b\x90\x19\x4c\x0f\xfb\xf0\xd0\x99\xc3\x1a\xe3\x3b\x54\xa9\x64\x8d\x89\x66\xd9\xdd\x75\xf0\x5c\x89\xf4\x25\x34\xc7\x10\x10\x32\x65\x16\x95\xc2\xb1\x0f\xab\xf8\xc8\x81\xb1\xb3\xab\xd3\x04\xdd\xac\x57\x3e\x84\x39\xf9\x3c\x76\xc5\x39\x3d\xfb\x34\xd5\x6f\x90\x0a\xae\xf1\x4d\x47\xb7\xee\x7f\x01\x0d\x95\xb4\x56\x30\x3f\x6b\xb2\xb6\x4a\x7f\xec\x2f\x54\x3d\x69\x89\xb4\x66\xbc\x78\x44\xd5\x08\x6e\xf7\xb4\x80\xad\x64\x1a\x25\x30\x11\x7d\xb3\xab\x70\xe0\xd9\x21\xdd\x69\x8a\x4a\x1d\x59\x4d\x0f\xa5\x1b\x29\x0d\x05\xcf\xef\x66\x01\x83\x54\xda\x85\x6d\xd2\x8b\x51\x66\x07\x96\x1e\xa5\xc8\x0d\xa4\x7b\xdc\x42\x2a\x91\x6a\x54\x40\x81\xe3\xf6\x3c\xfd\x0c\xe5\x1c\x05\x23\x92\xb7\x3c\x35\x76\x53\x2d\x29\x57\x76\x98\xf8\x26\x8f\x6e\x2d\x64\xb3\x97\x2f\x20\x17\xb2\xa6\x5a\xf9\xb6\x8e\x1e\xb1\x60\x4a\xcb\xdd\x02\x68\xab\xcb\x15\xcf\xc5\xc8\xf4\xc6\x8b\x5d\x0a\x67\x30\x77\x62\xe8\x08\x80\x44\xdd\x4a\x0e\xd7\x4e\x64\x24\x00\x61\x0b\xc9\x61\xb9\xb0\x1a\x1f\x39\xd9\x2f\x9c\x74\x1f\x36\x09\x2b\x23\x77\xc9\x98\x93\x7d\xb0\x33\xdd\x31\xfc\xfa\x7f\xf9\x9f\x0b\x79\xb1\x4a\x87\x52\xcf\x63\x37\x2d\xfc\xa1\x94\x96\x6d\xea\x12\xf9\x61\xdd\x08\x5c\x2a\x1c\x81\x9f\xab\x1c\x71\x09\xf9\x35\x96\xc6\x25\xb1\xcd\x33\xa5\x7b\x62\xcf\x7e\x0d\xa9\x93\x21\x65\x39\x6a\xae\xdf\x0a\x79\xa1\x4b\x73\x2f\x57\xc8\xcf\x06\x77\xc0\xf3\x0e\x25\xaa\xb6\xd2\x5d\x67\xaa\xd3\xf7\xff\x06\xf7\x0b\x40\x29\x8d\x53\x1a\x85\x46\x88\x9e\xda\xe7\x9a\xe9\xe9\xf5\x90\xd3\x81\xb7\x6e\xd8\xac\xee\x92\xf1\x5b\x20\x9c\xd7\x02\xbe\xa2\x2e\x45\x76\x0a\x72\xf2\x00\x5b\x53\x5d\xae\xa9\xd6\x28\xf9\x29\xd6\x28\x0f\x48\x29\xb2\x36\x45\xf5\x15\x33\x46\x37\xbb\x06\xd5\xd0\xe0\xf7\x57\x63\x71\x02\x0a\xf6\xb7\x82\xab\xb6\xfe\xc0\xfe\x14\x14\xec\x9f\xd2\x12\xeb\xb3\x46\x5e\x73\x74\x26\x43\xbf\xc4\x73\xd4\xc9\x1e\x91\x66\x28\x13\xb8\x3e\x4b\x11\xa7\xed\xc2\x9c\xa6\x91\x5f\xfe\x1c\x87\x13\xff\x1f\xea\xea\x37\xe2\xad\xcd\x38\x12\x92\xfd\x40\x77\xd9\x19\xcd\xcd\x61\xf6\x47\xc7\xd3\x3f\xbc\xe2\xf6\x40\xdf\x70\x09\xa4\xfa\xcd\xe7\xd1\xd2\x21\x01\x7f\xbc\xe8\xcb\x66\xb3\x76\x32\x7b\x7d\xcc\x08\x98\xa0\x86\x57\xbf\x7d\x02\xce\x2a\x70\x84\xf1\x37\xd6\x45\x8a\xda\xbc\x64\x4f\xad\x94\xa2\xe5\x19\x4c\x38\xab\x26\xfe\xf7\xcf\x40\xff\x41\x33\xa1\x94\xf6\xbe\x7a\x87\xf7\x4e\x81\xdf\x83\x83\xbf\x6c\x33\xd8\x9d\xb8\x9e\x88\xa6\xa3\xa6\x1d\x39\xd9\x57\x68\xb6\x30\x67\x39\x0c\x38\xb5\x65\x3a\x2d\x21\xbc\x96\xf7\xde\xcc\x35\x33\x83\xee\xe8\x59\xcd\xcc\xa3\xda\x3e\xa8\xcf\x37\x2d\x40\x4a\x15\x8e\x26\xd9\xd5\xeb\x3e\x70\x62\x21\xc7\xf9\x1b\xa4\xc9\x6e\x60\x9f\xa8\x2b\x36\xc8\x94\xdf\xb0\x1b\x24\x3d\xb9\xe8\xe3\x62\xaa\x8f\x1d\xf8\x07\x7e\xe5\xe7\x89\x75\x34\xd0\x93\xf0\xa2\xea\x7b\xf2\x5f\x00\x00\x00\xff\xff\xc0\xe9\xe3\xd3\x60\x0e\x00\x00") +var _templatesContribStratoscaleClientClientGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x56\x4b\x6f\xdb\x38\x10\xbe\xf3\x57\xcc\x7a\xb3\x85\x6d\xd8\xd2\xee\x55\x8b\x1e\x82\xa4\x8b\xfa\xd0\xc6\x48\x0c\xf4\xb8\x60\xa4\x91\x44\x44\x22\x55\x72\x64\xc7\x15\xfc\xdf\x17\x7c\x58\xb6\xfc\x48\x7a\xdb\x4b\x2f\x31\x35\x4f\xce\x37\xdf\x0c\x13\xc7\x70\xa7\x32\x84\x02\x25\x6a\x4e\x98\xc1\xf3\x16\x0a\x35\x37\x1b\x5e\x14\xa8\xff\x86\xfb\x07\xf8\xfa\xb0\x82\x4f\xf7\x8b\x55\xc4\x18\xeb\x3a\x10\x39\x44\x77\xaa\xd9\x6a\x51\x94\x04\xf3\xdd\x2e\x8e\xa1\xeb\x20\x55\x75\x8d\x92\x4e\x74\x5d\x07\x28\x33\xd8\xed\x18\x63\x0d\x4f\x5f\x78\x81\xd6\x38\xfa\xca\x6b\x74\xd2\x38\x86\x55\x29\x0c\xe4\xa2\x42\xd8\x70\x33\xbc\x09\x95\x08\xe1\x2a\x40\x4a\x55\x91\xb5\xff\x94\x09\x12\xb2\x00\xea\xfd\x6a\x97\xae\xd1\x6a\x8d\x90\xb7\xe4\x42\x95\x28\x61\xab\x5a\xd0\x38\xd7\xad\x1c\x44\xda\xa7\x70\x77\xe6\x32\x63\x4c\xd4\x8d\xd2\x04\x63\x06\x30\x92\x48\x71\x49\xd4\x8c\xec\x47\x21\xa8\x6c\x9f\xa3\x54\xd5\x71\xa1\xe6\xaa\x41\xc9\x1b\x11\xa3\xd6\x4a\x9b\x37\x0c\x6c\xa6\x37\xd4\xba\x95\x24\x6a\x7c\xc3\x62\xcd\x2b\x91\x71\xc2\x11\x63\x00\x86\x74\x5e\xd3\xd5\x5c\x4e\xeb\x0c\x6d\x77\x5c\x25\x06\xa2\x7b\xcc\x79\x5b\xd1\x22\x7c\xef\x76\x27\xfa\x23\xc5\xc4\xb6\xa1\x50\x49\x8f\x4b\xad\xd2\x17\xd4\x5b\x98\x4b\xdb\xa6\xdb\xe5\x02\xe6\x42\x36\x2f\x85\x6b\x97\xfd\x14\xc6\x01\x2a\x24\xa1\xce\x79\x8a\xa0\x72\x27\xe8\x3a\x28\xdb\x9a\x4b\xf1\x03\xfb\x1e\x43\x5a\x09\x94\xc4\x68\xdb\xf8\x58\x07\xaf\xce\xf2\x49\x73\x59\x20\x44\x0f\x8d\xcd\x2d\x94\x34\x96\x37\x2c\x9e\x5a\x5d\xc3\x4d\xca\xab\x41\xb4\xc0\xc0\xa7\xb6\xae\xb9\xde\x82\xa3\x58\x53\xb5\xda\x99\xfd\x23\xb4\xa1\x6f\x4a\x67\x30\x3e\xdc\x23\x98\x4e\xbc\xad\x75\xbe\x47\x93\x6a\xd1\xd8\x6c\x8e\x84\x5d\x07\xcf\x95\x4a\x5f\x7a\x0e\x0f\x0d\x7a\x12\xdb\x43\x65\xf0\x34\x86\x53\xbc\x17\xc0\xfa\xb9\xd3\x39\x40\xb7\xcb\x45\x48\x61\x2b\x9f\xc6\xbe\x53\xe7\xb5\x8f\x53\x7a\x85\x54\x49\xc2\x57\x8a\xee\xfc\xef\x0c\x1a\xae\x79\x6d\x60\x7a\xd1\x65\xe9\x94\xa1\xec\xcf\xdc\x3c\x91\x46\x5e\x0b\x59\x3c\xa2\x69\x94\x74\x77\x9a\xc1\x46\x0b\x42\x0d\x42\x45\xdf\xdc\xa9\x2f\x78\x72\x80\x3b\x4d\xd1\x98\x23\xaf\xf1\xa1\x75\x27\x4a\xcb\xa9\xcb\xb7\x99\xc1\x00\x4a\x77\x70\xb3\x74\x35\xcb\xe4\xb0\x40\x8e\x20\xf2\x7b\xe3\x2b\x6e\x20\xd5\xc8\x09\x0d\x70\x90\xb8\xb9\x4c\x3f\x4b\x39\x4f\xc1\x88\xe5\xad\x4c\xad\xdf\x98\x34\x97\xc6\xcd\x7c\x98\xc5\xe8\xce\x99\xac\xf6\xf2\x19\xe4\x4a\xd7\x9c\x4c\x98\xbe\xe8\x11\x0b\x61\x48\x6f\x67\xc0\x5b\x2a\x17\x32\x57\x27\xae\xb7\x41\xec\x21\x9c\xc0\xd4\x8b\xa1\x63\x00\x1a\xa9\xd5\x12\x3e\x78\x91\x95\x00\xf4\x57\x48\x0e\xc7\x99\xd3\x84\xcc\xc9\xfe\xe0\xa5\xfb\xb4\x49\x7f\xb2\x72\x0f\xc6\x94\xed\x93\x5d\x98\x8e\xe1\xd7\xff\xcb\xff\x5c\xe9\xab\x5d\x3a\xb4\x7a\x1a\xfb\x6d\x11\x8a\x32\xa4\xdb\xd4\x03\xf9\x6e\xdf\x18\x5c\x6b\x1c\x83\x9f\xeb\x1c\xf3\x80\xfc\x5a\x4b\xa7\x2d\x71\xc3\x33\xe6\x7b\x62\x4f\x7e\x2d\xa9\xb3\x25\xe5\x38\xda\x75\x70\x53\xa1\x2c\xa8\x84\xe4\x23\x54\x28\x2f\x26\x0f\xcf\xf1\xc5\x80\x1a\x4d\x5b\x51\xd7\xd9\xee\xec\x76\xff\xf6\xe1\x67\x80\x5a\xdb\xa0\x3c\xea\x07\x21\x7a\x6a\x9f\x6b\x41\xe3\x0f\x43\x4e\xf7\xbc\xf5\xcb\x66\x71\x9f\xb8\x76\x69\x21\x29\x87\xd1\x1f\xdf\x47\x87\x7a\x9d\xc1\x17\xa4\x52\x65\xe7\x46\x5e\xde\x9b\x2d\x39\x95\x4b\x4e\x84\x5a\x9e\xdb\x5a\xe5\xc1\x52\xab\xac\x4d\xd1\x7c\xc1\x4c\xf0\xd5\xb6\x41\x33\x74\xf8\x7d\x6d\x3d\xce\x8c\x7a\xff\x3b\x25\x4d\x5b\xbf\xe3\x7f\x6e\xd4\xfb\x3f\xa5\x25\xd6\x17\x9d\x82\xe6\xa8\x26\x4b\xbf\x24\x70\xd4\xcb\x1e\x91\x67\xa8\x13\xf8\x70\x91\x22\x5e\xdb\xf5\x7b\x9a\x47\xe1\xf8\x73\x1c\x4e\xc2\x6f\xdf\xd7\x70\x91\xe0\x6d\xd7\x91\xd2\xe2\x07\xfa\xc7\xce\x6a\x6e\x0f\xbb\x3f\x3a\xde\xfe\x00\x47\xaf\x62\x40\xcd\x0e\x5c\x02\x29\xbd\x06\x1c\x1d\x1d\x12\x08\xe5\x45\x9f\x57\xab\xa5\x97\xb9\xe7\x63\xc2\xc0\x26\xb5\xbc\xfa\xed\x23\x48\x51\x81\x27\x4c\x78\xb1\xae\x52\xd4\xe1\x92\x3d\xb5\x5a\xab\x56\x66\x30\x92\xa2\x1a\x85\xbf\x7f\xf6\xf4\x1f\x0c\x13\x6a\xed\xde\xab\x37\x78\xef\x15\xf8\xbd\x0f\xf0\x97\x1b\x06\x77\x13\x3f\x13\xd1\xf8\x64\x68\x4f\x82\xec\x3b\x34\x99\xd9\x5a\x0e\x0b\xce\x6c\x04\xa5\x25\xac\x79\xd5\xa2\x1d\xa0\x7d\x34\xfb\xcc\x4c\xa0\x83\x7e\x4f\xdc\x88\x19\xdc\xac\xad\xc9\x95\xa1\x05\x48\xb9\xc1\x93\x4d\x76\xb3\xde\x27\x4e\x9c\xc9\x31\x7e\x03\x98\xdc\x05\xf6\x40\xdd\x88\x01\x52\xe1\xc2\x7e\x91\xec\xd8\xd5\x18\x57\xa1\x3e\x0e\xe0\x61\x0e\xd5\x87\x40\x03\x3d\xeb\xff\xa3\xda\xed\xd8\x7f\x01\x00\x00\xff\xff\x4b\xc5\xc6\xd2\x07\x0e\x00\x00") func templatesContribStratoscaleClientClientGotmplBytes() ([]byte, error) { return bindataRead( @@ -215,12 +202,12 @@ func templatesContribStratoscaleClientClientGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/contrib/stratoscale/client/client.gotmpl", size: 3680, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x21, 0x84, 0xe6, 0x79, 0x4a, 0xea, 0x52, 0x84, 0xf0, 0x99, 0x30, 0x82, 0x3, 0x3, 0xd7, 0xea, 0x3a, 0xd6, 0x55, 0xcf, 0x42, 0x8c, 0x4b, 0xb1, 0xee, 0xea, 0x55, 0x8f, 0x76, 0xd1, 0x34, 0x43}} + info := bindataFileInfo{name: "templates/contrib/stratoscale/client/client.gotmpl", size: 3591, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0xdd, 0xbb, 0x78, 0xa6, 0x46, 0x6b, 0xee, 0x13, 0xc1, 0xe6, 0x6b, 0xd3, 0xf0, 0xc7, 0xe1, 0xec, 0xb1, 0x4d, 0xd8, 0xae, 0x14, 0xae, 0xd7, 0x2f, 0xd7, 0xf3, 0x11, 0x59, 0x36, 0x13, 0xfe}} return a, nil } -var _templatesContribStratoscaleClientFacadeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x55\x4d\x6f\xe3\x36\x10\x3d\x93\xbf\x62\xea\x6e\x01\x7b\xe1\x48\xf7\x2d\x7c\x68\x93\x45\x37\xc0\x36\x09\x52\x2f\x7a\x28\x7a\x60\xe4\x91\x44\x44\x22\x55\x72\x68\xc3\x15\xf4\xdf\x8b\xa1\x24\xcb\xf2\x3a\xdb\xa2\x37\x6b\x3e\xde\x3c\xce\xbc\x19\xa7\x29\xdc\xda\x1d\x42\x81\x06\x9d\x22\xdc\xc1\xcb\x11\x0a\x7b\xe3\x0f\xaa\x28\xd0\xfd\x08\x77\x8f\xf0\xf0\xb8\x85\x8f\x77\xf7\xdb\x44\x4a\xd9\xb6\xa0\x73\x48\x6e\x6d\x73\x74\xba\x28\x09\x6e\xba\x2e\x4d\xa1\x6d\x21\xb3\x75\x8d\x86\x2e\x7c\x6d\x0b\x68\x76\xd0\x75\x52\xca\x46\x65\xaf\xaa\x40\x0e\x4e\x9e\x86\xdf\xec\x48\x53\xd8\x96\xda\x43\xae\x2b\x84\x83\xf2\x73\x32\x54\x22\x0c\x6c\x80\xac\xad\x12\x8e\xff\xb8\xd3\xa4\x4d\x01\x74\xca\xab\x63\xc5\xc6\xd9\x3d\x42\x1e\x28\x42\x95\x68\xe0\x68\x03\x38\xbc\x71\xc1\xcc\x90\xc6\x12\x91\xb6\x32\x3b\x29\xa5\xae\x1b\xeb\x08\x96\x52\x2c\x0c\x52\x1a\x5c\xb5\x18\x7e\x96\x44\xcd\x42\x4a\xe1\x28\xab\x34\xbf\x71\x51\x68\x2a\xc3\x4b\x92\xd9\x3a\x2d\xec\x8d\x6d\xd0\xa8\x46\xa7\x2e\x18\xd2\x35\xa6\x7d\x14\x67\x5f\x8f\x63\x12\xdf\xf0\x36\x98\xbd\xed\x45\xe7\xac\xf3\x6f\xfb\x07\x0e\xdf\x80\x27\x97\xd7\xc4\xcf\x69\x5b\x70\xca\x14\x08\xc9\x1d\xe6\x2a\x54\x74\x1f\x3b\xe0\x79\x6e\xd1\xdb\x38\x6d\x28\x87\xc5\x0f\x7f\x2d\x20\x19\x6c\x3c\xcd\xd1\xdf\x67\xbf\x7b\xc5\xe3\x1a\xde\xed\x55\x15\x10\x3e\x6c\x20\xb9\x84\xe1\x00\xe8\x3a\xb8\x40\x1c\x32\x2e\x70\x57\x52\x66\xd6\xf8\x38\x87\x34\x85\x81\xd9\x27\xeb\x09\xb4\x8f\x23\xdc\xf5\x26\x60\x5b\x8c\xc9\x6d\x30\x3b\xd0\x06\x7e\x45\x52\xb0\xd4\x26\xb7\x2b\xf0\x98\x91\xb6\x06\x6c\x0e\xdc\xd0\x28\x12\x29\xce\xe1\x3c\x39\x96\xd0\x66\xc6\xeb\xfb\xfd\x02\x92\xe8\x66\x5e\x13\x81\x9f\x95\xc7\x27\x45\xe5\x25\x89\xd1\xfe\x3f\x89\x9c\x60\xdf\x26\x73\x0a\xe9\x9b\x33\x51\xfa\x2d\x2b\xb1\x46\x0f\xca\xe1\x8c\x92\x1f\xec\xff\x9d\xcd\x5e\xb9\x4b\xd0\x2b\x44\x46\x17\xaf\x2c\x1d\x1b\x84\x5b\x6b\x72\x5d\x30\xf5\x90\x11\xb4\xb1\x05\x5f\x9e\x3f\x8f\x2d\x7a\x51\x1e\xe3\xb7\xcd\xe3\x77\x68\x3c\x39\x54\x35\x78\x74\x7b\x74\x52\xb0\xef\x7d\x70\x55\xf2\xe5\xf9\x73\x4c\xde\x3a\x65\x7c\x5c\x42\xed\x41\x19\xd0\xc6\xf0\xd2\x9f\xac\xb9\x75\x11\xa9\xdf\x2f\x29\xa6\x78\xde\xd0\xe4\x99\x1f\xbc\x75\xba\x69\x18\x3d\x4d\xe1\xa7\x40\xe5\xbd\xc9\x2d\xc3\x71\xae\x0a\x54\xa2\x21\x9d\x29\xee\x81\x14\x27\x3f\x0c\x5b\x93\xdc\x46\xe4\xd1\xfe\xbb\xd3\x84\x4e\xf6\x27\xea\x01\x0f\x90\x39\x54\xc4\x2d\x07\x83\x07\xee\x50\x19\x6a\x65\xf4\xdf\x08\xc9\x83\xaa\x59\xcb\xf0\x69\xbb\x7d\x1a\x08\x26\x32\x0f\x26\xe3\xc4\x65\x36\x34\x6b\x05\xef\xb9\xaf\xca\x67\xaa\x9a\xa5\xb5\x52\xf0\x14\x96\x52\x88\x92\xd5\xb7\x39\x57\xbe\x14\xe2\x65\x54\xc1\xe6\x52\x91\x52\x08\x7f\x1a\xda\x7c\x8a\x52\xac\xa4\x14\x3a\x87\x8c\x5b\x0c\xdf\x6d\xc0\xe8\x8a\x4b\x8d\x35\xa2\x3d\xf9\xba\x44\x6f\xff\x0a\xfd\x8f\x3f\x7b\x99\xb6\xbd\xbf\xaf\xd2\x49\xd1\x49\x29\xa6\x29\x7d\xd8\xc0\x78\x28\x13\x7e\x3b\xd7\x5a\xc3\x88\xbe\x1e\xf5\xb9\x1a\x98\x4d\x43\x3c\xe3\x77\x42\x3b\x73\x6f\xce\x83\xfb\xa2\x59\xa5\xb9\x9c\xc1\xc3\xf2\x6a\x5b\x57\x31\x64\x86\x41\x13\xc2\x74\xff\x1e\x1b\xfe\x33\xd0\xd6\xfc\xe2\x6c\x68\x86\xcb\xc5\x99\xd7\x87\x15\x97\x63\xfc\x8a\x6f\x3c\xa1\xae\xa1\xbf\xaf\xe3\x49\x5d\x43\x96\x8c\x72\x5a\xcd\x0e\x9d\x14\x0e\x29\x38\xc3\x62\x19\x24\x76\xbd\x1a\xef\xc2\xa0\xa8\xa8\xe2\x6b\xb2\xeb\x17\xf2\x7a\xfe\xb4\x9f\xff\xf2\xe0\xeb\xe9\x2c\x58\x6f\xd4\xeb\xb9\x71\xd8\x93\xf9\x1f\xc2\xd4\xe5\xf9\x36\x4d\x33\xeb\xe4\x3f\x01\x00\x00\xff\xff\xec\x10\x19\xe5\x6f\x08\x00\x00") +var _templatesContribStratoscaleClientFacadeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x9c\x55\xcd\x6e\xe3\x36\x10\x3e\x73\x9e\x62\xea\xa2\x40\x1c\x24\xd2\xbd\x85\x0f\x5b\x67\xd1\x0d\xb0\x4d\x82\xd4\x8b\x1e\x8a\x1e\x18\x79\x24\x11\x95\x48\x81\x1c\xc5\x48\x05\xbd\x7b\x31\x94\x64\xcb\x5e\x65\x5b\xf4\x26\xcd\xcf\x37\xdf\xfc\x32\x4d\x71\xeb\xf6\x84\x05\x59\xf2\x9a\x69\x8f\x2f\x6f\x58\xb8\xdb\x70\xd0\x45\x41\xfe\x27\xbc\x7b\xc4\x87\xc7\x1d\x7e\xbc\xbb\xdf\x25\x00\xd0\x75\x68\x72\x4c\xb6\xae\x79\xf3\xa6\x28\x19\x6f\xfb\x3e\x4d\xb1\xeb\x30\x73\x75\x4d\x96\x2f\x74\x5d\x87\x64\xf7\xd8\xf7\x00\xd0\xe8\xec\x2f\x5d\x90\x18\x27\x4f\xe3\xb7\x28\xd2\x14\x77\xa5\x09\x98\x9b\x8a\xf0\xa0\xc3\x39\x19\x2e\x09\x47\x36\xc8\xce\x55\x89\xd8\x7f\xdc\x1b\x36\xb6\x40\x3e\xfa\xd5\x31\x62\xe3\xdd\x2b\x61\xde\x72\x84\x2a\xc9\xe2\x9b\x6b\xd1\xd3\xad\x6f\xed\x19\xd2\x14\x22\xd2\xd6\x76\x0f\x00\xa6\x6e\x9c\x67\xbc\x02\xb5\xb2\xc4\x69\xeb\xab\xd5\xf8\x59\x32\x37\x2b\x00\xe5\x39\xab\x8c\xe4\xb8\x2a\x0c\x97\xed\x4b\x92\xb9\x3a\x2d\xdc\xad\x6b\xc8\xea\xc6\xa4\xbe\xb5\x6c\x6a\x4a\x07\x2b\xf1\x5e\xb6\x13\x12\xdf\xd0\x36\x94\xbd\xaf\x25\xef\x9d\x0f\xef\xeb\x47\x0e\xdf\x80\x67\x9f\xd7\xbc\x02\x40\x69\xc4\x90\x74\xc0\xe4\x8e\x72\xdd\x56\x7c\x3f\xfe\xf7\xfd\x85\x7e\xa6\x58\x03\x64\xce\x86\x58\xaa\x34\xc5\xd1\xf3\x93\x0b\x8c\x26\xc4\x2a\xef\x07\x11\x8a\x2c\xda\xe4\xae\xb5\x7b\x34\x16\x7f\x25\xd6\x78\x65\x6c\xee\xd6\x18\x28\x63\xe3\x2c\xba\x1c\x25\xe7\xd8\x47\x50\x73\xb8\xc0\x5e\xba\xbc\x11\x26\x8d\x37\x96\x73\x5c\xfd\xf0\xfd\xeb\x0a\x93\xa8\xee\xfb\x39\x81\x9f\x75\xa0\x27\xcd\xe5\x25\x89\x49\xfe\x3f\x89\x1c\x61\xdf\x27\x73\x34\x19\x8a\x73\xa2\xf4\x5b\x56\x52\x4d\x01\xb5\xa7\x33\x4a\x61\x94\xff\x77\x36\xaf\xda\x5f\x82\x2e\x10\x99\x54\xb2\x55\xfc\xd6\x10\x6e\x9d\xcd\x4d\x21\xd4\xdb\x8c\xb1\x8b\x25\xf8\xf2\xfc\x79\x2a\xd1\x8b\x0e\x14\xff\x5d\x1e\xff\xdb\x26\xb0\x27\x5d\x63\x20\xff\x4a\x1e\x94\xe8\xae\x5b\x5f\x25\x5f\x9e\x3f\x47\xe7\x9d\xd7\x36\xc4\x3d\x31\x01\xb5\x45\x63\xad\xec\xe5\x51\x9a\x3b\x1f\x91\x86\x15\x00\x75\xb2\x97\x25\x4a\x9e\x25\xe1\x9d\x37\x4d\x23\xe8\x69\x8a\x1f\x5a\x2e\xef\x6d\xee\x04\x4e\x7c\x75\xcb\x25\x59\x36\x99\x96\x1a\x80\x3a\xea\x71\x1c\xec\x64\x1b\x91\x27\xf9\xef\xde\x30\x79\x18\xae\xc8\x03\x1d\x30\xf3\xa4\x59\x4a\x8e\x96\x0e\x52\xa1\xb2\xad\xb5\x35\x7f\x13\x26\x0f\xba\x96\x83\x83\x9f\x76\xbb\xa7\x91\x60\x02\x79\x6b\x33\x71\xbc\xca\xc6\x62\xad\xf1\x5a\xea\xaa\x43\xa6\xab\x33\xb7\x0e\x94\x74\xe1\x0a\x94\x2a\x65\xfa\x36\xf3\xc9\x07\xa5\x5e\xa6\x29\xd8\x5c\x4e\x24\x28\x15\x8e\x4d\x3b\xef\x22\xa8\x35\x80\x32\x39\x66\x52\x62\xfc\x6e\x83\xd6\x54\x12\x6a\x8a\x11\xe5\xc9\xd7\x21\x06\xf9\x57\xe8\x7f\xfc\x39\x8c\x69\x37\xe8\x87\x28\x3d\xa8\x1e\x40\x9d\xba\xf4\xe3\x06\xa7\x5b\x96\x48\xee\x12\xeb\x06\x27\xf4\x9b\x69\x3e\xd7\x23\xb3\x53\x13\x67\xfc\x8e\x68\x33\xf5\x66\x6e\x3c\x04\xcd\x2a\x23\xe1\x2c\x1d\xae\x16\xcb\xba\x8e\x26\x67\x18\x7c\x42\xe8\x3a\xf4\xda\x16\x84\xc9\x63\x23\xf7\xda\x38\xfb\x8b\x77\x6d\x13\xe4\x6d\x01\x85\xd2\xc6\x64\xb9\x5d\x9b\xf9\x3b\xf3\xa1\x32\x5a\xd6\x22\x66\x7b\xc4\xbf\xc1\xe1\x18\x4e\xc7\xef\x06\xb3\x64\x1a\xac\x75\x0c\x2e\x6f\x97\x44\x02\xe5\x89\x5b\x6f\x25\xde\x38\x6c\xcb\x51\x65\x2b\xc6\xd9\x8a\xf3\xbc\x34\x80\xc3\x6a\x2e\xfb\x9f\x36\xf5\x5f\x53\x5f\x06\xb8\x5e\xca\x7a\x3b\x6e\xe3\x2c\xa3\xd9\x66\x9e\x6f\xd6\xa9\x7f\x3d\xfc\x13\x00\x00\xff\xff\x07\x37\x02\xd3\x1e\x08\x00\x00") func templatesContribStratoscaleClientFacadeGotmplBytes() ([]byte, error) { return bindataRead( @@ -235,12 +222,12 @@ func templatesContribStratoscaleClientFacadeGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/contrib/stratoscale/client/facade.gotmpl", size: 2159, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x6a, 0x65, 0x26, 0xb9, 0x2f, 0x21, 0x1, 0x23, 0x14, 0xda, 0x91, 0xf9, 0x12, 0x59, 0x62, 0xb, 0x98, 0x78, 0x1e, 0x96, 0xb5, 0xb2, 0xa4, 0x73, 0x92, 0x8b, 0xde, 0x1, 0x3, 0x1, 0x98, 0x3}} + info := bindataFileInfo{name: "templates/contrib/stratoscale/client/facade.gotmpl", size: 2078, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf, 0x91, 0xc8, 0x69, 0xd7, 0xd3, 0xe2, 0xa8, 0x1b, 0xf8, 0x88, 0xe5, 0x52, 0xee, 0xbe, 0x71, 0x57, 0xb, 0xca, 0xb9, 0x7c, 0x23, 0x6e, 0x30, 0x5a, 0x9b, 0x63, 0xee, 0x66, 0xf9, 0xd, 0x1b}} return a, nil } -var _templatesContribStratoscaleServerConfigureapiGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x58\x41\x6f\xeb\xb8\x11\x3e\x5b\xbf\x62\x2a\xbc\x05\xa4\xc0\x91\x81\x1e\x5f\xe1\x83\xfb\xb2\xdb\x75\xb7\x9b\x18\x49\xd0\x3d\x14\x45\xc1\x50\x63\x99\x8d\x4c\x2a\x24\x95\xc4\xcf\xd0\x7f\x2f\x86\xa4\x2c\xda\xb1\x37\x0e\xd2\x02\xcd\x21\x96\xc4\xe1\xf0\x9b\x6f\x86\x33\x43\x4e\x26\xf0\x4d\x95\x08\x15\x4a\xd4\xcc\x62\x09\x0f\x1b\xa8\xd4\xa5\x79\x61\x55\x85\xfa\x4f\x70\x75\x03\xd7\x37\xf7\xf0\xe3\xd5\xfc\xbe\x48\x92\x64\xbb\x05\xb1\x84\xe2\x9b\x6a\x36\x5a\x54\x2b\x0b\x97\x5d\x37\x99\xc0\x76\x0b\x5c\xad\xd7\x28\xed\xc1\xd8\x76\x0b\x28\x4b\xe8\xba\x24\x49\x1a\xc6\x1f\x59\x85\x24\x5c\xcc\x16\xf3\x45\x78\xa5\x31\xb1\x6e\x94\xb6\x90\x25\xa3\x94\x2b\x69\xf1\xd5\xa6\xf4\xa8\x37\x8d\x55\x13\x5b\x1b\x7a\x93\x68\x27\x2b\x6b\x1b\x7a\xae\x55\x45\x3f\xcb\xb5\x4d\x93\x64\x94\x56\xc2\xae\xda\x87\x82\xab\xf5\xa4\x52\x97\xaa\x41\xc9\x1a\x31\x41\xad\x95\x76\x53\x8f\x8f\xd7\x8a\x95\xbf\x33\xac\x5b\x69\xc5\x1a\xdf\x15\x98\xac\x45\x59\xd6\xf8\xc2\xf4\x19\xb2\x06\x79\xab\x85\xdd\x10\xec\xed\x56\x33\x59\x21\x14\x57\xb8\x64\x6d\x6d\xe7\x8e\x04\x43\xa4\x35\x5a\x48\xbb\x84\xf4\x87\xa7\x14\x8a\xae\x23\x59\x94\xa5\x7f\xf0\x93\xbe\x3c\xe2\x66\x0c\x5f\x9e\x59\xdd\x22\x7c\x9d\x42\x11\xcd\xa6\xb1\xae\x23\x9e\x63\x3d\x5e\x36\x56\x96\x93\x3b\xbf\xf4\x6e\x21\x25\xb1\x4f\xec\xa6\x41\x08\xde\xf8\x05\x37\x60\xac\x16\xb2\x4a\x12\xae\xa4\xb1\x30\x6b\xed\x8a\xbe\x46\x02\x53\x48\xe9\x6b\xea\xa2\x24\x98\x76\xd3\x50\x58\x09\x25\xff\xa2\x55\xdb\x18\x0a\x89\x64\x32\xa9\xd4\xd7\x3e\xe0\x60\xad\xf8\x23\xea\x0d\x5c\x4a\xb6\x76\xb1\xd1\x30\xc3\x59\x2d\xbe\x23\x14\xd7\x6c\x8d\x5d\x37\x5b\xcc\xe1\x52\xc8\xe6\xb1\x4a\x12\x1f\x6b\x07\x22\xe0\x65\x28\xae\xae\xd0\x70\x2d\x1a\x5a\x91\x8c\x70\x36\x9c\x9c\x20\xa4\x45\xbd\x64\x1c\x61\x7b\x0c\xb2\x47\x3b\x0a\x21\x1f\x6b\x76\xdf\x4f\x41\x01\x61\x8e\x41\x19\x85\xad\xd0\xeb\x7c\x3b\x31\xe3\xf6\xb5\xe7\xb3\xf8\xe6\x7f\xc7\xd0\x30\xcd\xd6\xa4\xb1\x77\x4e\xd7\x15\x47\xa7\x2f\x9c\x60\x0e\x43\x38\x16\xb7\x68\x1a\x25\x4b\xd4\x49\xb4\x78\x97\x44\x9b\xd2\xed\x7f\xb9\x14\x15\xa1\xe6\xee\xa9\xf5\xd6\xc3\x52\x69\xf8\x99\xc9\xb2\x46\xed\x79\x0c\x82\xc6\xea\x96\x5b\xd8\x3a\x2b\x7e\xc7\xcd\xc7\x8d\x9c\x2d\xe6\xfb\x54\xfc\x4d\x51\xa2\x81\x65\x2b\x79\xe6\x43\x6c\x0c\x45\x51\xec\x7c\xb3\xed\x72\xc7\xf5\x5c\x4a\xd4\xbf\xee\x6c\x23\xbc\x84\xd0\xae\x10\x56\x1e\x25\xe0\x2b\xf2\xd6\x2a\x6d\x0a\xb8\x5f\xa1\x41\x28\x15\x48\x65\x81\x35\x4d\xbd\x01\xab\x9c\x70\xc8\x6c\xc5\xbf\x8d\x92\x50\x2a\xde\x52\xd6\x2a\xdc\x12\xf7\x2b\x8c\xd8\x0b\xea\xd0\x00\x5b\x5a\xd4\xa0\x55\x6b\x85\xac\xe0\xa1\xb5\xf0\x80\x4b\xa5\x11\x58\x6b\x57\x28\xad\xe0\xce\xf6\x31\x3c\x08\x59\x92\x08\x93\x25\x3c\xb3\x5a\x94\xee\x7b\x32\x3a\xc4\xee\x8c\xa5\x5c\x56\x04\x82\x73\x88\xdf\x12\x87\x86\xf6\x92\xd2\xe2\x3b\x6a\xb2\xb5\x35\x58\x92\x09\xac\xff\x0a\x0c\x34\x3e\xb5\x68\x6c\xc0\x47\xc6\xd1\x1c\xa7\xdd\x79\xf0\x85\x19\xe0\xac\xae\xb1\x84\xd6\x10\x2e\x12\x71\x7b\xf4\x22\xdd\x49\x19\xb7\x18\x21\xa6\x51\x4a\x18\x5c\x34\xac\x76\x93\x8d\x55\x1a\x4b\x10\xd2\x8d\x85\xd0\xec\x5f\xd3\x90\x02\xd2\xdd\x80\x4b\x30\x45\x32\x8a\x90\x3b\x4b\x2f\x9c\x71\xb7\x1e\x6d\x0e\x2e\x2f\x27\x71\xf8\xdc\x85\xac\x78\x85\x4b\x21\xc5\xdb\xbd\x37\x37\x7f\x66\x46\x70\x67\x5d\xbf\xf7\xe8\x65\x3f\xc2\xe6\x57\xb4\xfb\x28\x28\x1e\x48\xfa\xc0\x3b\x1e\xd6\xd1\x19\x84\xb1\x35\xa8\xa1\x8f\xbf\x86\x19\x13\x5e\x72\xc8\xa2\x50\x1c\x7b\xf0\xf9\x9b\xdd\xec\x51\xce\x16\xf3\x5f\x70\x73\x16\xcc\x59\xd3\xd4\x02\x0d\xbc\xac\x30\xd0\x49\x39\x23\x6c\x92\xd4\x25\x90\x3b\xd5\x6a\xde\x67\x14\x83\xf6\x1d\x0b\xac\x7a\x44\x79\x1e\xea\x3d\xd0\x37\xa4\xf5\x8f\xef\x02\xfe\x49\x69\x08\xa2\x1f\x22\x36\x86\x35\x06\xc3\x55\x83\x06\xfe\xf1\xcf\x0f\xb1\x3b\xa4\x2e\x4a\x58\x61\x97\x80\x46\xdb\x6a\x69\x80\xc9\xbd\xdd\x03\x95\x78\x0e\x9c\xf6\x89\x61\x2f\xb1\x91\x8a\xb9\x85\xb5\x6a\xa5\x35\xc0\xea\xda\x89\x3e\xd0\x0e\x41\x63\xa0\x56\x95\xe0\x20\xd6\x4d\x8d\x94\x19\x50\x9b\x3e\xe0\x7d\x53\x13\xd2\x40\x91\x90\x75\x3d\x96\x8c\x87\xec\x98\xc3\xde\xbe\xee\x2d\xa2\x6c\xb9\x1a\xc3\xbf\xdc\x3b\x55\xda\x30\x3e\x5b\xcc\x33\x9e\x27\x23\x6f\x0a\xac\xdc\xf8\xbe\x99\x54\xa8\x3e\x61\x69\xbf\xb1\xb9\xd2\xda\x57\x03\x4a\x04\x17\x27\x2a\x97\x34\x96\x49\x8e\xc5\xff\x82\x23\x67\xeb\x29\x9a\x2e\xde\xaf\x6f\xb3\xc5\x3c\xa6\xd3\x34\xc8\x77\x74\xba\x56\xae\x98\x49\x56\x6f\xbe\x63\x99\x85\x1c\x4f\x9d\x68\x76\xe7\x9f\xff\x7a\x77\x73\x9d\x8f\x21\x4d\xf3\x64\x24\x96\x6e\xde\x1f\xa6\x20\x45\x4d\xba\x7a\xfe\xa5\xa8\xc7\xfe\xdf\x72\x6d\x8b\x1f\x69\xad\x65\x96\x32\xaf\xb6\xaf\x1c\x5f\xe1\x87\xe7\xd4\xad\x9c\x27\xa3\x2e\x19\xb1\x46\x10\x84\x3d\x03\xae\xf1\xe5\x94\x0d\x19\x01\xcf\xdd\xb4\xe2\x0e\xf5\x33\xba\x65\x60\xea\x4d\x33\xd1\x37\x2f\x13\xea\xe3\x14\x78\x78\xdc\xcb\x9c\xdf\x94\x34\xed\x1a\x0f\xd2\x65\xef\x18\x36\x74\x2b\xa4\xea\x28\xa4\xa0\x81\x56\xa0\xa4\x73\x30\xb7\xdf\x80\xb5\x71\x4d\xe1\x59\x6a\x42\xaf\xdb\x63\xd3\x3f\x51\x1a\x70\xb9\x40\x83\x50\xc5\x2d\xb2\x92\x5c\x6e\x99\xae\xd0\x42\x5c\xe8\x3d\x07\xb1\x47\x02\x29\xd7\xca\xee\x80\x61\x99\xa5\xdb\x6d\xe8\x0d\x29\xe0\xfd\xba\x2b\x66\x5c\xb1\xdf\x20\x95\x67\x94\x51\x78\x96\xe4\xf4\xee\x74\x5a\x89\xf8\x5c\x68\x55\xb6\xfc\x33\x7c\x06\x0d\x67\xf0\x79\xb6\x9e\x9e\xd0\xfe\xd3\x40\xe8\x0b\x11\xfa\x9b\x16\x96\x08\x2d\x99\x65\x9f\xa5\xb3\xe9\x57\xfd\x04\x9d\x9f\xaa\xec\x6f\xf9\x70\xb5\xc4\x09\x4c\xdf\x2d\xd5\xdb\xad\x58\x3a\xd8\x19\xe0\x13\x79\xb3\xef\x66\xd2\x88\x97\x14\xf2\xae\xbb\xd8\x95\x42\xda\xb8\xbd\x5c\xd7\x45\x29\x06\xc2\x9f\x58\x02\x2f\x4e\xd5\xb8\x69\x9f\x44\x20\xfa\x0b\x6c\xa7\xa9\xcb\x26\xbb\xa1\x6e\x70\xc4\x49\x85\xce\x3a\x6f\x96\x4f\x2f\x67\x35\x1a\x67\xb0\x76\xd0\x1e\xfc\x57\x99\x1a\x9d\x4f\xd3\xe8\x80\x23\x07\xcb\xd3\x34\x3a\x9b\x23\x37\x69\x8f\x9e\x93\x1d\xcd\x07\x99\x39\xd6\xa1\xfc\x7f\x05\x55\x44\xd8\x87\xe2\x2a\xcc\xf3\xe6\x1d\x0d\xad\xbd\xfd\x4b\x4c\x9e\xdc\xbc\x44\xea\x6c\x31\x8f\xfa\xfc\xe9\x70\x30\xd1\x99\x07\xe1\x5f\xf2\x93\xa9\xe1\xf0\x9c\xed\x3d\x45\x54\xe3\x70\x11\xd1\xdf\x4e\xb8\x4b\x91\xc1\xa4\xc5\xf0\xd5\x5d\x65\x1c\xcd\xa0\x7d\x97\x34\x3d\xe3\xf0\x1c\x64\x87\xcc\xfa\xc1\x63\xb7\x03\x3e\x98\x5d\x92\xcf\x87\xb3\x54\x14\x27\x01\xf0\xf1\x63\xba\x4b\xd5\xdc\xbe\x52\x3f\xe1\x01\x14\x3f\xdf\xdf\x2f\xc2\xc9\xa9\xbf\x13\xc8\xf2\x64\xd4\xbb\x68\x58\xd1\x93\xe8\x66\x4f\xfd\xc1\x8d\xc6\x32\x6e\x5f\x23\x24\x61\xe6\xce\xeb\x43\xd8\x1c\xa7\x77\xb6\x98\xef\x8f\xf8\x32\x11\xb4\xfa\x0b\x87\x37\xb5\x20\xea\x6d\xf4\xdd\xaa\xb5\xa5\x7a\x91\xfd\x5e\xcb\x61\xeb\xe2\x35\xac\xbb\x13\xcc\x78\x71\x70\x48\xce\xc7\x34\xea\x03\xdd\x37\xc4\x51\x57\x07\x5c\x35\x74\x7a\x8a\x0e\xf4\xe0\x0e\xf4\x56\x41\xa3\xf1\x19\xa5\xf5\xe5\x50\x33\x2a\xe6\x42\xf6\x35\xd4\x77\xa4\x71\x7f\xa8\xb4\xa8\xdc\xdc\xe2\x96\xbd\xfc\x8a\xc6\xb0\x0a\xf3\xc3\x0f\xe4\x18\x4e\x5e\x59\xb3\x47\xcc\x0e\x06\xc7\x50\xa3\x74\x7a\xf2\x3c\x19\x71\x52\xca\xc7\xe0\xde\x77\x86\xf2\x60\x03\xdb\x3b\xd4\x33\x58\x61\xdd\x84\x63\xb2\xeb\x0f\xac\x1a\x0a\xad\x6f\xa8\x43\xed\x8f\x6f\x03\xfa\x68\x2a\xfc\xbd\x0c\x3b\xeb\xb8\xed\x0c\xcf\x58\x24\x9d\x0f\x57\x0c\x99\xc6\x27\xd8\x9b\x77\x22\x7c\xa3\x9e\x42\x2c\x81\x45\x79\x3d\xea\xa1\x5d\x72\x09\x61\x3c\x44\xa2\xc6\xa7\x21\x82\xf7\x63\xb2\x8f\x06\x27\xf3\x9b\xb0\xab\x5e\x8e\xdb\xd7\x3c\x27\xea\xbc\xdb\xe2\xa8\x3e\x72\x53\x76\x1c\xf0\x81\x1c\x61\xed\x9d\x12\x46\x68\xc5\xbf\xb3\xba\x45\x1f\xd7\xe1\x5e\x63\x0f\x62\x97\xfc\x27\x00\x00\xff\xff\x2d\xa2\x23\x35\x2a\x17\x00\x00") +var _templatesContribStratoscaleServerConfigureapiGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x58\xdf\x6f\xe3\xb8\xf1\x7f\xb6\xfe\x8a\xf9\x0a\xdf\x02\x52\xe0\xc8\x40\x1f\xb7\xf0\x83\x6f\x73\xd7\x73\xaf\x97\x18\x9b\xb4\xf7\x50\x14\x05\x43\x8d\x65\x36\x32\xa9\x25\xa9\x24\x5e\x43\xff\x7b\x31\xfc\x61\xcb\xb6\xbc\x71\x90\x2b\xd0\x7d\xd8\x58\xe2\xcc\xf0\x33\x9f\x19\x0e\x47\x33\x99\xc0\x67\x55\x22\x54\x28\x51\x33\x8b\x25\x3c\x6e\xa0\x52\xd7\xe6\x85\x55\x15\xea\x3f\xc1\xcd\x1d\xdc\xde\x3d\xc0\x8f\x37\xf3\x87\x22\x49\x92\xed\x16\xc4\x12\x8a\xcf\xaa\xd9\x68\x51\xad\x2c\x5c\x77\xdd\x64\x02\xdb\x2d\x70\xb5\x5e\xa3\xb4\x47\x6b\xdb\x2d\xa0\x2c\xa1\xeb\x92\x24\x69\x18\x7f\x62\x15\x92\x70\x31\x5b\xcc\x17\xe1\x91\xd6\xc4\xba\x51\xda\x42\x96\x8c\x52\xae\xa4\xc5\x57\x9b\xd2\x4f\xbd\x69\xac\x9a\xd8\xda\xd0\x93\x44\x3b\x59\x59\xdb\xd0\xef\x5a\x55\xf4\x67\xb9\xb6\x69\x92\x8c\xd2\x4a\xd8\x55\xfb\x58\x70\xb5\x9e\x54\xea\x5a\x35\x28\x59\x23\x26\xa8\xb5\xd2\x4e\x75\x78\xbd\x56\xac\xfc\xce\xb2\x6e\xa5\x15\x6b\x7c\x53\x60\xb2\x16\x65\x59\xe3\x0b\xd3\x17\xc8\x1a\xe4\xad\x16\x76\x93\x26\x09\x10\x11\xde\x71\x03\xc5\x0d\x2e\x59\x5b\xdb\x79\x78\xee\xba\xa3\xf5\xde\x42\x4e\x51\xf8\xff\xc8\xe6\xa7\x29\x14\x7d\x2a\xed\xa6\x41\x08\x24\xfe\x82\x1b\x30\x56\x0b\x59\x25\x09\x57\xd2\x58\x98\xb5\x76\x45\x6f\x7b\x02\x53\x48\xe9\x6d\xea\x82\xab\x99\xac\x10\x8a\xbb\x86\xb2\x41\x28\xf9\x67\xad\xda\xc6\x50\x24\x93\xc9\xa4\x52\x9f\x62\x9e\xc0\x5a\xf1\x27\xd4\x1b\xb8\x96\x6c\xed\x42\xda\x30\xc3\x59\x2d\xbe\x21\x14\xb7\x6c\x8d\x5d\x37\x5b\xcc\xe1\x5a\xc8\xe6\xa9\x4a\x92\xc9\xd5\x80\x08\x78\x19\x4a\x87\x1b\x34\x5c\x8b\x86\x76\x84\xae\x83\xab\x89\x77\xe3\xac\x8e\x90\x16\xf5\x92\x71\x84\xed\x10\x6a\x0f\x78\x14\x92\xf5\xbe\x5d\xaf\x19\x41\xa5\x77\xe7\x90\x38\x18\x51\xd2\x43\x20\x7d\xac\x0d\x3a\x23\x7d\x84\x6f\x1b\x3a\xf5\x67\x14\x4e\x42\x04\x76\xaa\x98\x71\xfb\x1a\xe3\x52\x7c\xf6\x7f\xc7\xd0\x30\xcd\xd6\x06\xb6\xdb\x18\xe4\xae\x2b\x06\xd5\x17\x4e\x30\x87\x7d\x36\x16\x5f\xd0\x34\x4a\x96\xa8\x5d\x68\xe3\xee\x5d\xd2\x3b\x94\xee\xfc\xcb\xa5\xa8\x40\x18\xda\x7c\x29\xaa\xd6\x73\x08\x4b\xa5\xe1\x67\x26\xcb\x1a\xb5\x8f\x46\x10\x34\x56\xb7\xdc\xc2\xd6\xb9\xf1\x9d\x7c\x19\xf6\x72\xb6\x98\x1f\x72\xf1\x57\x45\x85\x06\x96\xad\xe4\x99\xcf\xd5\x31\x14\x45\xb1\x8b\xf0\xb6\xcb\x93\xd1\x64\x02\x73\x29\x51\xff\xba\x73\x8e\xf0\x12\x42\xbb\x42\x58\x79\x94\x80\xaf\xc8\x5b\xab\xb4\x29\xe0\x61\x85\x06\xa1\x54\x20\x95\x05\xd6\x34\xf5\x06\xac\x72\xc2\xa1\xb2\x15\xff\x36\x4a\x42\xa9\x78\x4b\x55\xab\x70\x5b\x3c\xac\xb0\x47\x5f\x30\x87\x06\xd8\xd2\xa2\x06\xad\x5a\x2b\x64\x05\x8f\xad\x85\x47\x5c\x2a\x8d\xc0\x5a\xbb\x42\x69\x05\x77\xbe\x8f\xe1\x51\xc8\x92\x44\x98\x2c\xe1\x99\xd5\xa2\x74\xef\x93\xd1\x31\x76\xe7\x2c\xd5\xb2\x22\x10\x9c\x43\xff\x29\x71\x68\xe8\x50\x2a\x2d\xbe\xa1\x26\x5f\x5b\x83\x25\xb9\xc0\xe2\x5b\x60\xa0\xf1\x6b\x8b\xc6\x06\x7c\xe4\x1c\xe9\x38\xeb\x2e\x82\x2f\xcc\x00\x67\x75\x8d\x25\xb4\x86\x70\x91\x88\x3b\xec\x57\xe9\x4e\xca\xb8\xcd\x08\x31\xad\x36\x5a\x48\x2e\x1a\x56\x3b\x65\x63\x95\xc6\x12\x84\x74\x6b\x21\x37\xe3\x63\x1a\x6a\x49\xba\x5b\x78\x66\x75\x8b\x45\x32\xea\x21\x77\x9e\x5e\x39\xe7\xbe\x78\xb4\x39\xb8\xba\x9c\xf4\xd3\xe7\x3e\x54\xc5\x1b\x5c\x0a\x29\x4e\x4f\xf0\xdc\xfc\xc0\x8c\xe0\xce\x3b\x7f\xf8\x3c\x3d\x87\x19\x36\xbf\xa1\xb3\x46\x49\xf1\x48\xd2\x47\xd1\xf1\xb0\x06\x35\x08\x63\x6b\x50\x43\xcc\xbf\x86\x19\x13\x1e\x72\xc8\x7a\xa9\x38\xf6\xe0\xf3\x93\xe3\xec\x51\xce\x16\xf3\x5f\x70\x73\x11\xcc\x59\xd3\xd4\x02\x0d\xbc\xac\x30\xd0\x49\x75\x23\x1c\x92\xd4\x57\x23\xd5\x6a\xee\x4a\x8a\x30\x60\xd0\xbe\xe1\x81\x55\x4f\x28\x2f\x43\x7d\x00\xfa\x8e\xac\xfe\xf1\x4d\xc0\x3f\x29\x0d\x41\xf4\x5d\xc4\xf6\x61\x8d\xc1\x70\xd5\xa0\x81\x7f\xfc\xf3\x5d\xec\xc6\xdf\x3b\x80\x61\x77\x3a\xff\x8a\x8e\x86\x8b\x3a\xab\x6b\xf0\x11\x38\x45\xb8\x0b\xcc\x5e\xf3\xa0\xe2\xec\xfe\x86\x4c\x2c\x1e\x08\xf6\xec\xc0\x4c\x0e\xe1\x16\x2f\x0e\x0c\xbd\x0d\xea\x07\x64\x1a\xf5\x09\xa8\x5d\x4e\x1f\x63\x8a\x18\xfe\x66\x50\x2f\x98\x31\xbf\x17\x8c\xc1\x53\xe1\xc1\x7d\x8f\x9a\x08\xe7\x9e\x62\x57\xbe\x83\x18\x7f\xbf\x84\xa2\x06\x1a\x6d\xab\xa5\x01\x26\x0f\x8a\x1d\x54\xe2\x39\x1c\x81\x58\xc7\x0f\xee\x21\x32\x31\xb7\xb0\x56\xad\xb4\xc6\xf9\x41\xa2\x8f\x54\xd0\xd0\x18\xa8\x55\x25\x38\xb5\x49\x35\x52\x21\x47\x6d\x62\x7d\xf2\x3d\x68\xa8\xda\x45\x42\x3e\x45\x2c\x19\x0f\x97\x59\x0e\x07\x65\x38\x26\x20\x5d\x6e\xab\x31\xfc\xcb\x3d\x53\x87\x15\xd6\x67\x8b\x79\xc6\xf3\x64\xe4\x5d\x81\x95\x5b\x3f\x74\x93\xba\x93\x0f\x78\x1a\xeb\x30\x57\x5a\xfb\xdb\x9b\xea\xf6\xd5\x70\xa7\x21\xa4\xb1\x4c\x72\x2c\xfe\x1b\x1c\x39\x5f\xcf\xd1\x74\xf5\x76\x3f\x32\x5b\xcc\xfb\x74\x9a\x06\xf9\x8e\x4e\xd7\x79\x17\x33\xc9\xea\xcd\x37\x2c\xb3\x70\x25\xd3\x87\x43\x76\xef\x7f\xff\xe5\xfe\xee\x36\x1f\x43\x9a\xe6\xc9\x48\x2c\x9d\xde\xff\x4d\x41\x8a\x9a\x6c\x45\xfe\xa5\xa8\xc7\xfe\xbf\xe5\xda\x16\x3f\xd2\x5e\xcb\x2c\x65\xde\x6c\xbc\xe8\x3f\xc1\x1f\x9e\x53\xb7\x73\x9e\x8c\xba\x64\xc4\x1a\x41\x10\x0e\x1c\xb8\xc5\x97\x73\x3e\x64\x04\x3c\x77\x6a\xc5\x3d\xea\x67\x74\xdb\xc0\xd4\xbb\x66\x7a\xef\xbc\x4c\x68\x67\xa6\xc0\xc3\xcf\xc4\x39\xc0\x8b\xa1\x12\xd4\x73\x89\x74\x87\x44\xa6\xc3\xaa\xce\x15\x67\x77\xa0\x8a\x1c\xdb\x1d\x12\x99\x0e\xaa\xf6\xcc\x0e\x94\x85\x13\xbb\x43\x32\xd3\x61\x65\xb2\xdc\xbf\xf2\x3f\x2b\x69\xda\x35\x1e\xdd\xf3\x31\x45\xd9\xbe\xcf\xa6\x8d\x06\x83\x13\x2c\x10\x45\x74\x5b\x1e\xe9\xc6\x9b\x83\xfa\xf7\x4b\xcd\xc4\x2a\x16\x5f\xfd\x44\x65\xd0\xd5\x42\x0d\x42\x15\x5f\x90\x95\x94\xfc\x96\xe9\x0a\x2d\xf4\x3b\x54\x9f\x0d\xfd\xdc\x0c\xe9\x71\xab\xec\x0e\x18\x96\x59\xba\xdd\x86\xaf\x23\x3a\xfa\x7e\xdf\x15\x33\xae\x4b\xdd\x20\xf5\x95\x28\x7b\x07\xb5\xa4\xf4\xef\xce\xdf\x87\x3d\x3e\x17\x5a\x95\x2d\xff\x08\x9f\xc1\xc2\x05\x7c\x5e\x6c\x27\x12\x1a\x5f\xed\x09\x7d\x21\x42\x7f\xd3\xc2\x12\xa1\x25\xb3\xec\xa3\x74\x36\x71\xd7\x0f\xd0\xf9\xa1\x96\xf4\x94\x0f\xd7\x04\x39\x81\xe9\x9b\x3d\xe6\x76\x2b\x96\x0e\x76\x06\xf8\x95\xa2\x19\xdb\xf0\xb4\xc7\x4b\x0a\x79\xd7\x5d\xed\x7a\x38\x2a\x61\x51\xae\xeb\x7a\xc5\x16\xc2\x3f\x5f\x77\xce\x34\x67\xd3\x78\x96\xa1\xf7\x2f\xb0\x9d\xa6\xae\xae\xee\x96\xba\x7d\x20\xce\x1a\x74\xde\x79\xb7\x7c\xa1\xbd\xa8\x43\xbe\x80\xb5\xa3\xbe\xf6\x77\x65\x6a\x74\x39\x4d\xa3\x23\x8e\x1c\x2c\x4f\xd3\xe8\x62\x8e\x9c\xd2\x01\x3d\x67\x5b\xf1\x77\x32\x33\xd4\x5a\xff\x6f\x25\x55\x8f\xb0\x77\xe5\x55\xd0\xf3\xee\x0d\xa6\xd6\xc1\xf9\x75\x13\x9f\x73\x87\x37\xdc\xb2\xbd\x0f\xd4\xe9\xfe\x8b\x5a\x67\x1e\x84\x7f\xc8\xcf\x96\x86\xe3\x31\x93\x8f\x14\x51\x8d\xfb\x51\x5c\x9c\xcf\x11\xa3\x3d\x97\x16\xfb\xb7\x28\x4b\x37\x1f\x3d\xad\xa0\xb1\x5f\x9c\x3a\xa2\xb6\xdb\xeb\x9d\xde\xac\x16\xcc\xc0\xb9\x96\x2b\xe8\xed\xab\xec\xc9\xf0\xc8\xe9\x7f\x7f\x82\xe4\x3c\xd9\xf3\x50\x52\x12\xec\xa7\x02\xbd\xc4\x09\x1e\x0c\x4f\x9c\x5c\xed\xe6\xf6\x95\x5a\x2d\x8f\xa2\xf8\xf9\xe1\x61\x11\x66\x00\x71\xbc\x95\xe5\xc9\x28\xc6\x6c\xbf\xa3\x67\xd5\x69\x4f\xfd\x08\x82\xd6\x32\x6e\x5f\x7b\x48\x82\xe6\x2e\x0d\xf6\x79\x34\xcc\xf7\x6c\x31\x3f\x5c\xf1\xf7\x46\xb0\xea\x67\x67\x27\x97\x43\xaf\xed\xd3\xf7\xab\xd6\x96\xea\x45\xc6\xc3\x97\xc3\xd6\x25\x70\xd8\x77\x27\x98\xf1\xe2\x68\xdc\x93\x8f\x69\xd5\x67\xbe\xff\x56\xe8\x35\xbc\xc0\x55\x23\xd0\xf4\x47\x53\xe0\x46\x53\x56\x41\xa3\xf1\x19\xa5\xf5\xf7\xa3\x66\x74\xbb\x0b\x19\x2f\x55\xdf\xac\xf7\x5b\x67\xa5\x45\xe5\x74\x8b\x2f\xec\xe5\x57\x34\x86\x55\x98\x1f\xbf\xa0\xc0\x70\x8a\xca\x9a\x3d\x61\x76\xb4\x38\x86\x1a\xa5\xb3\x93\xe7\xc9\x88\x93\x51\x3e\x06\xf7\xbc\x73\x94\x07\x1f\xd8\xc1\x78\x8a\xc1\x0a\xeb\x26\x0c\x7c\x5c\xc3\x60\xd5\xfe\xe6\xf5\xdf\x1a\xbd\x6f\xc4\xa8\x18\xb3\xa9\xf0\x13\x46\x76\xd1\xe0\xc8\x39\x9e\xb1\x9e\x74\xbe\x1f\x96\x65\x1a\xbf\xc2\x81\xde\x99\xf4\xed\x35\x19\x62\x09\xac\x57\xe8\x7b\x9f\x17\xae\xda\x84\x34\xde\x67\xa2\xc6\xaf\xfb\x0c\x3e\xcc\xc9\x98\x0d\x4e\xe6\x37\x61\x57\x51\x8e\xdb\xd7\x3c\x27\xea\x7c\xd8\xfa\x59\x3d\x30\xf4\x1d\x06\x7c\x24\x47\x58\x63\x50\xc2\x0a\xed\xf8\x77\x56\xb7\xe8\xf3\x3a\x4c\xe8\x0e\x20\x76\xc9\x7f\x02\x00\x00\xff\xff\xf4\x62\xb6\x58\xf4\x19\x00\x00") func templatesContribStratoscaleServerConfigureapiGotmplBytes() ([]byte, error) { return bindataRead( @@ -255,12 +242,12 @@ func templatesContribStratoscaleServerConfigureapiGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/contrib/stratoscale/server/configureapi.gotmpl", size: 5930, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9f, 0xe7, 0xab, 0x9c, 0xfb, 0xa9, 0xfe, 0xe4, 0x65, 0xe7, 0x8e, 0xd9, 0x98, 0xce, 0x54, 0xfd, 0x7d, 0x8b, 0xdc, 0x7d, 0xa, 0x7c, 0xf3, 0x61, 0xfe, 0x93, 0x4a, 0x7f, 0x26, 0xe3, 0xb4, 0xe1}} + info := bindataFileInfo{name: "templates/contrib/stratoscale/server/configureapi.gotmpl", size: 6644, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x40, 0xda, 0x58, 0x57, 0x11, 0x3a, 0xc4, 0x3e, 0x12, 0x28, 0x47, 0xd7, 0x99, 0x62, 0xa, 0xad, 0x1c, 0x36, 0x53, 0xbb, 0x8a, 0xae, 0x4d, 0x9f, 0x56, 0x4f, 0x73, 0x34, 0x5a, 0xca, 0x14, 0xb2}} return a, nil } -var _templatesContribStratoscaleServerServerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x5c\x8e\x31\x4e\x03\x31\x10\x45\x7b\x9f\xe2\x77\x54\x59\x1f\x80\x0a\x25\x14\x69\x48\x8a\x5c\xc0\xac\x27\xf6\x08\xef\x78\x65\x8f\xb0\x2c\xcb\x77\x47\x41\x08\x21\xca\xff\xdf\x2b\x9e\xb5\x38\x66\x4f\x08\x24\x54\x9c\x92\xc7\x7b\x47\xc8\x87\xda\x5c\x08\x54\x9e\x71\xba\xe0\xed\x72\xc3\xeb\xe9\x7c\x5b\x8c\x31\x63\x80\xef\x58\x8e\x79\xef\x85\x43\x54\x1c\xe6\xb4\x16\x63\x60\xcd\xdb\x46\xa2\xff\xd8\x18\x20\xf1\x98\xd3\x18\xb3\xbb\xf5\xc3\x05\x7a\xc8\xcb\xcb\xf5\x7c\xfd\x99\x0f\x66\x2d\x34\x72\xc5\x9d\x13\x81\x2b\x58\x94\x44\x39\x8b\x4b\xa9\x83\xb6\x5d\xfb\x82\xac\x91\x4a\xe3\x4a\x7f\x02\xd1\x38\xa5\xdf\x7a\x38\x54\x2a\x9f\xdf\xb7\xae\x11\x8d\xe0\xb3\x3c\x29\x9a\x13\x35\x5f\x01\x00\x00\xff\xff\xfd\xeb\x4b\x38\xec\x00\x00\x00") +var _templatesContribStratoscaleServerServerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x5c\x8e\x31\x6e\x03\x21\x10\x45\x7b\x4e\xf1\xbb\x54\x5e\x0e\x90\x2a\xb2\x53\xb8\xc9\xba\xf0\x05\xc8\xee\x18\x46\x61\x87\x15\x8c\x82\x10\xe2\xee\xd1\x4a\x51\x14\xb9\xfc\xff\xbd\xe2\x59\x8b\x73\x5a\x09\x9e\x84\xb2\x53\x5a\xf1\xd9\xe0\xd3\xa9\x54\xe7\x3d\xe5\x57\x5c\x66\x7c\xcc\x77\xbc\x5f\xae\xf7\xc9\x18\xd3\x3b\xf8\x81\xe9\x9c\xf6\x96\xd9\x07\xc5\x69\x0c\x6b\xd1\x3b\x96\xb4\x6d\x24\xfa\xc4\x7a\x07\xc9\x8a\x31\x8c\x31\xbb\x5b\xbe\x9c\xa7\x43\x9e\xde\x6e\xd7\xdb\xef\x3c\x98\xb5\xd0\xc0\x05\x0f\x8e\x04\x2e\x60\x51\x12\xe5\x24\x2e\xc6\x06\xda\x76\x6d\x13\x66\x0d\x94\x2b\x17\xfa\x17\x88\xca\x31\xfe\xd5\xc3\xa1\x50\xfe\x3e\xee\xc0\x4b\x40\x25\xac\x49\x5e\x14\xd5\x89\x9a\x9f\x00\x00\x00\xff\xff\x2d\x16\x0f\xd5\xec\x00\x00\x00") func templatesContribStratoscaleServerServerGotmplBytes() ([]byte, error) { return bindataRead( @@ -276,11 +263,11 @@ func templatesContribStratoscaleServerServerGotmpl() (*asset, error) { } info := bindataFileInfo{name: "templates/contrib/stratoscale/server/server.gotmpl", size: 236, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa2, 0x7d, 0x4f, 0x36, 0x58, 0x28, 0x19, 0xa4, 0x74, 0xeb, 0xf1, 0xd5, 0x9e, 0xf2, 0x58, 0x68, 0x9a, 0x5a, 0xc8, 0x58, 0x99, 0x36, 0xaf, 0x14, 0xd6, 0x80, 0x71, 0xf4, 0xfc, 0x40, 0x31, 0xf1}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0xd5, 0x5d, 0x94, 0x14, 0x1a, 0x11, 0x8d, 0xcb, 0x6b, 0xa2, 0x86, 0x57, 0x64, 0xf6, 0xea, 0xef, 0x64, 0xb9, 0x5b, 0xa4, 0x99, 0x23, 0x68, 0x3e, 0x81, 0x90, 0x35, 0x51, 0x9e, 0xff, 0xb5}} return a, nil } -var _templatesDocstringGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x8e\x41\x0e\x82\x40\x0c\x45\xf7\x73\x8a\x1f\xf6\x32\x97\x70\xed\xca\x0b\x10\xf8\x68\x13\xa6\x63\x98\x71\x63\xd3\xbb\x1b\x43\x44\x82\xec\x9a\xf6\xbf\xff\x6a\x36\x70\x14\x25\x9a\x21\xf7\xa5\xce\xa2\xb7\xc6\x3d\x00\x66\x27\xc8\x88\xf6\x2a\x75\x22\xdc\x11\x80\x65\xdb\xe7\x94\xa8\xf5\xe8\xf4\x01\xce\x2c\xfd\x2c\x8f\x2a\x59\xe1\x1e\x62\x0c\x31\xc2\xec\x87\xed\x02\x5f\x96\x3a\x60\x35\x73\x2a\xdc\xb7\x1d\xfe\xf0\x57\xb6\xd2\xee\x66\xb8\x3f\x53\xa7\xf2\x22\xda\x4b\x97\xb8\x49\x2c\xb2\xcd\xf8\x0e\x00\x00\xff\xff\x79\x3c\xdd\x12\x09\x01\x00\x00") +var _templatesDocstringGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x8e\x41\xae\x83\x30\x10\x43\xf7\x9c\xc2\x62\xff\xc9\x25\xfe\xba\xab\x5e\x00\x25\xa6\x1d\x89\x4c\x2a\x92\x6e\x3a\xe2\xee\x15\x8a\x5a\x22\xca\x6e\x64\x3f\xdb\x63\x86\xc0\x49\x94\xe8\x43\xf2\xb9\x2c\xa2\xb7\x1e\xeb\xda\x01\x66\x7f\x90\x09\xc3\x55\xca\xcc\x2a\x55\xd1\xa7\x18\xa9\xe5\xc4\xd9\xf0\x7f\x66\xbf\xc8\xa3\x48\xd2\xcd\x72\xae\x73\x0e\x66\x7b\xea\x00\x7c\xb2\xd4\xb0\xef\x72\xce\x3c\xb6\x9d\x7d\xf0\xd3\xf5\x0d\x37\xf4\xfd\x19\x47\x95\x17\x31\x5c\xc6\xc8\x86\xab\x8b\xcd\xf9\x0e\x00\x00\xff\xff\x57\x05\xa1\xd1\x0e\x01\x00\x00") func templatesDocstringGotmplBytes() ([]byte, error) { return bindataRead( @@ -295,12 +282,12 @@ func templatesDocstringGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/docstring.gotmpl", size: 265, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe3, 0xe7, 0x27, 0x1f, 0x51, 0x5c, 0x3b, 0x4d, 0x96, 0x68, 0x52, 0x9f, 0x19, 0x4e, 0xab, 0xe9, 0x1d, 0x17, 0x4a, 0x4d, 0x6d, 0xb8, 0x33, 0xe, 0xff, 0xe1, 0xcf, 0x48, 0x56, 0xac, 0x24, 0xe8}} + info := bindataFileInfo{name: "templates/docstring.gotmpl", size: 270, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1d, 0x3e, 0x50, 0x87, 0x7e, 0xc7, 0xce, 0xf0, 0x64, 0xaf, 0x8f, 0xab, 0x38, 0x17, 0xd1, 0xd7, 0x49, 0x9, 0xe4, 0x59, 0xa4, 0xdd, 0x14, 0x7b, 0x7b, 0xa3, 0x65, 0xb9, 0xe6, 0xf6, 0xa1, 0x23}} return a, nil } -var _templatesHeaderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x8e\x41\xaf\xda\x30\x10\x84\xef\xfe\x15\xa3\x88\x4a\xad\xd4\xd8\xf7\x56\x3d\x01\x07\x2e\xe5\x1d\xf8\x03\x86\x6c\x1c\x8b\xc4\xce\x73\x36\xa0\x68\xe5\xff\xfe\x44\x02\x48\xa0\x77\xf2\x78\x67\xe7\xdb\x31\x06\xeb\x58\x11\x1c\x05\x4a\x96\xa9\xc2\x71\x82\x8b\xe5\x70\xb5\xce\x51\xfa\x8b\xcd\x1e\xff\xf7\x07\x6c\x37\xbb\x83\x56\x4a\x89\xc0\xd7\xd0\xeb\xd8\x4f\xc9\xbb\x86\x51\xe6\x6c\x0c\x44\x70\x8a\x5d\x47\x81\xdf\x3c\x11\x50\xa8\x90\xb3\x52\xaa\xb7\xa7\xb3\x75\x04\x11\xfd\xb1\xc8\xdb\xd8\x18\x1c\x1a\x3f\xa0\xf6\x2d\xe1\x6a\x87\xd7\x2a\xdc\x10\xee\x5d\xc0\x31\xb6\xfa\xb6\xbf\xad\x3c\xfb\xe0\xc0\xcf\x5c\x37\xdf\xeb\x53\xbc\x10\xea\x91\x67\x54\x43\x01\x53\x1c\x91\xa8\x4c\x63\x78\x21\x3d\x4e\xcc\xa5\x6d\xa8\x94\xf2\x5d\x1f\x13\xe3\xa7\x02\x06\x4e\x75\xc7\x28\x9c\xe7\x66\x3c\xea\x53\xec\x8c\x8b\x65\xec\x29\xd8\xde\x9b\xc5\x2d\x94\x88\xaf\x11\x13\xf4\x6e\x4e\x0e\xd0\x1b\xaa\xed\xd8\xf2\xe3\x9f\xb3\x02\x5c\x4c\x63\x60\xdf\x11\x8a\xbb\x28\x14\x20\x92\x6c\x70\xf4\x4d\x44\x04\x7d\xf2\x81\x6b\x14\x3f\x3e\x0b\xe8\x19\x22\x42\xa1\xba\xab\x25\xb8\x3a\xd3\xf4\x1b\xab\x8b\x6d\x47\xc2\x9f\x7f\xcf\x12\x33\xe0\x66\x22\x67\xbc\xb1\x96\xed\x17\xe0\xe3\xfd\xa5\xbe\x02\x00\x00\xff\xff\x78\xb1\x8a\x20\x07\x02\x00\x00") +var _templatesHeaderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x90\x31\x6e\xf3\x30\x0c\x85\x77\x9d\xe2\x21\xd3\xff\x0f\xb6\x0e\xd0\x31\xc9\x90\xa5\xe9\xe0\x0b\x28\x36\x2d\x0b\xb5\x44\x41\xa6\x1b\x18\x82\xef\x5e\xc8\x4d\x8a\x04\x48\x37\x4a\xe4\xf7\xf8\xf8\xb4\xc6\x9e\x3b\x82\xa5\x40\xc9\x08\x75\xb8\x2c\xb0\x5c\x4d\x57\x63\x2d\xa5\x37\x1c\xce\x78\x3f\x37\x38\x1e\x4e\x4d\xad\x54\xce\x70\x3d\xea\x3d\xc7\x25\x39\x3b\x08\xaa\x75\x55\x5a\x23\x67\xb4\xec\x3d\x05\x79\x6c\xae\xab\xca\xb9\x02\x85\xae\x94\x2a\x9a\xf6\xd3\x58\x42\xce\xf5\xc7\x4f\x59\x7e\xb5\x46\x33\xb8\x09\xbd\x1b\x09\x57\x33\x3d\x5b\x91\x81\x70\xf3\x02\x61\x1e\xeb\x32\x7f\xec\x9c\xb8\x60\x21\xbf\x9c\xdf\xf6\xc5\xc4\x5f\x84\x7e\x96\x4d\x6a\xa0\x80\x85\x67\x24\xaa\xd2\x1c\x9e\x94\xee\x2b\x36\xd3\x26\x74\x4a\x39\x1f\x39\x09\xfe\x29\x60\x67\x9d\x0c\xf3\xa5\x6e\xd9\x6b\xcb\x15\x47\x0a\x26\x3a\x3d\x49\xea\xbd\xec\xb6\x8b\x4a\x06\x07\xea\xcd\x3c\xca\x69\x03\xa7\x72\x20\x4a\x0c\xee\xf6\x7e\xd1\x7f\xc8\xe2\x2e\xf2\x27\xfd\x1a\xfb\xaf\xbe\x03\x00\x00\xff\xff\x6d\xc8\xeb\xdb\xb0\x01\x00\x00") func templatesHeaderGotmplBytes() ([]byte, error) { return bindataRead( @@ -315,12 +302,12 @@ func templatesHeaderGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/header.gotmpl", size: 519, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcd, 0xca, 0x67, 0x57, 0x80, 0x72, 0xe7, 0xc3, 0x16, 0x8c, 0x5b, 0x2c, 0x57, 0x38, 0x73, 0x77, 0x87, 0x97, 0xb9, 0x95, 0x4f, 0x5d, 0x95, 0x92, 0x40, 0xcf, 0x74, 0xa2, 0x63, 0xf2, 0xf8, 0x30}} + info := bindataFileInfo{name: "templates/header.gotmpl", size: 432, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x21, 0xa9, 0x34, 0x41, 0xf7, 0xc5, 0xe2, 0xa2, 0x27, 0xc7, 0x82, 0x0, 0xae, 0x5f, 0x7e, 0x4, 0x73, 0xb6, 0xb7, 0xf9, 0x5d, 0x91, 0xad, 0xe8, 0xdf, 0xc6, 0xf8, 0x4, 0xfb, 0xbf, 0xcf, 0x40}} return a, nil } -var _templatesModelGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x51\xcd\x4e\xf3\x40\x0c\xbc\xf7\x29\x46\xb9\x37\xb9\x7f\xb7\x7e\xa2\x48\x3d\x80\x10\xf0\x02\x56\xd6\xa4\x2b\x6d\x76\xc3\x7a\x11\x05\x2b\xef\x8e\x92\x6e\xaa\x2d\x3f\x12\xaa\xb8\xd9\x1e\x7b\xec\x19\xab\x22\x71\x3f\x38\x4a\x8c\x6a\xcf\x64\x38\x56\xa8\x31\x8e\xab\x95\x2a\xec\x13\xea\x9d\x6f\xdd\x8b\xe1\x9b\x60\xd8\x4d\x75\x40\x75\x3d\x21\xfc\x8c\xfa\x96\x7a\x46\xb5\x19\xec\x3d\xcb\x10\xbc\x70\x85\x71\x6c\x1a\x6c\xee\x76\x4b\x05\x56\x90\xf6\x8c\xb8\xe4\x29\x80\xfc\xd4\x81\x96\x9c\xab\x33\x21\x3b\xe1\x23\xfd\x69\x41\xbd\x93\xed\x61\x08\x31\xb1\xc1\x3a\x43\x40\xd3\x40\x15\x03\x49\x4b\xce\xbe\x73\xbe\x61\x1c\x71\x26\xc5\x84\x56\x52\xb4\xbe\xcb\x6a\x8e\xb3\x99\xd8\x87\x34\x91\xff\x27\xe1\xc7\xb7\x61\x5e\xdb\x34\x90\x57\xea\x3a\x8e\xff\xfa\x59\xa9\xea\x89\xb9\x18\x5e\xae\x2c\xda\x8d\x95\x36\xda\xde\x7a\x4a\x21\x96\x63\x73\x7c\x55\xa2\xd7\x96\x9d\xf9\x44\xe8\x4d\xa9\x3a\xa7\x3f\x85\x85\x40\x69\xf7\xdc\x53\xf1\xab\x48\xbe\x63\xd4\xdb\x43\x8a\xf4\x30\x83\x72\xf6\xae\xd2\xcd\x23\xd9\x37\xdf\xbd\xd4\xdc\x8b\x8d\xfd\x53\x53\xbf\xda\xf6\x5b\x03\x55\x97\x9e\x8f\x00\x00\x00\xff\xff\xea\xef\x8c\xad\x11\x03\x00\x00") +var _templatesModelGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x90\xcd\x4e\x2b\x31\x0c\x85\xf7\x7d\x8a\xa3\x2e\x2b\xdd\x99\xfd\x5d\x22\x8a\xc4\x02\x36\xf0\x02\x56\xe2\x4e\x23\xe5\x67\x14\xa7\xa2\x60\xe5\xdd\x51\xda\xd2\x4e\x07\x54\xb1\x60\x97\xb1\xbf\xb1\xfd\x1d\x55\x14\x0e\xa3\xa7\xc2\x58\x6e\x99\x2c\xe7\x25\x3a\xd4\xba\x50\xfd\x07\xb7\x41\xf7\x18\x8d\xdf\x59\x7e\x4a\x96\x7d\xab\x03\xe7\x8e\xac\xf7\x63\xca\x85\x6d\xab\xf7\x3d\x54\x31\x92\x18\xf2\xee\x83\xd1\x3d\x53\x60\xd4\x8a\xab\x15\x36\x19\x29\xd9\xc5\xe1\xb4\x05\x38\xce\xbb\x10\x14\x63\x2a\x54\x5c\x8a\x72\x66\x1a\xc1\xd1\x5e\x3e\x2e\xb8\x98\x2d\x07\x9a\xdc\x7c\xe2\x16\xaa\xc8\x14\x07\x46\xb7\xde\x97\x4c\x2f\x07\x4e\x66\x06\xdf\xdc\xfe\xde\xee\x37\x7e\x33\xc3\x9b\x8e\x57\xec\xec\x69\x79\xe3\xe2\x7c\x47\xad\xaa\xfd\x0a\x93\x1a\x4a\xc2\xc0\x91\x73\x9b\x2e\x23\x1b\x6c\x72\x0a\x90\xb4\xcb\x86\xb1\xea\xa7\x19\xc5\x54\x5a\x16\x77\x24\xfc\xfa\x3e\xf2\x31\x8b\x16\x87\xbc\xd1\x30\x70\xfe\x1f\x0e\xe1\xa9\x9e\x23\xf9\xba\xd0\xcb\x0f\xb4\x75\x62\xb2\x0b\x2e\x52\x49\x79\xfa\xd7\xe1\x7d\x3f\xed\x3e\x38\xf6\xf6\x96\xf1\x67\x00\x00\x00\xff\xff\x75\xb1\xeb\x60\xbc\x02\x00\x00") func templatesModelGotmplBytes() ([]byte, error) { return bindataRead( @@ -335,72 +322,92 @@ func templatesModelGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/model.gotmpl", size: 785, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa, 0x57, 0x3, 0xb6, 0x3c, 0x95, 0xb2, 0x39, 0x19, 0xdb, 0x48, 0xb4, 0xa8, 0x28, 0xa2, 0x10, 0xbd, 0x53, 0xe7, 0xc2, 0xe, 0xd1, 0x22, 0x17, 0x28, 0xc6, 0x10, 0x7a, 0x2a, 0xf5, 0x52, 0x51}} + info := bindataFileInfo{name: "templates/model.gotmpl", size: 700, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0x6d, 0x2, 0xfe, 0x4b, 0x92, 0x36, 0x80, 0x72, 0x80, 0x1b, 0x63, 0x6b, 0x82, 0x52, 0xe1, 0x99, 0x3b, 0x93, 0x6d, 0x55, 0x34, 0x94, 0xb5, 0x61, 0x84, 0xc5, 0x29, 0x2f, 0x60, 0x8b, 0x6d}} return a, nil } -var _templatesModelvalidatorGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x5c\x50\xbd\x6e\xf2\x30\x14\xdd\xfd\x14\x47\x11\x9f\xf4\x55\x2a\xce\xde\xaa\x13\x30\xb0\x94\x0e\xbc\x80\x8b\x6f\x1c\x8b\xc4\x4e\x9d\x1b\x50\x64\xf9\xdd\x2b\x1b\x5a\x91\x6e\x57\x3e\xbf\x3e\x75\x8d\x8d\xd7\x04\x43\x8e\x82\x62\xd2\xf8\x9c\x61\xfc\x7a\xbc\x2a\x63\x28\xbc\x62\x7b\xc0\xfb\xe1\x88\xdd\x76\x7f\x94\x42\x88\x18\x61\x1b\xc8\x8d\x1f\xe6\x60\x4d\xcb\x58\xa7\x54\xd7\x88\x11\x27\xdf\xf7\xe4\xf8\x0f\x16\x23\xc8\x69\xa4\x24\x84\x18\xd4\xe9\xac\x0c\x21\x46\xf9\x71\x3b\xf3\x73\x5d\xe3\xd8\xda\x11\x8d\xed\x08\x57\x35\x2e\xab\x70\x4b\xb8\x77\x01\x7b\xdf\xc9\xcc\xdf\x69\xcb\xd6\x19\xf0\xaf\xae\x2f\x79\x43\xf0\x17\x42\x33\x71\xb1\x6a\xc9\x61\xf6\x13\x02\xad\xc3\xe4\x16\x4e\x3f\x11\xa5\xb4\x72\x5a\x08\xdb\x0f\x3e\x30\xfe\x0b\x20\xc6\xa0\x9c\x21\xc8\x2d\x35\x6a\xea\x78\x5f\xa0\x31\xff\x65\x08\xd6\x71\x83\xea\xdf\x57\x05\x99\x52\x21\x93\xd3\xf7\xeb\x26\x5b\x9d\x69\x7e\xc6\xea\xa2\xba\x89\xf0\xf2\x06\xf9\xa0\xcf\x58\x4a\x79\xad\x47\xa7\x1b\x77\x61\xf7\x54\x96\x66\xea\x87\x2e\xd7\xac\xc6\x53\x4b\xbd\xba\xa8\xce\x6a\xc5\xd6\xbb\xb1\x82\xcc\xa3\x7e\x07\x00\x00\xff\xff\xca\x6e\x42\x61\xbf\x01\x00\x00") +var _templatesSchemaGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5f\x6f\xdb\x36\x10\x7f\xcf\xa7\xb8\x79\xd9\x20\x05\xa9\xbc\xf5\x69\xeb\x90\x87\xa4\x69\xd7\x0e\x58\x53\xd4\x5d\x0b\xac\x2b\x0a\x5a\x3c\x59\x6c\x29\x52\x25\xa9\xb4\x9e\xe0\xef\x3e\x50\xa4\x64\xca\xa6\x9c\x06\xd9\x80\x61\x58\x9e\x1c\xf1\x74\xbc\xfb\xdd\xdf\x9f\xda\xf6\x1e\xb0\x02\x88\xa0\x90\x3d\xd5\x17\x44\xe3\xcb\x75\x8d\xf6\xf7\xa3\xcf\xb5\x54\x06\x29\x24\x42\x1a\xfb\x60\xd1\xd4\xa8\xce\x39\x23\x3a\x85\xcd\xe6\x08\xc0\xbe\x6b\xb0\xaa\x39\x31\x08\x33\x9d\x97\x58\x91\xe7\x92\xaf\x2b\xa9\xea\x92\xe5\x33\xc8\xac\x9c\x95\x42\xae\xd1\x5e\x33\xd2\xe2\x94\x18\x7b\x5d\xdb\x42\x4d\x74\x4e\x38\xfb\x13\x21\x7b\x46\x2a\x84\xcd\xc6\x3e\xdd\xaa\xb7\x72\x8b\xee\x0a\x6b\xa0\xd3\xdd\xb6\xf3\x13\x78\x2c\x55\xa7\x44\x03\xc5\x9c\x13\x85\x14\x88\x86\x63\x85\x05\x48\x01\x5a\x56\x08\xd2\x94\xe8\x84\x4e\xe1\x7d\xa3\x4d\x2f\x09\xa6\x44\x67\x00\xd1\x40\x60\x25\x39\x11\x2b\x78\x47\xac\x75\x48\xdf\xf9\x37\x30\x5b\x65\x4e\xea\x1c\xce\xe0\x22\x83\x67\x12\x2a\x34\xa5\xa4\xa0\x4b\xc2\x39\x2c\x11\x14\xf6\x97\x67\x00\x27\xf3\x01\x1e\xe7\xf3\x00\x6b\xf7\x1c\xc6\x8e\x2d\xfd\xe1\x02\x15\xeb\x00\x50\x81\x73\xaf\x4b\x14\x9d\x95\x9d\x4d\xdb\x6b\xac\xb9\xf5\x16\x6a\x6f\x29\xc5\x82\x09\x84\x82\xe4\x46\xaa\xb5\x37\x52\xc3\x27\x66\x4a\x30\x25\xd3\x4e\x4b\x16\x1a\x88\x82\x46\x82\xf4\xa8\x5a\x22\xa5\x48\xa7\xe3\xdc\x4b\xec\x06\x39\xf4\x5c\x2a\xab\xeb\xa1\xac\x6a\x8e\x9f\xaf\x96\xef\x31\xef\xf2\xe8\x65\x53\xf3\x2e\xc3\xce\x29\x65\x86\x49\x41\xf8\x73\x25\x6b\x54\x86\xa1\xee\x1d\x7f\x79\x75\x79\x95\x14\x0a\x69\xfa\x00\x4a\x22\x28\x47\xc8\x89\x46\x90\x05\xe8\x66\xd9\x45\x83\x89\x12\x15\x33\x4c\xac\xa0\x50\xb2\x02\x0b\xa4\x8b\x53\xe7\x70\x4c\xfb\x29\x30\xad\x1b\x84\xaf\xef\xdf\xbf\xff\x5d\x0f\x83\x8f\x88\xf5\xdc\x67\x5e\x9f\x93\xac\x00\x9f\xfb\x43\x31\x58\xf3\x06\xb9\xb6\xed\x9d\x8e\x26\xb0\x3d\x16\x34\xfc\x31\x8e\xbc\x43\xf2\x42\xd2\xb5\x47\xd1\x59\x72\x0f\x14\x11\x2b\x84\x6c\x84\xca\x60\xe8\x54\x52\xd9\xbf\xf9\x3c\x52\x4a\x9b\x0d\xac\xd0\xe8\x2e\x8d\xda\x16\xca\xa6\x22\x62\x54\x67\xb2\x70\xd9\x31\x00\xd8\x45\xc0\x66\x76\xbd\xb5\xe0\x53\xc9\xf2\x12\x6c\xd1\xc8\x02\x48\x00\xb6\x95\x21\x2b\xeb\x10\x33\x1a\x98\x30\xa8\x0a\x92\x63\x88\x2e\x40\xd1\x88\x1c\x92\xb6\x85\xe3\xec\x05\xe6\xc8\xae\x51\x79\xd3\x4e\x46\x06\x1f\x7b\x8b\xd3\xa8\x1f\x49\x1a\x03\x30\xe8\x07\xc3\x7d\x03\x50\xf8\x11\x8e\xb3\x4b\xa6\x73\xc5\x2a\x26\x88\x91\xea\x31\x43\x4e\x07\xe7\x83\x37\x00\x14\x9a\x46\x89\xee\x6a\xc5\x84\x29\x60\xf6\xcd\xc7\xd9\xee\xfb\xaf\x08\x6f\x76\xde\x1c\x67\x7f\x4c\xdf\xd8\x6d\xd8\x6c\xb2\xb6\xcd\x49\x85\xa1\x77\x9d\x61\xbb\x5a\x05\x0d\x95\x6e\x8e\xc2\x50\x2f\xd0\x44\xa3\xad\x6f\x17\xed\x3b\x04\x69\xc2\x82\xe4\x9a\xf0\xc3\x91\x4a\x21\x12\x2b\x81\xb7\x88\xd5\x6d\x40\x85\x33\xb8\x26\xfc\x26\x68\xa3\x47\x91\x7f\x6d\xf9\x5d\x62\x41\x1a\x6e\xf6\xbb\x15\xdc\x1b\x5a\xcc\xf7\x3f\xfc\x18\x16\x41\x8f\xee\x61\x6c\x7b\x5f\x53\xf8\x4d\x54\x44\xd9\x01\xf3\xcb\xe2\xea\x59\xb2\x84\x37\x6f\x97\x6b\x83\x29\xa0\x52\x52\x05\xf0\x4d\x0f\x50\x37\x65\xa3\x47\xc3\xdb\xd7\x44\x81\x39\xf0\xfa\x20\x68\x6b\x49\x29\x78\x70\x06\xef\xb5\x14\xd9\x60\x5d\xe2\xec\x4a\xda\x36\xac\x99\xc4\x0a\x0d\x30\xa5\x9b\x4d\x7a\x0a\xdf\x9a\xf4\xa7\x4e\xc7\x57\x67\x20\x18\x1f\x65\x80\xaf\x14\x54\x6a\x2f\x20\x07\xae\x5e\xde\x41\xe9\xc9\x7e\x24\xce\xe2\x38\x24\x26\x3d\xda\x51\x29\x58\x9f\x4d\x91\x2c\xd9\xed\x06\x77\xd9\x70\x8e\x22\xba\x59\x01\x89\xdf\xd7\x9e\xdb\x4a\x31\xec\xda\x8d\x53\xb7\xb6\x74\x33\xb7\xd1\x46\x56\x8f\xa5\xaa\x88\x31\xa8\xdc\x0a\x97\x68\xa3\x98\x58\x3d\x94\xc2\x10\x26\x34\x64\xbf\xa3\x92\x30\x4b\xfe\x98\xcd\xd2\x34\x8d\xee\x26\x7e\x13\xda\x5d\x4d\x26\xac\xea\xb6\xbb\xe5\xce\xa2\xe3\x67\xd9\x39\xe7\x57\x45\x38\xc6\x0e\x0d\xb9\xa9\x31\xf7\x37\xcd\x39\xbf\x40\xec\xf5\xbd\xff\x67\xd3\xbf\x65\x36\xdd\x39\x42\xff\xc1\xc1\x14\x39\xdc\x3e\x98\xda\x99\xa3\x2b\x36\x13\xc1\xfa\x36\x4c\xa8\xbd\x49\x17\xa0\x54\x91\xfa\x4a\x2d\x38\xcb\xf1\x67\xb4\x0d\x65\xaa\x0d\xec\x01\xbb\xd7\x39\x76\x38\xc7\x40\x3d\x45\xce\x1b\x8a\xaf\x08\x67\xd4\xe2\x1b\x25\x9d\xfd\xb3\x9e\x7b\xa4\xbd\xe3\xbe\x4d\x79\x1a\xb8\xa5\x6a\x40\x65\xb7\xc0\x5b\xda\xd4\x31\xa3\x9e\x11\x8d\x19\x9a\xb5\xc0\x75\x48\xc7\x58\x9e\x0e\x3b\xac\x35\xc0\x28\x24\x55\x9a\xba\xc3\x17\xf8\xb1\x61\x96\x62\x66\x4f\x88\xf6\xd6\x32\x69\x9b\xe9\x13\x32\xb4\xaa\x78\x2f\x75\x80\x5c\xf7\x1e\x8e\x21\xf4\xd4\xeb\x06\x23\xec\x0b\xf3\x39\xf8\x7b\x11\xbc\x32\xeb\xb3\xad\x9a\x58\x49\x75\xf8\xb8\x9a\xea\xee\x07\x66\xd9\x58\x85\xc2\x97\xa1\x6a\x84\x61\x15\x66\x5e\x27\x59\x72\x0c\x76\xf8\x65\x63\xa0\x24\x1a\x84\xec\xef\xea\x9c\x35\x12\xf2\x12\xf3\x0f\x0e\xc7\xa9\xc5\xc6\x11\x28\xe7\xcd\xc0\xf9\xf6\xd8\xe0\x04\x09\x3c\x09\xc9\x93\x53\x93\xec\x70\xb1\x14\xc2\x9a\xf4\xd4\x11\xc6\x75\x76\x0b\x92\x96\x0e\xb8\x26\x45\x37\x38\x35\x68\xa3\x8a\xca\x64\x2f\x70\xc5\xb4\x51\xeb\x70\xf7\x0a\x16\x81\x9d\x99\xdf\x21\x1e\x90\x44\xa0\x12\x75\x17\xd9\x01\xfa\x9b\x91\x7f\x00\x42\xca\x7a\x8a\xa8\x8f\xea\x27\x7b\x4d\x84\xd1\xbf\xba\x95\xe8\x82\x09\xa2\xd6\x91\x72\xac\xc2\xf3\x9b\xaa\xd2\x57\x4b\xa4\xec\xbd\x7b\x9a\xad\x04\x31\x8d\x42\x28\xa4\x8a\x37\x19\x5b\x54\xdb\x83\xa7\x06\x2b\x6d\xc7\xb3\xdd\x46\x6c\xc2\xec\xd6\xa0\x8f\xed\xfe\x97\x12\xe7\xe3\x13\x32\x95\x28\x41\x2b\xec\x68\x7f\x76\x58\xce\xef\x0e\xe1\x07\x0d\x2a\x73\xb7\x19\xf5\xdf\x5d\xc2\x43\xcf\x80\xd7\xdb\x5a\xbf\x94\xf9\x22\x10\x0f\xba\x73\x6c\x77\x4c\xa1\x22\xf5\x1b\xa7\xff\xed\xc1\xc9\xf3\xc5\xfc\x63\xd7\x4d\x87\xed\xa0\xe0\x9f\xf1\x6f\xca\xbb\x37\x5f\xe0\xd4\x81\xed\x78\x3e\xff\x82\x11\xa5\x4b\xd9\x50\x58\xa2\x1f\x6a\xd4\x7d\xc3\xe3\xec\x03\x82\xc2\x55\xc3\x89\x0a\x3e\x54\xec\x4d\x42\x42\x29\x14\x0d\xe7\xa0\x9b\xda\x36\x8e\xe9\x94\x8d\xcd\x45\x6b\xa0\x71\x0d\xb4\x92\xb6\x76\x4f\xbb\xe2\x1d\x7f\xfe\xb0\x00\x02\xd3\x50\x37\xba\x44\x0a\x54\x7e\x12\xb6\x47\x5a\xc1\xed\x26\x13\x2f\xe2\xbf\x02\x00\x00\xff\xff\xde\xd7\x2a\x36\x80\x15\x00\x00") -func templatesModelvalidatorGotmplBytes() ([]byte, error) { +func templatesSchemaGotmplBytes() ([]byte, error) { return bindataRead( - _templatesModelvalidatorGotmpl, - "templates/modelvalidator.gotmpl", + _templatesSchemaGotmpl, + "templates/schema.gotmpl", ) } -func templatesModelvalidatorGotmpl() (*asset, error) { - bytes, err := templatesModelvalidatorGotmplBytes() +func templatesSchemaGotmpl() (*asset, error) { + bytes, err := templatesSchemaGotmplBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "templates/modelvalidator.gotmpl", size: 447, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc6, 0x56, 0x93, 0xbc, 0xe3, 0x93, 0xee, 0x31, 0x24, 0xfd, 0x3b, 0xd2, 0x6, 0xdf, 0x96, 0x98, 0x88, 0x54, 0x60, 0xd8, 0x4e, 0x3f, 0xa5, 0xe, 0x36, 0x0, 0xe8, 0xa4, 0xef, 0x48, 0x51, 0xd1}} + info := bindataFileInfo{name: "templates/schema.gotmpl", size: 5504, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4d, 0x80, 0x58, 0x1d, 0x87, 0xd8, 0xdb, 0xff, 0xc9, 0x33, 0x69, 0x35, 0x93, 0x22, 0x2, 0xe3, 0x44, 0xb, 0x31, 0x1a, 0xe7, 0x60, 0xc2, 0xe8, 0x97, 0xe8, 0xff, 0x64, 0x99, 0xaf, 0xb2, 0xc5}} return a, nil } -var _templatesSchemaGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdd\x6f\xdb\x38\x12\x7f\xf7\x5f\x31\x67\x64\x73\x52\xe0\xc8\x40\x71\x4f\x39\xe4\x21\xe9\x5e\xef\x72\x40\xdb\x45\xd2\xdd\x05\xae\x57\x74\x69\x69\x64\xb3\x95\x48\x97\xa4\x9c\xf5\x09\xfa\xdf\x0f\xfc\x90\x44\xc9\x92\x3f\x9a\xee\xa2\x5b\x6c\x9e\x1c\x69\x38\x9c\xf9\xcd\x70\xbe\xa8\xb2\x04\x9a\x42\x74\xc7\xe2\xac\x48\xf0\x25\x4f\x30\x83\xcb\xaa\x9a\x00\xd8\x37\x84\x25\x10\xdd\xc9\x5b\x22\xf1\xcd\x76\x8d\xfa\xf7\x3f\x7e\x5d\x73\xa1\x30\x81\x80\x71\xa5\x1f\x3c\x14\x6b\x14\x37\x19\x25\x32\xd4\x6b\x95\xa6\x2b\x4b\x58\x13\x19\x93\x8c\xfe\x0f\x21\x7a\x45\x72\x84\xaa\x02\xca\x14\x8a\x94\xc4\x08\xe5\x04\x40\xef\x71\xa9\x37\xd1\x7c\x02\x2e\x34\xaf\xbb\x86\x42\x33\x56\x02\x49\x1e\x42\x55\x95\xe5\xfc\xc2\xac\xd0\x7f\x37\xb0\x20\x12\xc1\xec\x43\x25\x90\xec\x91\x6c\x25\xfc\x44\x32\x9a\x10\x45\x16\x19\x46\x0d\xe9\x8f\x2c\x41\x01\x8c\x8b\x9c\x64\x10\x73\x96\x50\x45\x39\x93\x33\x78\x44\x88\x09\xfb\xab\x82\x15\xd9\x20\x10\x8f\xa3\x40\xbd\x06\x13\x20\xad\x08\xd0\x13\xee\x0a\xd4\x8a\x4a\x88\x57\x18\x7f\xd4\x22\x7c\x28\xa4\x82\x94\x0b\x90\x84\x51\xb5\xb5\x2f\xc2\x68\xd2\xc8\x71\xc7\x40\xad\x10\x12\x4c\x29\x33\x22\x00\x4f\xcd\x13\x4f\x13\x25\x31\x4b\x67\x96\x73\x8e\x84\x49\x50\x2b\xa2\x0c\x55\xc1\xb0\x06\x5d\x2a\x51\xc4\x0a\x56\x3c\x4b\x28\x5b\x36\x1b\x1c\xe2\xbe\x22\x12\x48\x8d\x11\x06\x21\xa4\x05\x8b\x2d\x4e\x17\x73\x63\x6f\xfb\x27\x0a\xa6\x68\x8e\x91\x87\x66\x63\x29\x64\x09\x38\xd2\xb2\x04\x41\xd8\x12\x21\xba\xc9\xb2\xd7\x29\x34\x1c\x6a\x7f\x92\x37\x8c\xb3\x6d\xce\x0b\x09\x1e\xf7\x76\xd9\x0f\x82\xaf\x51\x28\x8a\x9d\xf7\xf5\xfa\xb3\xe8\x4e\xbe\x29\xd6\x19\x1a\xd3\x83\xc2\x7c\x9d\x11\x85\x30\x55\xfa\x61\x4a\x31\x4b\xee\xb4\x1d\xa6\x10\x59\x0a\xcc\xa4\xa5\x6d\x49\x2d\x50\x43\xb4\xad\x1a\x6e\xc7\x9d\x27\xc6\x2b\xa3\x7f\x11\x79\x93\x58\x8f\x21\xd9\xb8\xc0\x96\x78\x90\xf2\xb2\x43\x0a\x30\x9f\x1b\xfa\x56\xc8\x84\xc7\x52\x09\xca\x96\xd3\x11\x0e\x3d\x06\xdd\xd5\x6b\x4b\xb7\x75\xc6\xa2\x9c\x7d\xcf\xe3\x87\x7d\xfc\xaa\xaa\x77\x32\x87\x88\xea\xe3\x1a\x84\x90\x93\xf5\x5b\x2b\xe0\xbb\x8e\x1d\x64\xbc\xc2\x9c\xe8\x88\x70\x94\xe0\x65\x89\x2c\xd9\xc1\xbc\xfb\xa0\x0b\xe2\x9d\xc2\xbc\x8f\xdf\x91\xe8\xd9\xa5\x3b\x46\x3a\x1d\x36\xc3\x68\x0f\x62\xe6\xbd\x07\xd6\xdb\xa3\x30\xda\x11\xaf\xef\x80\xad\x3b\xfb\x24\xd1\x3f\xb9\x09\xc0\x1d\xb2\xce\x81\x6c\xfe\x2b\xcb\x9d\x43\xd6\x52\xf5\x4e\x57\xcb\xec\xc0\x21\x9b\x0c\x8a\x76\xf8\xc0\x0d\x48\x57\x9b\xde\x19\xfd\xc0\x31\x3b\xf2\x80\x3d\xe1\x68\xfd\xe1\x0e\x55\x17\xce\xce\xef\x7d\xa7\xe8\x73\xce\xcf\x57\x7a\x72\x5a\xad\x2b\x9d\x64\xeb\x92\x23\x26\x39\x76\x2b\x8e\x01\xbe\xb7\x3c\xd9\x3a\xdf\x9c\xec\x4f\x49\x06\xb0\x7e\x1d\x53\x55\xb0\x44\x25\x4d\x7e\x2d\x4b\x58\x15\x39\x61\x9d\x2d\x4d\xee\xa5\x12\xd6\x3c\xdb\xe6\x5c\xac\x57\x34\x36\x02\x1a\x96\x3a\xed\x42\x50\x96\x70\x16\xdd\x63\x8c\x74\x83\xc2\x31\xbd\xf0\xe5\x3f\x73\x5b\x85\x83\x02\x04\xe1\x90\x5e\x0e\x2f\x9d\xe4\x3a\xc9\x18\x3f\xc1\x59\xf4\x3d\x95\xb1\xa0\x39\x65\x44\x71\xf1\x42\x9f\xd1\x46\x60\x81\xaa\x10\xcc\x6c\x24\x28\x53\x29\x4c\xbf\xfb\x34\xed\x2f\xf9\x89\x64\x05\x76\x72\x6d\xbb\xac\xab\x0a\x54\x55\x54\x96\x5d\x4b\x54\x95\xd9\xd2\x4f\x03\x0d\xc2\x0f\xa8\x06\x41\x96\xbf\x23\xc8\x23\x32\x04\x1b\x92\xed\x47\x3a\x84\x2e\xd6\x0c\xf7\x63\x7d\x0a\x5a\x70\x0d\x1b\x92\xf5\x31\x6b\x3d\x7f\x3e\x87\x1f\x59\x4e\x84\x5c\x69\xaa\x81\x72\xfb\x21\xa3\xb1\xae\x1d\x1d\x4d\x17\x2c\xa9\x5f\x4a\x8d\xe3\xe0\xda\x89\xc1\xf0\x08\xfe\x81\x40\xa2\x6b\x6c\xca\xa3\x7b\xf3\x6b\xa6\xeb\x6c\x59\xe4\x28\x9a\x62\xf2\xb9\x7b\x10\x42\x60\x4e\xfa\x2e\xab\x19\xa0\x10\x5c\x58\x38\x37\x44\x00\x66\x98\x23\x53\x12\xde\xbe\xfb\x20\x39\x8b\xee\xc9\xe3\x4b\x94\x92\x2c\xb5\x85\xb5\x53\x0b\x01\x57\xd7\xcd\x56\xf5\x16\x4e\x9a\x19\x9c\xd7\x0c\xc2\xbf\x1b\xda\xbf\x5c\x03\xa3\x99\xb3\x96\x73\x5d\x46\x33\xb3\xef\x44\x23\xeb\xf6\x15\x28\x8b\x4c\xc1\x88\x98\x13\x30\x55\xfe\xfb\x59\x2d\x9f\x96\xc1\x86\x8f\x46\x60\xbb\x05\x5f\x7c\x98\xd5\x42\x16\x7b\x51\x0c\xdc\xca\x16\xb7\xd0\x70\x70\x4a\x76\x04\x1f\x12\xbd\x3e\x4a\x4e\xf2\x6b\x20\xeb\x35\xb2\x24\xb0\xff\xcf\xb4\x24\xe1\xc4\x12\xb9\xc5\x50\xbf\x62\x34\xd3\xf1\xf3\xb0\x27\x8d\x39\xd1\x67\xbb\xce\x89\x5e\x73\xd8\x67\xe6\x73\xdd\xd2\x31\xc4\x04\x14\x07\xcd\xdd\xc6\x07\xf5\x48\x63\x9c\x81\xe4\x90\x52\x21\x95\xee\x40\xb9\x6e\xf7\x8a\x34\x45\x8d\x9e\xee\x71\x1a\x43\x51\x5e\x28\x9a\x19\x89\x6e\xb2\xcc\xc9\x18\x4e\x86\x6d\x31\xe4\x44\x2d\xc4\x07\x6c\x6e\xb7\x6d\x0d\x5e\x4d\x2c\x6a\x47\x2c\x83\xb7\xef\x16\x5b\x85\x4f\x05\x6c\x51\xa4\x5a\x65\xcd\x4a\x46\xaf\xf0\xf1\xd6\x20\x62\x76\x08\xdb\x52\xc2\x0b\x65\x26\x2d\xea\x65\xcf\x46\xd7\x79\xc1\xc9\x9a\x44\x87\x6f\x8b\xbb\x16\xd0\x5a\x84\x4a\x6b\x1e\x6d\x1c\x0e\x29\xaa\x78\x65\xe8\x36\x26\xc3\xb8\xc6\x55\x17\xbc\x03\x61\xb4\xaa\xa0\x2e\x41\x22\x77\x60\x97\xa8\x4c\x5d\xec\xfa\xe2\xb2\xe7\x93\xc3\x4c\x6c\xd5\x03\xbf\xe8\xd0\x72\xd5\x4b\x7c\xc3\x4b\x7e\x31\xd6\xdd\x13\x78\x16\x45\x3a\x83\x73\x27\xcd\x09\x41\xa7\x65\xb9\x71\xcd\x79\x74\x8f\x9f\x0a\x2a\x30\xb1\x85\x55\x70\x94\x7c\x33\x98\x2e\x74\x5d\x33\xab\x01\x89\x8e\xc0\xe1\x04\x31\xe7\x73\x78\xe3\x1b\x69\xdc\x40\x54\x42\x21\xed\x31\x4c\x50\xa1\xc8\x29\x43\x78\x5c\x51\x6d\x66\x6d\x28\xc5\x21\x16\xa8\xb3\x29\x61\x49\xeb\xf0\x76\x82\xa1\xfd\x5b\x1f\xd1\x09\x80\x7c\xa4\xda\x35\x4e\x50\xc7\x1a\xdf\x86\xe3\xb3\x8f\x33\x38\xdb\x68\x58\x77\x7c\xd8\xa8\x19\x13\x89\x3b\x25\xcf\x47\xa8\xaa\x2b\x17\x68\xbd\x64\xd0\x94\x51\x41\xb1\x5e\xa3\x80\xa0\x15\xc4\x96\x10\x61\x58\xbf\x3a\xdb\xd8\x69\x55\xbf\xc8\xe8\x4d\x29\xb4\x68\xbb\xb3\x88\xfd\xde\xf5\x6c\x06\xe7\x56\xa0\x21\xb3\x8d\xe5\x86\x3a\x3b\x34\x6f\xcf\xfd\xe0\xdf\x6f\x26\xbc\x08\x56\x73\xe1\xc2\x1c\xf3\xe0\x6f\xcf\x9e\xcd\x60\x4a\x99\xf1\xd2\x3d\xe6\x37\x1e\x72\x05\xdf\x7d\x3a\xd1\x15\x27\x93\x6a\x52\x43\x64\x27\x48\xed\x58\x51\x77\x30\x6e\x02\xf8\x82\x0b\xe3\x46\x12\x12\x8c\x33\x62\xe6\x74\x12\xce\x04\xa6\xc0\x19\x48\x9e\x23\x70\xb5\x42\x4b\x34\xb3\x83\x39\x47\x69\x3c\xcc\xb8\x20\x91\x40\x26\x00\x4b\x9e\x11\xb6\x84\xf7\x44\xef\x81\xc9\x7b\xb7\x06\xa3\x65\x64\xe9\x6e\xe0\x1a\x6e\x23\x78\xc5\x21\x47\xb5\xe2\x09\x68\x47\xcd\x60\x81\x20\xb0\xde\xbe\x37\x43\xdb\x33\xfc\xec\xf6\xd8\xdb\x35\x3e\xf4\x8a\x49\xaf\x45\xf7\x47\xae\x9d\xe9\xe7\xcf\x2b\xb4\xa3\x44\x23\x74\x2b\x87\x04\xb2\x53\x0b\xcf\xec\x44\x10\x21\x25\xb1\xe2\x62\xeb\xb4\x90\xf0\x48\xd5\xca\x06\x63\xc3\xc5\x53\xe1\x1b\xa8\x04\x9c\xff\x8e\xec\xda\x4c\x51\x9a\x4a\xb1\x93\x84\xbf\xd9\x9a\xfa\x48\x54\xfc\xed\xbb\xd0\xf8\x81\xa2\x3e\xa7\xfe\x45\x81\x9d\x90\x3f\xe7\xf9\x3a\xc3\x5f\x5f\x2f\x3e\x60\x6c\xee\x06\xec\x9c\x29\xba\x1b\x1e\xf1\x5c\x76\x9d\xde\x09\x5e\x9f\x21\x77\x33\xe0\x5f\x39\x98\xa0\x39\x18\x51\x77\xf5\x6f\xe4\x6d\x7e\x1c\x98\x06\xc0\xc1\x09\xf5\xd0\xe1\x9c\x74\xc6\x93\x9f\x3d\x2d\x68\x46\xf5\x0d\xbf\xfd\x5d\x6c\x3f\x07\x3d\x75\x56\xf0\xb5\xcf\x0b\xfc\x54\xf6\x05\xe6\x06\x5f\x02\xee\x2f\x30\x35\xf8\xbd\x26\x07\x3e\x7a\xe3\x83\x63\xfd\x9f\xa9\xfa\x31\x25\x45\xa6\x9a\xb5\x35\x34\xfb\x81\xa9\x25\x0d\xdb\x28\xf3\xef\x87\xd7\xaf\x82\x85\xeb\x58\x42\x1b\x8f\x3c\xdd\xc7\x93\xa5\x4d\xfb\x63\x3d\x78\x5b\xa1\xa9\x3d\xcb\x1b\xc2\xb6\xae\x32\xa3\x84\x46\xba\xc0\xca\x15\x94\xa5\xef\xc8\x81\x26\x6a\x30\x08\xab\x2a\x9c\xc1\xf9\x68\xcd\xd5\x44\xd6\xb6\xe0\xf2\xfd\x74\x74\xeb\xc5\x13\x98\x5e\xec\x5a\xe2\x7a\x18\x87\x40\x85\x03\xd5\x61\xa7\x30\xec\x8c\xe3\xbd\xa8\xfe\xe4\x52\xc6\x39\x96\x9f\x23\x02\x77\x9b\xfc\x83\xf6\x71\x45\x37\x36\x31\xd8\xea\xcb\x64\x8f\x42\x2a\x9e\xbf\xe0\x22\x27\x4a\xe9\x42\xdb\x5c\x0c\xdb\x66\xed\x39\x67\x8a\x50\x26\x21\xfa\x0f\x0a\x0e\xd3\xe0\xbf\xd3\x69\x18\x86\xe0\x5f\x00\x74\xfc\xce\x06\x02\x32\xa2\x81\x6d\x64\x52\xc1\x73\x30\xc4\x94\xad\x0b\xf5\x1b\xbb\xbb\xb3\x40\x10\x68\x46\x91\xd3\xdb\x65\x91\x50\x47\x9e\xde\x86\x61\x18\xf5\x58\x87\x8d\xe9\x5a\xa5\x5f\x7a\x2a\x0b\x54\x82\xe2\x06\x0f\xe9\x4d\xa4\xd5\x9a\x17\xea\xb0\xda\x23\x5a\x7b\xfb\x06\xa6\x08\xb1\x53\x09\xaf\xe6\xe8\x6a\xbd\xab\xf3\xb0\xca\x1d\xbe\x9e\xab\x0e\xf8\x93\x69\x12\x16\x7e\x1e\xde\x77\x2f\xbd\xf7\xe6\xf9\x69\xc9\x5b\x16\x8b\x4e\x2e\x19\xaa\x13\x6a\x78\xff\xcc\xe6\x3b\x01\xed\xc9\xd9\xbc\x8f\xff\xc9\x58\x7f\x73\xa9\xbc\x53\xac\x1f\xbc\x65\x3d\xea\x8e\xf5\xb3\x6f\x58\xff\x48\xf7\xab\x0e\xe9\x1d\xf8\x86\xef\x54\x6d\xd4\x38\xe1\x42\xf5\xab\xbc\x4e\xed\x37\x4a\x4d\x88\xed\xb3\x78\x40\x41\xcd\xe6\xa2\xff\x31\x8d\x73\x20\x9b\xdf\xed\xb7\x64\x4e\x29\x2e\xc6\xbe\x13\x6b\xfd\x4e\x2f\x0b\x0e\x7c\x04\x16\xda\x97\xf5\x6c\xd4\x38\x74\x8b\x9b\x34\xff\xd7\xd1\x36\xf4\x4e\x44\x5f\x87\x4d\x2d\x96\x57\xa8\x5c\x36\x63\xa7\x43\x5f\xa2\x5d\xda\x19\x49\xfd\x1d\x55\x33\xb3\x95\x36\x0e\x0d\x05\xa9\xb2\x9c\x5f\xb8\x28\x65\x04\x00\xaa\x5b\x64\x7b\x57\xa4\x03\xdb\xc0\x17\x57\xde\x77\x72\x8b\x42\x99\x6f\xb7\x18\xaf\xf7\x32\xda\x2a\xee\x3e\x3e\x33\x53\x9b\x3d\x99\xbb\xe9\xcc\x9b\x46\x7c\xa7\x45\x1f\x39\x09\x17\xbe\x5b\x58\x36\x41\xaf\x1d\x0f\x77\x87\xab\x43\x97\xf0\xc7\xf6\xe9\x61\xfb\x7d\x5a\x6a\x6a\x40\x09\x52\x89\x34\x57\xd1\x3d\x2e\xa9\x54\x62\xeb\xd7\x54\x5e\x3d\xdb\xb1\xe2\xa5\x17\x75\xe6\x17\xe0\xcd\x0b\x20\xe1\x28\x8d\x89\x1b\x13\x1c\x61\x81\x8b\xb9\xe7\xac\xf5\xf1\xf0\x3e\x87\xeb\xfc\x3c\xd2\x9b\xfd\xd2\xa0\xf6\xec\x93\x4d\xf4\x1b\x54\xd3\xa1\xbb\x57\x76\x35\xd8\x2d\x65\x44\x6c\x3d\x2c\x1a\xdc\x8c\x1b\x8e\xfa\xdd\x58\xa1\xdc\x61\x3b\x52\x34\x52\x7b\xb7\xd0\x4b\x8f\x70\x3d\x76\x47\x61\xfb\x19\x6f\x70\x2d\x1f\xc9\x32\xfa\x59\x50\x85\xa6\x84\x1c\x60\xb6\x33\xe9\xfb\xd2\x7a\xf6\x18\x0f\xb6\x04\xee\x7e\x61\xb4\xc7\x6d\x3b\x47\xa3\xd0\x3d\x92\xc4\xf6\x00\xf6\x1a\x60\xcf\xd5\x4d\x7b\x19\x79\x31\x88\xa4\xde\xb6\x7f\x7e\xbc\xc8\x3f\xf9\x7f\x00\x00\x00\xff\xff\x89\x5e\x9a\x5b\x13\x2c\x00\x00") +var _templatesSchemabodyGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\xcd\x6e\xe3\x36\x10\xbe\xfb\x29\x06\x46\x0e\x49\x10\xcb\xf7\xdc\xb2\xc8\xb6\xcd\x02\x8d\x8b\x24\xed\x65\x51\x20\x5c\x8b\x8e\xd9\x4a\xa2\x2a\xd2\xbb\x75\x0d\xbd\x7b\x41\xc9\x96\x48\xf1\x47\xa4\xec\xdd\x24\x86\x6f\x71\x3c\x1a\x0e\x67\xbe\x99\x6f\x86\x94\x37\x1b\x88\xf1\x82\x64\x18\xc6\x6c\xbe\xc4\x29\xfa\x40\xe3\xf5\x18\xca\x92\xf1\x62\x35\xe7\xb0\x19\x01\x6c\x36\x50\xa0\xec\x05\x43\x74\x93\x24\xb3\x05\x94\xe5\x08\xa0\xfa\x37\x59\x00\x2d\xe0\x1c\x65\x31\x9c\x45\x77\xec\x71\xf5\xe5\x69\x9d\x63\x88\xee\xd8\x07\xc4\xf0\xee\xef\x8f\xff\xe6\xb4\xe0\x38\xbe\x10\x1f\x6e\x32\x9a\xad\x53\xba\x62\x3b\x35\xb2\xfe\xdf\x0a\x9a\xe3\x82\x13\x2c\x7d\xbb\x5b\x28\xc3\x70\x16\xdd\x12\x36\x2f\x48\x4a\x32\xc4\x69\xf1\x13\xc1\x49\x0c\xd1\x3d\x4a\xb1\x2c\x2e\x5b\x96\x51\x5e\x59\xd6\x9a\xe0\x32\xf6\x42\x55\xb3\x53\x24\xa4\x9f\x56\x79\x82\xbb\x5f\x57\x02\x1c\xa7\x79\x82\x38\x86\x71\x5e\x90\xaf\x5c\xc8\x2d\x84\x61\x63\x88\x0c\xea\x70\xc2\x8c\x6a\x54\x2d\xb5\xf3\x5d\x6a\xb2\x58\xdb\xb2\x49\x75\xd8\x06\xf6\x37\x7e\x98\xe1\x59\xac\x46\x5b\x11\xd2\x3f\x4f\xc4\x9e\xa2\x5f\x10\xbb\x89\x63\xc2\x09\xcd\x50\x62\x03\x4e\x2d\xda\x27\x07\x30\x9d\xaa\x9e\x88\xe9\x9c\xf1\x82\x64\x2f\x63\x9f\xa7\xc5\x3a\x72\x00\x2b\xa9\xf5\x1f\x28\x21\x31\x12\x4f\xde\xd2\xf9\xa3\x4b\x9b\xa6\x8c\x2c\x40\xc0\x54\x02\x6e\x0d\xe5\x16\xb6\x26\xa8\xe6\x88\xcd\x51\x42\xfe\xc3\xe6\x55\x8c\x89\x32\xa9\x83\x2a\xa5\x8b\xf9\x59\x25\x85\x6c\x22\xae\x3c\x9a\xa3\x14\xf7\xdb\x56\xa5\xb4\xc9\x40\x5d\x61\xd0\x1e\x2b\x00\x41\x8a\xf2\xcf\x75\x58\xff\x54\xa2\x5d\x57\x3e\x61\xb9\x3d\xdc\xf0\xfc\x17\xa3\xd9\xf5\x78\x32\x7e\x1e\xe9\xaa\x47\x8e\x7f\xa8\x08\xbc\xe3\x38\x55\xe0\xe3\x07\x3d\xed\xb1\x61\x98\xab\xd4\xe8\x19\x62\x04\xdb\x99\x8a\xb6\xcd\x66\x7a\x09\x4f\xb3\xdb\xd9\xf9\xa2\xc0\xf1\xc5\x35\xa4\xe8\x6f\x0c\x6c\x55\x60\x20\xd9\x12\x17\x44\x3c\xd8\x35\x18\x15\xb8\x89\x7c\x0c\x97\xd3\x6e\xea\x1b\x21\x5b\x3d\xaa\x45\xd2\x0c\x05\x15\x08\x8e\x27\x6b\x04\x7c\xf6\x0a\xfc\xce\xd9\x7a\xcc\x3b\x01\x6e\x6b\x62\xe5\x9d\x0c\xa5\x38\x06\x2e\x58\x65\x4e\xd3\x9c\xb2\x4a\x9f\xbc\xed\x2d\x95\x51\xde\xf2\x90\x99\x29\x85\x46\x88\x7e\xa6\xd5\x37\xd5\x87\xce\xb2\xbb\x4f\xea\xdf\x1a\x8f\x6a\x5c\x6d\x60\xc4\x33\x25\x75\xcf\xcd\x89\xac\x33\x49\x2f\xf7\xc9\xde\xe9\xe1\xb7\x66\x17\xf2\x33\xce\x05\xfd\x16\x73\x2f\xb4\xe5\x9d\x8e\x3b\x3d\xc8\xc5\x87\x58\x86\x52\xca\xc1\xc8\x64\x00\x91\x04\x93\x88\x9e\x94\xfe\x2a\xe4\x5a\xff\x9d\x8a\xb4\x1a\xd9\x89\xfa\xc1\x51\x97\x07\xd4\xe4\xfd\xeb\x71\x0d\x3d\x8f\x70\x79\xd5\x4d\x25\x91\xfa\xc5\xab\x60\x34\xee\xda\xab\x4e\xb6\x4e\x2f\x47\x92\xd3\x47\xf2\xa8\x51\x6f\xc6\x38\x6b\x4c\x2c\xc3\xc6\x44\x9e\x36\x82\x27\x8c\x49\xdf\x88\x31\xd9\x15\x66\xb9\x38\xea\x9d\x84\xab\x9b\xee\x42\xc0\x39\x0d\xd8\x3b\x9b\xae\x12\x57\x4f\xad\x35\x1c\x76\x9e\x0c\xb1\x7d\x6f\xbb\x87\xd8\xec\xd5\x48\x1d\xb4\xeb\xdf\x49\xda\x02\xbe\x6f\x57\x7d\xbc\x4d\x6b\x9f\xe7\x8e\xa1\xb5\xd3\x99\x6d\xa2\x34\x6f\x8e\xde\x4d\x26\xd4\xb6\x89\x73\x2c\x64\x21\x29\x7b\xd1\xea\x2d\x58\xae\x84\xf7\x3d\xb5\x30\xc5\x45\x7b\xd6\x96\xea\xbe\xfe\xec\xb7\x70\xa8\x75\x21\x96\x35\xad\xa0\xa1\x49\x38\x40\x33\x68\xed\xc6\x8e\xba\xf9\xb2\x03\xdb\x59\x60\x82\x1b\x57\xff\x6a\xe3\xef\x32\xbd\x3b\x1a\x1d\xb0\xe0\x48\xee\xb0\x36\x49\xdf\x08\x5f\xee\x0a\x8c\xef\xa9\xac\x7a\x26\xeb\xdb\x25\xd9\x0b\x4d\x3b\xaf\xaa\xa0\xdd\x8e\x49\xc7\x3c\x0c\xf6\x4e\x82\x8d\x0f\x54\xbf\x78\x26\xa0\xb2\xb7\x5e\xc9\x83\x66\xa7\xd8\xa4\xb4\x5d\x73\x26\x9a\xa7\x91\x21\xc3\x87\x4b\xe8\x90\xd3\x46\xe7\x88\xba\x73\xd4\x12\x7c\xd2\x12\x74\xc8\xd2\x60\xa1\x59\xa3\x63\xc3\x99\xe6\x45\xe3\x74\x26\x5c\x53\x96\x60\x77\x87\xb4\x7f\x61\x76\xeb\xca\x6d\xb0\xea\x22\xf9\x80\xff\x59\x91\x62\x9b\xe9\x1f\xd3\x9c\xaf\x67\x29\xe1\xf5\xd2\x57\x34\x25\x42\x39\x5f\x77\xa1\x7e\xc7\x3e\x3d\xce\xee\xeb\x29\x55\x08\xd6\x50\x6b\xa4\xc6\xcf\x4a\x9a\x54\x7f\x05\x1d\x9d\x84\x42\xaa\x27\x69\x42\x98\xee\xe0\x39\x64\x3e\x36\xf2\x4d\xa3\xa3\x1c\xea\x05\x5f\xd1\x15\x0f\xa5\xac\xc6\x79\x7b\xdc\x0d\xda\xfc\x6b\xb9\x90\xd0\xd8\xab\x3b\xa6\x79\x4e\xc2\x96\x29\xcf\x77\x0c\xd6\xa7\x60\xf3\x14\xd4\xa9\x0f\x22\x36\x22\x34\xd1\x03\xfa\xf6\x2b\x66\x0c\xbd\xe0\xd7\x2b\x09\x9d\x6b\x3b\xc7\xad\x9d\xff\xf8\xee\x3d\xbd\xbf\x53\xfe\x95\xb6\xea\xe1\x32\xe7\x14\xee\xef\x81\xd7\xe2\x67\x7d\x67\x1a\xcc\xfd\x99\xba\x67\xae\x3e\xc4\x1d\x49\xa7\x72\x98\xac\xb4\x9d\x10\xfa\xde\xe2\x1b\xf2\xfc\x3d\x75\x01\x23\x43\xc2\x9b\x62\xfa\xe6\xcb\x96\xd2\x05\x07\xdf\x00\x05\x14\x1a\x2d\x49\x7f\x40\x4f\x12\x42\xd3\xb3\xe2\x9e\x66\x3b\xf3\x4e\x9c\x1d\xca\xd9\x27\xda\x3b\xd1\x5e\x3f\xed\xd9\xea\x7e\x28\xf5\x99\xc9\xcf\xbc\x9a\x8d\x0e\xf7\xa6\xc0\x13\x03\xea\x0c\x78\xbc\x64\x52\x7e\x57\x22\xb0\xc2\xcd\x0c\x0b\x28\xcb\xeb\x2a\x05\x1e\xf0\x1c\x93\xaf\xb8\xa8\xb1\x12\x19\x25\xaf\x02\xd2\xe3\xa0\x3d\xa9\x6e\x22\xd4\x36\xb6\x22\x57\x81\x7d\xab\xeb\x32\x48\x85\xbd\x4c\xa2\x96\xcb\x21\x2f\xaf\x82\xdb\xad\x36\x53\xcb\x2b\xdf\x23\xed\x9b\x2c\x36\x76\x1e\x6e\xbc\x39\x30\x65\x39\x87\x73\xec\xfa\x5d\xd4\x98\xfd\xc1\xd1\xbc\xdd\xd9\xb9\x06\x30\x16\xf9\x77\xe6\x25\xd5\x13\x55\x19\x2e\x7b\x7a\x57\x3b\x84\x5c\x08\x32\xa7\xcd\x48\xad\x66\x18\xfc\xde\x52\xb7\x24\x5b\xbd\xf8\xf6\x60\xb0\x72\x44\xfb\xe6\x6c\xf7\x58\xcf\x76\x82\x0c\x65\x79\x7e\xd1\x78\xe5\x4a\x32\x50\x6b\x7e\xcd\x56\x68\x4c\x7c\x7e\xa1\x68\x91\x0a\xe9\x1b\x01\xa8\xb5\x78\xa9\xc1\x1c\xee\xd0\x8e\x3b\x8d\x1b\xed\xa9\x7c\x74\xc5\x5b\xde\x1d\x76\xa3\x37\xe4\x57\x16\xbd\xb7\x7b\x3d\x3f\xac\xd8\xe7\xd7\x14\xc7\xfa\xd6\xa8\x03\xe7\xaf\x74\x03\x35\xea\x26\xd2\x29\x50\xea\x55\x95\xfd\x44\xe4\xd3\x8a\xb9\x6e\x2d\xa6\x97\x20\x24\x80\x2f\x31\x7c\x41\x0c\xd7\x2f\x78\x57\x8b\xb2\x08\x7e\x67\x38\x86\x05\x2d\x60\x95\xa5\x88\x2d\x51\x92\x08\xae\xca\x69\xb2\x4e\x69\x91\x2f\xc9\xbc\x12\x67\xd1\xe5\xd4\xa3\x87\x36\x16\x3b\x8f\x16\xda\xf5\x1e\xd6\xdb\x3d\x35\x09\x3b\xba\x55\xc2\xf7\x7f\x00\x00\x00\xff\xff\xe8\xc6\xf8\x2c\xb7\x36\x00\x00") -func templatesSchemaGotmplBytes() ([]byte, error) { +func templatesSchemabodyGotmplBytes() ([]byte, error) { return bindataRead( - _templatesSchemaGotmpl, - "templates/schema.gotmpl", + _templatesSchemabodyGotmpl, + "templates/schemabody.gotmpl", ) } -func templatesSchemaGotmpl() (*asset, error) { - bytes, err := templatesSchemaGotmplBytes() +func templatesSchemabodyGotmpl() (*asset, error) { + bytes, err := templatesSchemabodyGotmplBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "templates/schema.gotmpl", size: 11283, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x53, 0x1b, 0x51, 0xcb, 0x5f, 0x6c, 0x3f, 0x1, 0xb8, 0xdc, 0x9a, 0x41, 0xff, 0x90, 0xd3, 0xfa, 0x99, 0x35, 0xf5, 0xd2, 0x7, 0xad, 0x68, 0x6b, 0xfa, 0x4c, 0x85, 0xd4, 0x32, 0x4d, 0x38, 0x3d}} + info := bindataFileInfo{name: "templates/schemabody.gotmpl", size: 14007, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc1, 0xe2, 0x21, 0x6c, 0xbf, 0xb3, 0x16, 0xb, 0x7, 0x4c, 0xe2, 0xb3, 0xc9, 0x81, 0x2c, 0xf2, 0xfb, 0xee, 0x1e, 0x90, 0xd6, 0xf9, 0x76, 0x9a, 0xdb, 0x1b, 0x8d, 0x35, 0x7, 0x9c, 0xca, 0xef}} return a, nil } -var _templatesSchemabodyGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xcd\x6e\xdb\x46\x10\xbe\xeb\x29\x06\x82\x0f\x96\x21\x51\xf7\xdc\x1c\x24\x6d\x5d\xa0\x71\xe1\xa4\xbd\x04\x05\xb2\x21\x57\xd6\x16\x24\x97\xe5\xae\x92\xaa\x02\xdf\xbd\x58\xd2\x24\xf7\x9f\x4b\x49\x89\x65\x45\x37\xd9\x1a\xce\xce\xef\xf7\x8d\x86\xbb\xdb\x41\x82\x57\x24\xc7\x30\x65\xf1\x1a\x67\xe8\x35\x4d\xb6\x53\xa8\x2a\xc6\xcb\x4d\xcc\x61\x37\x01\xd8\xed\xa0\x44\xf9\x23\x86\xe8\x36\x4d\xef\x57\x50\x55\x13\x80\xfa\xdf\x64\x05\xb4\x84\x6b\x94\x27\x70\x15\xdd\xb1\xf7\x9b\xcf\x1f\xb6\x05\x86\xe8\x8e\xbd\x46\x0c\xb7\x9f\xdf\xfe\x5b\xd0\x92\xe3\x64\x26\xfe\xb8\xcd\x69\xbe\xcd\xe8\x86\xb5\x6a\x64\xfd\xbf\x97\xb4\xc0\x25\x27\x58\xfa\xb6\x3d\x28\xc7\x70\x15\xbd\x21\x2c\x2e\x49\x46\x72\xc4\x69\xf9\x13\xc1\x69\x02\xd1\x3b\x94\x61\x59\x5c\xb6\x2c\xa7\xbc\xb6\xac\x37\xc1\x67\xec\x4c\x55\xd3\x2a\x12\xd2\x1f\x36\x45\x8a\xf5\xaf\x6b\x01\x8e\xb3\x22\x45\x1c\xc3\xb4\x28\xc9\x17\x2e\xe4\x56\xc2\xb0\x29\x44\x16\x75\x38\x65\x56\x35\xaa\x96\x26\xf8\x3e\x35\x79\x62\xb8\x6c\x53\x3d\xce\x81\xc3\x8d\xdf\xcf\xf0\x3c\x51\xb3\xad\x08\x99\x7f\x2f\x84\x4f\xd1\x2f\x88\xdd\x26\x09\xe1\x84\xe6\x28\x75\x15\x4e\x23\x6a\x95\x5b\x28\x66\x2c\x97\x6a\x28\x12\x1a\x33\x5e\x92\xfc\x71\xea\x78\x5c\x73\x62\xa1\xd4\x41\x2d\xb5\xfd\x13\xa5\x24\x41\xe2\xc9\x37\x34\x7e\xef\xd3\x66\xa9\x5e\x51\xa6\x52\xe1\x36\xa5\xdc\x97\xed\x4c\xd8\xbf\xdb\x41\x81\x58\x8c\x52\xf2\x1f\xb6\x2b\x6e\x9b\x43\x18\x58\x67\xaf\x79\x6a\x58\xb6\x8e\x38\x64\xa8\xf8\xd8\x84\xe1\x2f\x25\x3a\x0d\x54\x08\x3b\xdc\xe1\x81\x4f\x7f\x33\x9a\xbf\x9a\x2e\xa6\x9f\x06\x72\x2b\xff\xa9\xa6\xeb\x8e\xe3\x4c\xcd\x54\x58\x9e\x9a\xe7\xb4\x4a\x18\x9f\xa0\x5a\x8d\x01\x44\xd6\xcc\x5c\xc9\xa9\x71\x67\xa6\xd6\xd8\x07\xba\xed\x28\x35\x25\x86\x50\x93\x8c\x8f\x41\x39\x68\x5d\x37\xc3\xaf\x06\x5f\x3e\x7c\x79\x03\x39\xca\x70\x02\x5c\x00\x62\x4c\xb3\x82\xb2\x5a\x1d\xdc\x2c\xb5\xe4\x08\x5f\x3b\x08\xb5\x83\x7c\xe3\xce\xcf\xb4\xfe\x46\x72\x60\xa2\x1b\xa1\x7e\x36\x28\xc0\xa0\x19\x0b\x98\x5f\x29\xe8\x7d\x6d\xc7\x72\x13\x04\x07\x61\x5b\x8e\xce\x00\x34\x77\x5e\x28\xe9\xf4\x1d\x18\x76\x98\xff\xa0\xa7\xae\xd1\xc2\x19\x80\x8b\x41\x98\xb8\x2f\x1a\x1e\x0d\x07\x03\x31\x70\x1c\x04\x4a\xe9\x09\x7c\xa6\x9e\x30\xfa\x0e\x3c\x26\x1c\xaa\x99\x5b\x18\x69\x74\x81\xe0\x1e\x00\x78\x38\xf8\x1d\x9c\x0e\x37\xee\x0d\x8b\x6b\x49\x38\x04\x06\xfb\xa0\x57\x30\x91\xa2\x2e\x4f\xc1\x8d\x33\xa1\x63\xb0\x3a\x04\x87\x0e\xbe\xee\x89\xb7\x47\x59\x19\xe9\x86\x31\xe5\x2c\x40\x6c\x10\xc1\x8c\xde\xb0\x7d\xab\x87\x6d\x1f\x7c\x18\x94\x3c\x2a\x20\x88\x10\xd4\xc1\xb0\xc0\xb9\x59\xd2\xf6\x66\x3c\xbd\x99\x43\xa7\xfa\xee\xc7\x83\x36\x49\x8c\x1e\x24\xc6\xce\x10\x3f\x66\x4f\x49\xdd\x75\x78\x53\x85\x57\xdb\x29\x13\xaf\xbb\x70\x46\xb5\xda\x8b\xe6\xbd\xfe\xa3\x44\x7a\x5f\x09\x5f\xb7\x3d\xf8\xfc\xcc\x67\x6b\xd2\xf3\xec\xd1\x91\xbc\xf7\x82\x99\xed\x42\x68\xc7\x22\xb4\xae\x16\xba\x33\x06\x49\xce\x8a\x3a\x22\x34\x55\x05\xee\x70\x48\xfe\x0b\xb3\xfb\x50\x3e\x25\xab\x81\xc1\x07\xfc\xcf\x86\x94\x4f\x9d\xfe\x36\x2b\xf8\xf6\x3e\x23\xbc\x39\x7a\x4e\x33\x22\x94\xf3\x6d\xe7\x55\x0b\xc2\x32\x49\x8d\xfa\x11\x7b\x4e\x7c\x74\xa1\xa1\xaa\x9a\xe8\x3c\x44\x37\x7c\x2c\x15\x75\xa1\x3b\xe0\xf5\x82\x2b\xba\x8e\x77\x03\x06\x2b\xe9\x8b\xee\xa0\xad\xba\x73\x6b\x1f\xb6\x51\x37\xf7\xe9\x56\x85\x66\xdf\x8b\xcc\x88\xc4\x44\x0f\xe8\xeb\x6f\x98\x31\xf4\x88\xbf\x45\xab\x6b\x7b\x5f\xcf\x4a\x3f\x7c\xa3\xef\x9b\x55\x6d\xf9\x79\x69\x8c\x29\xb9\x1a\x10\x32\xef\xca\x3b\x3c\x02\xa7\xb8\x96\xb6\xaf\x9d\x3d\xdc\x2a\x7b\xde\x93\xac\xf3\x94\x7d\xb6\xd0\x1a\x26\xd8\xac\xd4\xd8\x77\x62\xeb\x69\xdf\x2b\x3e\x4b\x07\x9f\x06\x6f\xdb\x5e\xd9\xd8\xb2\xf5\x8c\x50\xa3\xcc\x9a\xa3\xf7\xe2\x23\xc0\xc1\x68\xac\xef\x30\x1f\x84\x53\xe6\x7d\xf9\x8e\xe6\xad\x71\x17\xfe\x1c\xcb\x9f\x17\xa2\xba\x10\xd5\x30\x51\xb9\x90\x7a\x2c\x59\xd9\xe9\x6a\xe8\x1a\xc4\x91\x49\xeb\xc7\xe2\xac\xf3\x25\x89\xea\x9b\x42\xbc\xb3\x90\xec\x09\x87\xaa\x7a\x55\x17\xf7\x03\x8e\x31\xf9\x82\xcb\xa6\x0a\x22\xab\xe4\x7c\x44\xe1\x1f\x75\x3e\x34\x4d\x84\xc6\xc6\x5e\x64\x3e\x72\x86\x74\xc7\x52\x2f\x68\x99\x1e\xad\x3d\x18\x18\x55\xf0\x87\xd5\x65\x6a\x35\x9f\xb8\x87\x0a\x79\xa2\xb8\xcd\x13\xeb\x48\xe1\x2f\x37\x4f\x49\x39\x96\x58\x1e\xa7\x9f\x19\x3c\x0e\xcf\x7a\x7b\x83\x45\xdf\x8e\x5b\x71\xf9\x64\xfc\x57\x7d\xac\x91\xb3\x1a\x18\x24\xdd\x69\xf7\x65\xdd\x5e\xe9\x13\x15\x80\x30\x84\xdd\x00\x75\xf4\x47\x73\xf8\xd3\xbe\xac\x8e\x50\x8c\x32\xac\x9c\xd8\x61\xb4\x6b\x65\x0a\x55\x75\x3d\xeb\xa2\x32\x97\x0c\x34\x26\x51\xbb\x15\x06\x2d\x5e\xcf\x14\x2d\x12\xf6\x9d\x48\xe9\x39\xf1\x46\x4d\xe6\xfe\x01\xd5\xc2\x69\x75\xd4\x0f\x56\x74\xc3\x7b\xa6\xdc\xef\x0d\xd6\x3e\x17\x98\x07\xdf\x66\x0d\xdc\x59\x3e\xe4\xa2\xf2\xb9\xbe\xbc\xf6\x94\xf9\x73\x5f\x21\xb8\x24\xca\x71\xcb\xa0\x6a\x3f\xc8\x7d\xf9\xeb\x86\xf9\x36\xf9\xcb\x1b\x10\x12\xc0\xd7\x18\x3e\x23\x86\x9b\xcb\xa7\xf5\x81\x2c\x82\x3f\x18\x4e\x60\x45\x4b\xd8\xe4\x19\x62\x6b\x94\xa6\x24\x7f\x84\x82\xa6\xdb\x8c\x96\xc5\x9a\xc4\xb5\x38\x8b\x6e\x96\x01\x13\xaf\x15\xe7\x02\x06\x5e\xc7\xcf\xa2\x13\xdf\x5e\x8c\x5b\x7a\xf6\xa9\xfb\x3f\x00\x00\xff\xff\xb7\x8f\xfa\xbe\x0b\x32\x00\x00") +var _templatesSchemaembeddedGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x6c\x91\xcd\x8e\x1a\x31\x10\x84\xef\x7e\x8a\x12\x27\x26\x4a\xfc\x00\x89\x38\x25\x28\xe2\x42\x22\x84\x72\x37\x9e\x36\xf1\xe2\x9f\x51\xdb\x33\x82\xb5\xfc\xee\x2b\xc3\x20\xb1\xec\x9e\x6c\xb5\x3f\x77\x55\x75\x97\x82\x9e\x8c\x0d\x84\x45\xd2\xff\xc9\xab\xb5\x3f\x50\xdf\x53\xbf\x40\xad\x22\x5f\x06\x42\x29\x18\x54\xd2\xca\xd9\x57\x82\xdc\x2a\x4f\xa8\x15\x29\xf3\xa8\x33\x8a\x40\x03\xac\x81\x5c\x3b\xf2\xfb\xcb\x40\x72\x93\xb6\xa3\x73\xea\xe0\x1a\xf8\xa5\x14\x50\xe8\x51\x6b\x29\x0f\xcc\xef\xd8\x8e\xa6\x51\x85\x30\x63\xd0\x58\x96\x22\x77\xa4\xc9\x4e\xc4\x77\x91\x5b\xe7\xc8\x90\x9b\xb4\x1f\x07\x47\xed\xf2\x33\xfa\xc1\xd1\xf9\xcf\xe1\x85\x74\x7e\x56\x68\x46\x7e\xd9\xa4\xd9\x7a\x1b\x54\xa6\x74\x2b\x6b\xe5\xe9\x9d\xff\xf6\xc7\x25\xba\xf2\x9b\xb4\x3e\x0f\x91\x33\xcd\x3d\x3e\xa6\xbd\xd3\xb7\x10\x0f\xc5\xab\x6c\x87\x7f\xca\xd9\x5e\x65\x5a\x9a\xc8\x5e\xe5\xd4\xa6\x63\x7c\x96\x3b\x3a\xda\x94\xf9\xd2\x81\x98\x23\x5f\xa7\x35\x29\x86\x81\x0d\x99\xd8\x28\x4d\xa5\x62\xd5\x72\x3e\x67\x97\x6d\x33\x1c\x87\xbf\x4a\x9f\xd4\x91\x3e\x1d\x1d\x9a\xfd\xe9\x2b\xe2\x09\xdf\x57\x30\x72\xc9\x63\xc8\xd6\x93\x9c\xfd\xb4\x15\x74\xf8\xd1\xde\x9b\x32\xc0\x94\x47\x0e\x98\xe4\xb3\xe1\x4e\x00\xad\xdf\x0c\x04\xeb\x44\x15\xa5\x7c\x9b\x13\x8a\xb7\x00\x00\x00\xff\xff\x18\x59\xcb\x94\x27\x02\x00\x00") -func templatesSchemabodyGotmplBytes() ([]byte, error) { +func templatesSchemaembeddedGotmplBytes() ([]byte, error) { return bindataRead( - _templatesSchemabodyGotmpl, - "templates/schemabody.gotmpl", + _templatesSchemaembeddedGotmpl, + "templates/schemaembedded.gotmpl", ) } -func templatesSchemabodyGotmpl() (*asset, error) { - bytes, err := templatesSchemabodyGotmplBytes() +func templatesSchemaembeddedGotmpl() (*asset, error) { + bytes, err := templatesSchemaembeddedGotmplBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "templates/schemabody.gotmpl", size: 12811, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5e, 0xd4, 0xa2, 0xde, 0xa8, 0x23, 0xfd, 0xa0, 0x6a, 0xf9, 0x1f, 0x3c, 0x2f, 0x94, 0xb8, 0xb, 0xd3, 0x63, 0x18, 0xcb, 0xe7, 0xfc, 0xd3, 0x6d, 0x5e, 0xd8, 0xb7, 0xb9, 0x82, 0x97, 0xe9, 0xe5}} + info := bindataFileInfo{name: "templates/schemaembedded.gotmpl", size: 551, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x20, 0x86, 0x25, 0x7d, 0x64, 0xed, 0xf7, 0x80, 0x5c, 0x4d, 0x25, 0xbc, 0xfd, 0xcd, 0xbe, 0x94, 0x37, 0xa5, 0x11, 0xa9, 0xb7, 0x27, 0xff, 0xa4, 0x49, 0xe, 0xd9, 0x21, 0xff, 0xf7, 0x51, 0x4d}} return a, nil } -var _templatesSchematypeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x51\x31\x4e\xc4\x30\x10\xec\xef\x15\xa3\x54\x09\x12\x16\x1f\xa0\x08\x0d\xba\x02\x28\x8e\x0f\x18\xbc\x86\x48\x1b\xdb\x8a\x9d\xc2\xb2\xfc\x77\xe4\xbb\x5c\x30\x90\x86\x06\xae\x5b\xcd\x8e\x67\x66\xc7\x29\x41\x91\x1e\x0c\xa1\xf1\xaf\xef\x34\xca\xe7\xe8\xa8\x41\xce\x3b\x20\xa5\x6b\x0c\x1a\xd2\x28\xb4\x76\x42\xdb\x32\x19\x88\x9e\xf9\x49\x77\x78\x0b\xb8\xe9\x20\xf6\xbe\x37\xd6\xc4\xd1\xce\xbe\x43\x0b\x63\x43\xc1\x1e\xa4\xeb\x4e\x1a\x27\x95\x40\xa3\x63\x19\x56\x93\x3b\xab\x62\x03\xf1\x69\x43\xec\xa9\x7e\x70\xb6\xad\xf5\xc4\xde\x3f\xce\xcc\xf2\x85\x69\x5d\x1c\x66\x47\x53\xcf\x83\xf4\xc5\xef\x2a\x25\x90\x51\xdf\x84\xbe\xd0\x90\x33\x6e\xf1\x93\x27\xee\x6d\xb9\xbc\x4a\x64\x54\xce\xbb\x65\x2a\xf0\x71\x3e\x77\xa5\x68\x22\xad\x49\x1d\x2e\xa8\xb3\x5f\x9e\x10\xa2\xa3\x2a\xfe\x7f\xa7\xff\xf3\x1f\x2f\xbc\x23\x81\xd4\x52\x5b\x4a\x1b\xc8\x92\xb3\xec\xd6\x7e\x6b\xb1\xcd\xa2\x3f\x02\x00\x00\xff\xff\x8e\xcc\x37\x87\x56\x03\x00\x00") +var _templatesSchemapolymorphicGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x95\x4f\x8f\xdb\x36\x10\xc5\xef\xfe\x14\x0f\xee\x16\xb5\x8c\xad\x0c\xa4\xb7\x00\x3d\xb8\x08\x1a\xf8\x52\x07\xf5\x36\xf7\x89\x34\x5a\xb1\xe5\x1f\x85\xa4\x9c\xba\x84\xbe\x7b\x21\x4a\x96\x68\x57\xdb\x4d\x2f\xd5\x91\x1c\xce\x3c\xfe\xde\x0c\x15\x02\x4a\xae\x84\x66\xac\x5d\x51\xb3\xa2\x0f\x46\x5e\x94\xb1\x4d\x2d\x8a\x35\xba\x6e\x05\xf8\x4b\xc3\x08\x01\x0d\xb9\x82\xa4\xf8\x8b\x91\xff\x42\x8a\xd1\x75\x10\xda\xb3\xad\xa8\x60\x84\x15\x10\xc2\xf7\x10\x15\xb4\xf1\xd8\x18\x8b\xfc\xe0\x0e\xd3\x7e\x7e\x70\x27\x6f\x99\x54\x86\xae\x0b\x61\xb7\x5d\x61\xfc\xf6\xf8\x44\x8e\x87\x2a\xc2\x81\xe4\x17\xba\x38\x7c\x24\x29\x4a\xf2\xf4\x49\x72\x3e\x85\xfe\xa6\x4b\xb6\xd0\xc6\x2a\x92\x28\x8c\x2e\x85\x17\x46\xbb\x47\x7c\x61\x14\xa4\xbf\xf3\xa8\xe9\xcc\xa0\x24\xa3\xe5\xfe\x0c\x97\xa0\x59\x02\xee\xc4\xbd\x85\xaf\x85\x43\x51\x73\xf1\x47\x2f\xe1\xf7\xd6\x79\x54\xc6\xc2\x91\x16\xfe\x32\x6c\x64\xf9\x6a\xd2\x71\xd0\xf0\x35\x0f\xe0\xa2\x04\x98\x2a\xae\x24\x37\xf1\x8e\x65\xf5\x38\x64\x56\x4c\xda\xc1\xd7\xe4\x63\x54\xab\xf9\xcf\xc6\x58\xcf\x25\x9c\xb7\x6d\xe1\x51\x1b\x59\x0a\xfd\x3c\x15\x78\x2d\x7b\x4d\x0e\x74\x65\xc4\x9b\x0c\x55\xab\x8b\x81\xd3\x76\x17\x4d\x1b\x3e\xdb\x6a\x2f\x14\xe7\x09\xcd\xd1\x27\xd6\xe5\xe0\x6e\x08\xb0\xa4\x9f\x19\xf9\x5e\xca\x63\x85\xf1\xf4\xe8\x65\x7e\x70\x7b\x6d\xf4\x45\x99\xd6\x61\x4a\x3c\x9f\xf9\x60\x4d\xc3\xd6\x0b\x4e\x76\xe3\xbe\xa8\xf0\x90\x1f\xdc\x53\xdb\x48\x8e\x8e\xc3\xb3\x6a\x24\x79\xc6\xda\xf7\x8b\x95\x60\x59\x1e\x7a\xfc\x6b\xe4\x43\x04\x4b\x37\xc4\xce\xa1\x03\x9f\xa5\xd8\xab\xfe\xab\xd8\xbb\x85\xa4\x9c\xa2\xe6\x68\x4f\x52\x14\xfc\x9e\xbd\x67\x3b\xe4\x98\x6e\x39\x56\x9d\x4f\xe6\xef\xcd\x53\x0f\x39\x8d\x99\x69\x2d\xa2\xfb\x27\x86\x91\x5f\xca\x60\x49\xdb\x22\x8a\x97\xa5\xbd\x06\xe6\x75\xc1\x5f\x81\xa5\x5b\x25\x43\x5f\x90\xe2\xdb\x99\xbf\x95\x11\xdf\x8c\x9f\x4c\x79\xb9\x3a\xb3\xdb\xa6\xfd\x2d\x54\x23\x59\xb1\xf6\x94\x36\xf2\xfc\x6c\x6c\x9e\x8e\xef\x8e\x9b\xca\x72\x99\xbd\x05\x79\x35\x0e\x8c\x70\xf1\x15\x69\x1d\x97\x8f\x10\xce\xb5\x8c\x6f\xde\xfc\xf0\x26\xbb\x76\x77\x7f\xab\x45\xf4\x11\xc0\x6e\xb7\xf0\x5c\x75\x1d\x9e\xd9\xbb\x58\x3f\x04\xd4\xad\x22\x7d\x73\xaf\xa8\x4d\x38\x34\xf3\x03\x18\x29\xc4\x94\xfd\x7c\x61\x13\x02\x1e\xf2\x5f\xb9\x60\x71\x66\x3b\x26\xdd\xa6\x90\x1e\xc6\x52\xd9\xa2\x80\x4d\xb6\x04\xaf\xef\xb5\x11\x5e\xd2\xce\xa2\x02\x7f\xc6\x43\xfe\x4e\xb8\xc2\x0a\x25\x34\x79\x63\x7f\xee\xed\x9e\x14\xcf\x53\xce\xbe\xb5\x3a\x96\xb4\x42\xfb\x0a\xeb\x6f\x3f\xaf\xef\xcf\x7e\x24\xd9\xf2\xdd\xc8\xdc\xb4\x57\x9a\xe7\xf6\x96\xe8\xba\x3c\x84\xdb\x4e\xe8\xba\x28\x66\x79\x00\x67\x1f\x4e\xec\x17\xad\x70\xff\xa3\x15\x2f\x68\xd8\x9c\x49\xfe\xbb\x1f\x19\xee\x1c\xd1\xfc\x95\x8e\xfc\x17\x84\xf8\x11\x67\x92\x2f\x81\x4c\x97\xe2\x70\xa5\x03\xb3\x2f\x87\x3f\x20\xc9\x64\x0a\xa6\x11\x49\x6e\x96\x80\x3c\xb1\x15\x91\xc3\x75\xe0\x93\x92\x7f\x07\x00\x00\xff\xff\x5c\xdd\xd1\x0d\x0d\x08\x00\x00") + +func templatesSchemapolymorphicGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSchemapolymorphicGotmpl, + "templates/schemapolymorphic.gotmpl", + ) +} + +func templatesSchemapolymorphicGotmpl() (*asset, error) { + bytes, err := templatesSchemapolymorphicGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/schemapolymorphic.gotmpl", size: 2061, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd8, 0x38, 0x31, 0x5b, 0x7b, 0xaf, 0x27, 0xcd, 0xb5, 0x5f, 0x2d, 0x20, 0xa9, 0x78, 0xd9, 0x99, 0xfb, 0xc6, 0xb8, 0x2a, 0x88, 0x27, 0xdd, 0xd5, 0x59, 0x3f, 0xa5, 0xee, 0xdc, 0x33, 0x74, 0x7a}} + return a, nil +} + +var _templatesSchematypeGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x52\x3d\x4e\xf4\x30\x10\xed\x73\x8a\xa7\x54\xc9\x27\x7d\x16\x17\xa0\x08\x0d\xda\x02\x28\x96\x0b\x78\xf1\x18\x22\x4d\x6c\x2b\x76\x8a\xc8\xf2\xdd\x91\x93\x10\x0c\x6c\xb3\x88\x62\xbb\x64\xe6\xcd\xfb\x99\x71\x8c\x50\xa4\x7b\x43\xa8\xfd\xcb\x1b\x0d\xf2\x79\x76\x54\x23\xa5\x0a\x88\xf1\x3f\x7a\x0d\x69\x14\x1a\x3b\xa2\x79\x0d\x68\x98\x0c\x44\xc7\xfc\xa4\x5b\xdc\xb4\x10\x07\xdf\x19\x6b\xe6\xc1\x4e\xbe\x45\x03\x63\x43\xae\x3d\x48\xd7\xae\x1c\x2b\x4b\xa0\xc1\xb1\x0c\xbb\xc8\x9d\x55\x73\x0d\xf1\x29\x43\xec\xa9\x1c\xf8\x90\x2d\xf9\xc4\xc1\x3f\x4e\xcc\xf2\xc4\xb4\x37\x8e\x93\xa3\xb1\xe3\x5e\xfa\xac\xf7\x2f\x46\x90\x51\xdf\x88\xbe\xc0\x90\x12\x6e\xf1\x13\x27\xee\x6d\x4e\x5e\x38\x32\x2a\xa5\x6a\xfb\xca\xe5\xaa\x58\x95\xa2\x91\xb4\x26\x75\xbc\xa2\x95\x5d\x96\x20\xcc\x8e\xfe\xda\xfd\xfe\x57\xac\xfb\x17\x99\x36\x07\x0b\xcf\x69\x89\x74\x09\xf1\x3a\x72\x7d\x0f\x2c\xe3\x16\x00\xa9\xed\x4c\x31\x9e\xa9\x6c\x3e\x73\x6f\xbf\x67\x49\x76\xf6\xb0\xef\x01\x00\x00\xff\xff\x47\x0a\x2e\xc3\xc5\x03\x00\x00") func templatesSchematypeGotmplBytes() ([]byte, error) { return bindataRead( @@ -415,12 +422,12 @@ func templatesSchematypeGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/schematype.gotmpl", size: 854, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1, 0x3d, 0x4d, 0x98, 0x68, 0xdf, 0x6c, 0x32, 0x73, 0x9a, 0x5a, 0x5e, 0x30, 0x52, 0xf3, 0xef, 0xf7, 0x79, 0x7, 0x61, 0x0, 0x3d, 0x3a, 0xbb, 0x4d, 0x16, 0xcc, 0xab, 0x6b, 0x9f, 0xc3, 0x31}} + info := bindataFileInfo{name: "templates/schematype.gotmpl", size: 965, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1a, 0x13, 0x7d, 0x62, 0x54, 0x21, 0x85, 0x9e, 0x4c, 0xd9, 0x88, 0xcb, 0x7, 0xd7, 0xf5, 0x23, 0x35, 0x23, 0x5e, 0x65, 0xe0, 0x58, 0xaf, 0xcb, 0x73, 0x3d, 0xb4, 0x6e, 0x3b, 0xa0, 0x19, 0x9d}} return a, nil } -var _templatesSchemavalidatorGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\xdf\x73\xdb\x36\xf2\x7f\xfe\xea\xaf\xd8\xaf\x26\x77\x23\xa5\x0a\xd5\x87\x9b\x7b\x70\xcf\x37\x93\xa6\x69\xeb\xb9\xa6\xc9\x24\x6d\x1f\xae\x93\xb9\xc0\xd4\x4a\x42\x43\x81\x0c\x40\xc9\xf6\x71\xf4\xbf\xdf\x00\x24\x41\x10\x04\x28\xea\x97\x2d\xbb\xf2\x93\x44\x82\xc0\x62\xb1\xfb\xd9\xdd\x0f\x40\x39\xcb\x60\x82\x53\xca\x10\xfa\x09\xa7\x0b\x9a\xd2\x15\x4e\x29\x46\x93\x15\x89\xe8\x84\xa4\x31\xef\xc3\x7a\xdd\x03\xc8\x32\xa0\x53\x08\xde\xe3\x97\x25\xe5\x38\xc9\x2f\xd2\x29\x20\xe7\x70\x71\x09\x45\x73\xd4\x0d\xf2\xf6\x84\x4d\x60\x80\x5f\x20\xf8\x21\xfe\xe5\x2e\x41\xe8\x8b\x94\x53\x36\xeb\x0f\x61\xc0\xe2\x14\x82\x2b\xf1\xf3\x32\x8a\xc8\x75\x84\x43\x58\xaf\x3f\xa8\x9b\x59\x06\xc8\xe4\x00\x83\x62\xcc\x77\x24\x9d\xc3\x7a\x9d\x65\xe6\x47\x8c\x04\xc2\x7a\xdd\xef\xeb\xe6\x23\x29\x63\xc2\x29\x4b\xa7\xd0\xff\xcb\x97\x3e\x04\x3f\xc5\x21\x49\x69\xcc\xca\x9b\x74\x0a\x72\xd4\x41\xcc\xe5\xc8\x2f\x59\xcc\xee\x16\xf1\x52\xd8\x62\xc8\x81\x0a\x79\x73\x21\xf2\xfe\xb3\x2c\xf8\x8d\x44\x4b\x7c\x7d\x9b\x70\x14\x22\xef\xb7\x7b\xaf\x43\xdd\xd1\xf0\x1b\xa5\xb5\xff\xbf\x04\x46\x23\xc8\x7a\x00\x00\x1c\xd3\x25\x67\xf2\x7a\x0f\xa0\xd0\x77\xde\xba\xd2\xfd\x1b\xca\x7e\x42\x36\x53\x1a\x70\x2b\x5f\xb7\x38\xac\xea\xf2\x45\x2b\xfb\xac\xa6\x05\xeb\xf5\xf3\x76\xf5\x0c\x65\xcf\x35\xc1\x77\x9e\x3c\xb9\xdd\x34\xf9\xb2\xc5\x89\x4d\xde\x10\x7c\xd7\xc9\xbf\x23\x69\x8a\x9c\x79\xa7\x5e\xdc\x3f\xa1\x89\x7f\xca\x32\x43\xea\x4f\x7b\x98\x3c\x5d\x2c\x17\x6d\x06\x2f\xef\xe7\xad\x25\xce\x7c\xb8\x21\xb3\x19\xf2\x1c\x6c\x28\x4b\x71\x86\x0a\xc1\xae\x58\x7a\x54\x5c\x69\x1b\x9b\xe6\x63\xe7\x1d\x4f\xa3\x98\x54\xa2\xfc\xfd\x6f\x7b\x79\x55\xa1\x1b\xf5\xf5\xf5\x6d\x18\x2d\x05\x5d\x61\x75\x7d\x0f\x5f\x6b\xd7\x7a\x7e\xff\xcf\xa9\x75\xad\x1b\x4b\xeb\xfa\xfa\xce\x5a\x5f\x46\x29\x4d\x22\x7c\x3b\xf5\x2b\x5e\x37\x39\xac\x36\x95\x7a\xf6\xd2\x8a\x29\xfb\xae\x0a\x78\xcd\x4a\x9b\x1b\x8f\xe5\x9c\x97\x08\xc8\x96\x8b\x9a\x2a\xb2\x2c\x78\x8f\x21\xd2\x15\xf2\x9f\xc9\x42\xca\x17\x94\xda\x91\x33\x24\x22\x24\x11\xfd\x2f\x42\x50\xdc\xad\x5f\xfc\xb0\x9c\x4e\xe9\x2d\xac\xd7\x72\xa8\x63\x18\xe4\x76\xaa\xdb\x51\x4f\x57\xe2\xd5\x52\xa4\xf1\xe2\xfb\x98\x2f\x14\xc4\xaa\x01\xc6\xcf\x21\x9d\xa3\xbc\xfb\x21\xe5\x48\x16\x10\x12\x81\x30\xa0\xf1\x7b\x24\x93\x57\x51\x2c\x90\x0f\x81\x0a\x20\x11\x47\x32\xb9\x03\x94\x96\x3b\xc1\xc9\x08\x04\x65\x21\x02\x4d\x61\x12\xa3\x50\xb9\x0c\x47\x11\x47\x2b\x04\x22\x40\x67\x85\xf0\x7c\xac\x84\x50\x62\xa4\xb8\x48\x22\x92\x22\xf4\x0b\xed\xd3\x98\xe5\x42\x4d\x95\x50\x7d\x08\xb4\xc8\x85\xf8\xd5\xa7\x5e\x96\x95\x39\xa7\x88\x68\x88\x9d\x52\xcd\xd6\x64\xf3\xe0\x4b\xd9\x71\xb5\xac\xf5\xf2\xad\x98\xcc\x0c\xdf\x50\x76\x95\xe2\x42\x28\x74\xcd\x3f\x55\xea\x0c\xae\xd8\x04\x6f\x7f\x23\xbc\x61\xb1\x85\x19\x7f\x90\x5f\x2e\x2e\x81\x32\xe9\xa6\x11\xca\x50\xef\x92\x71\xe8\x0d\xa3\xb5\x21\xdd\x91\x54\x35\x39\xbc\x2a\xbb\xcc\xad\x0c\x68\xa5\x94\x7b\x28\xbb\xa1\x5f\x77\x00\x7b\xf0\xc9\x56\x52\xee\x33\xd9\x5f\x19\xfd\xb2\xc4\x4d\xf3\x35\x5a\x1d\x7a\xca\x87\xf5\x14\x23\x06\xa8\x28\x30\x8d\x39\x28\x8c\xb0\x66\xb6\x6d\x18\x38\x06\xde\x1f\x78\xe6\x16\x26\xbc\xd0\xe5\xb3\xaa\x2b\xe5\xcd\x0a\x11\x8b\xef\x3f\x12\xf1\x9b\x86\x5f\x51\x5e\xbd\x12\xdf\x12\x81\x2a\x1f\xd2\x57\x5e\x46\x94\x08\x9c\xe8\xb2\xbb\xb8\x7c\xc5\x52\xe4\x53\x12\xa2\x7d\x23\x0f\x21\xc3\x52\x1c\x50\x0b\x91\x65\xa6\x79\xcb\x65\xf8\xfa\x1b\xfb\xe2\x3f\xc0\x0f\x4e\x76\xe3\xaf\xbe\xd2\x2a\x92\xf3\xbd\xa1\xe9\xdc\x52\x83\xa5\x0a\x33\xba\xe6\xf2\x96\x1a\xa9\xf8\x84\x37\x24\x91\x6d\xde\xae\x90\x73\x3a\xc1\xa1\xd9\x95\xb2\x20\x71\x43\x66\xc1\x95\xf8\x37\xf2\x78\xe0\x41\x7a\xc8\xa4\xed\xe5\x81\x30\xef\xdf\xe8\x02\x20\x8c\x59\x4a\xd9\x12\x8d\x8b\x75\x71\xf5\xd2\x96\x97\x8c\x78\x99\xf0\x38\x41\x9e\xde\x19\x41\x2f\xa8\x1a\x37\x9e\xae\xcc\xc1\xb0\x97\x17\xa5\xb9\x9a\xb6\x52\xd0\x0f\xf9\x42\xc3\x80\x61\x73\x6a\x35\x9f\x19\x96\x59\x43\xc2\x71\x85\x2c\x15\x30\x43\x86\x9c\xa4\x38\x81\x30\x9e\x20\xa4\x31\x84\x24\x8a\x80\xa6\x02\xa3\xe9\x05\xa4\x73\x2a\x64\x02\xc1\x51\x20\x5f\xe1\x44\xd9\x04\x29\xc6\x4b\xef\x12\x14\x55\x8a\xb0\x61\xd9\xfc\xcb\x44\xa7\x9e\xf0\x6b\x3b\x55\x43\x53\x35\x70\x68\x3e\x1f\x14\x9e\x82\x83\x3c\x43\x11\x6e\x5f\x55\xfd\xac\x70\x04\xf1\x67\xd9\x15\x72\x1e\x0c\x9e\x23\xe7\x31\x17\x41\xe5\x6b\xc3\x6f\xe4\xfd\xcc\x30\x80\xc2\xc7\x57\xa8\xc7\x91\x3a\xde\x12\x72\x86\xbd\xa6\x3d\x59\xe0\x51\xdd\xda\x51\xc1\x1e\x4b\x6b\x5a\x98\x9d\xb5\x19\x4c\xe1\x82\x24\xb5\x9c\x4d\x99\x51\x89\xbf\x02\xc8\x64\x42\xa5\x96\x48\xf4\x2e\x37\x76\x5a\x99\x46\xa1\x90\x1f\x89\x78\xe9\x6a\x55\x37\x69\x08\x5c\x8d\x6c\xd8\x2b\x9e\xc9\x11\xca\xf3\xc8\xbf\xf0\xae\x42\x2d\x4e\xd8\x0c\x7d\x66\x56\xd9\x57\x01\x48\x6d\x72\xda\x50\x6d\x61\x52\xbd\x1a\x50\x5a\x12\x9f\x69\x02\x37\x73\x64\xc0\x96\x91\xf2\x1a\x95\x93\x87\x21\x26\xd2\xf1\x0c\x07\xda\x1b\xaa\x2c\x98\xb2\x20\x4a\x1a\x5f\x29\xb6\x03\x46\x5f\x72\x4e\xee\x34\x44\xe8\xc0\xa3\x62\xb1\x94\x38\xe1\x71\x88\x42\x7a\xfe\x35\x46\xf1\x8d\x25\xf8\x7d\xe5\xe9\x9d\x43\x70\x8b\x1f\x79\x20\xfb\x45\x51\x6a\xbd\xd3\xf5\x4f\x2d\x90\x54\x0d\x4a\xc4\xad\xdd\xd6\x0d\x4a\x75\x6a\x56\xd8\x54\xd3\x8a\x44\x25\xd0\xb8\x97\xb7\x01\x33\x7b\x38\x7e\x35\x66\x53\x39\x5e\x3d\x58\xab\xd9\x19\x44\x3d\x3a\xaf\xeb\x7d\xef\xe9\xb8\xba\x72\x44\xcf\xda\xed\xdc\xc8\x4c\xc4\x92\xaa\x8e\xa5\x00\xe5\x12\xc5\xd7\x7f\x60\x98\xd6\xa2\x59\xd5\x45\x81\x1e\xc1\xcb\x28\x2a\x89\x1a\x5f\x13\x37\x5e\xd4\x5a\x76\xcd\x0b\x6a\x0f\x35\xd6\xc8\xbb\x78\xdb\xc8\xb3\x83\x34\x6e\x59\x3c\x92\x54\x1b\x42\xc1\x95\xf8\x65\x99\x44\x68\x62\xab\x95\xf6\x8d\xc7\xf0\xcb\xdb\xef\xde\x5e\xe8\x35\x62\x33\x23\xac\x00\x55\xad\xc5\x3c\x5e\x46\x13\x98\xc5\x30\x47\x8e\x23\xd9\xfd\x5d\xbc\x04\x81\x98\xe7\x2a\x9c\x50\x81\x40\x18\x50\x21\x34\x0c\x8e\xc7\x40\x52\x98\xa7\x69\x22\x2e\xc6\xe3\x19\x4d\xe7\xcb\xeb\x20\x8c\x17\xe3\x59\xfc\x42\xe4\x54\xa2\xf9\x51\x3d\x2a\xec\x89\x34\xa6\x57\xc1\x97\xdd\xd4\xd4\xa9\x67\x7f\x2d\x68\xf6\xd5\x44\x23\x13\xb0\x1d\x0c\x90\xaa\x12\xec\x7a\xa0\x82\xf5\xc2\xe2\x43\xf5\x14\xe4\xce\xab\xb0\x29\x24\x49\xba\x94\xc8\xee\xa6\x7a\xaa\xf1\xcf\x9b\x7f\xf7\xb8\xf9\xd7\xea\x4a\xf5\xc8\x52\x90\x7d\xc5\x02\xe7\x4e\xa3\xaf\xca\x15\xb0\x2c\xa5\x70\x9a\x6b\x84\xc5\x32\x5d\x92\x28\x2a\x98\x40\x21\xd7\x9d\xb2\x3c\x25\x29\xf8\x3f\xde\x84\xc0\x6d\xb8\xbf\x96\x59\x94\x6b\x58\x84\x50\x99\x6c\x34\x9c\xa0\x1a\xc7\x66\x09\x03\x7f\x57\x6f\x48\xd2\xd2\x51\x3d\x71\x6d\xfa\x9d\xcd\x40\xd4\xab\x0a\xd8\x8e\x73\xc8\xed\xe5\x18\x44\xf3\x61\xd2\x9e\x4d\x0b\x93\x9b\xf4\xab\x78\x91\x44\x78\xfb\x56\xc5\x44\x03\xba\xaf\xdc\x09\xbc\x2f\x21\xda\x90\x0e\xed\x98\x0c\xed\x9c\x3b\xb4\x25\x42\x0f\x91\x06\xed\x3c\x91\xd6\xd0\xdb\x58\x6b\x77\x88\x6a\xcf\x68\x4e\x28\x7f\xe8\x20\xc7\xd6\x52\x78\x21\xd6\x15\xe3\x9f\x42\x02\xe3\x4a\x2f\x5c\x46\x53\xbf\xda\xf8\xe6\x22\x6b\x79\xbc\x80\x05\x49\x1a\x5c\xed\x96\xc0\xf9\xb0\x98\xe9\x60\x6b\x6d\xbe\xf6\x45\x2d\x78\xd5\xe1\xce\xf4\x64\x83\xaf\xad\xa8\x56\x57\x6c\x79\x04\x85\xb2\x83\x2f\xaa\xbc\x41\x46\xdd\x26\x2d\xe3\x2a\xb2\x0a\x65\x2d\x48\x22\xe0\x7a\x69\x6c\x39\x7e\x66\xf1\x0d\x90\xeb\x78\x99\x82\x2b\xb0\x5c\x00\x06\xb3\x00\x68\x0a\x61\xbc\x40\x91\xdb\x1a\x81\x67\x1c\xa7\x0e\xd6\xd1\x5f\x75\xeb\x26\xcf\x74\xb2\xa0\xc4\xbc\x41\xd5\x71\xd9\xef\x82\x24\x05\xda\xd4\x89\x8d\x6d\x83\x94\x9f\x5a\xd8\xa5\xde\x75\x08\xdf\xa1\xb4\x77\x21\x7f\x67\x9a\xb5\x65\x12\x2d\x31\x32\xb7\xde\x4a\xca\x15\x89\x2a\xbb\x75\x0f\xac\x6d\xf9\xb0\xc1\xf5\x20\xec\x82\x7f\x15\x63\xde\x58\x8b\x96\xc7\xb6\xe6\x5c\x8d\x9d\xf2\x9c\x94\x68\x6e\x95\x8f\x9f\x4b\xe8\xfd\xee\xf5\xb7\xbf\xfe\x90\x1f\x9c\x50\x28\x7a\xa1\x96\xb7\xc0\xd3\xe2\xba\x86\xaa\xfc\xa6\x85\x5c\x45\x8b\xd2\x63\x74\x9b\xba\x0b\xe5\xad\x4a\x35\x96\x8d\x0c\x92\xb3\x68\x53\xe2\xd8\x45\x81\xfe\x66\xdd\x98\xf7\x51\xee\x51\x95\x7d\xe8\x3d\x2b\xdd\xc6\xb2\x91\x0b\x8f\xc5\xea\x11\xab\x08\x73\xe1\x8a\x39\x15\x03\xdd\x0a\x11\x4e\xfc\x2e\xca\x3b\x3d\x4f\x43\xde\xe1\x23\xc5\xf3\x4d\xc4\x75\x7d\x3d\xda\x31\xe3\xd2\x33\x26\xa3\x91\x63\xcc\x96\xac\xe2\x7e\x36\xb2\xd4\xc1\x18\x23\x18\x1d\x6a\xef\xea\xbc\x7b\xd5\x40\xce\x07\xdb\xbd\xaa\xed\x8f\x7a\x2a\x9c\x4d\x15\xc5\x56\xfb\xb6\xad\xc9\x72\xcb\x30\x9d\x07\x69\xa4\xa0\xe6\x97\xae\x85\xc9\xb1\xca\x92\x5d\x8b\x92\x4d\x51\xcf\xa1\x10\x73\xce\xae\xfd\x99\x96\x9d\x99\x9a\xae\x1b\x01\x35\xa8\x59\x53\x2d\x61\xda\x92\xc7\x75\x59\xe7\x83\xd0\xb7\x67\xe2\xf6\xde\x89\x5b\x77\x9d\x64\x93\xb5\x2e\xbb\xda\xc8\xa6\xba\x51\xce\x41\xa1\x76\x23\x4f\x1d\x66\x29\xf3\x58\xa9\x11\xbd\x0b\xac\x8f\x0d\x15\x0d\x4a\x97\xaa\x9d\x1d\xd2\xf6\x89\xb7\x21\x26\xa9\xda\x89\xa7\xe5\xdd\x91\x3a\x95\xca\x91\x4d\x90\x53\x36\xad\x1d\x1a\x51\x55\x20\x15\x90\x20\x97\x93\xc5\x09\x5c\xdf\x81\xe5\x97\x9e\x63\xa7\x4e\x26\xd7\x9c\xd1\x81\xd8\xcb\x4e\x90\xe1\x43\x31\x7d\x60\xc2\x42\x8a\xcd\x10\xb6\x05\xdc\x9c\xd1\xe5\x8c\x2e\x27\x87\x2e\xd6\xf3\x46\x7d\xdc\xd1\x8b\xdb\xce\x8c\x87\x73\x5c\x10\xcf\xa1\x71\x93\x92\xcc\x2f\x0d\x1a\x2f\x89\x68\x7b\x33\x35\xf5\x6c\x16\xab\xad\xaf\x8b\x4b\x63\xa1\x7b\x61\xcc\x44\x0a\x83\x46\xc2\x58\x7b\x55\xc1\x78\xda\x3e\xf5\x2b\x53\xff\xc2\x8b\x84\x7a\x99\xa1\x78\xaf\xc1\xb6\x4a\xd9\xd7\xff\x6d\xe8\xa7\x76\x1b\x2e\x9d\x7d\xd8\xd9\xe8\xd0\x4a\x1d\x7b\xe5\x99\x5a\xa5\xc3\xde\x8a\xa8\x33\x53\x21\x59\x60\x83\x81\x85\xdf\x3f\x6a\x10\xcf\xd6\xbd\xe9\x92\x85\x40\x19\x4d\x07\x43\x65\x9e\xf2\x51\x39\xa9\xdf\x3f\xd6\x56\x74\x82\x1c\xa7\x53\x9c\x7c\x50\x03\x48\x35\x6a\xc9\x2a\x60\xf8\x43\xc4\x2c\xf8\x95\x2d\x08\x17\x73\x12\x0d\x7e\xff\x78\x7d\x97\xe2\xe0\x53\x96\xa9\x3b\x5a\xbb\x9f\x86\x23\xf8\x2b\x47\x67\xad\x93\x10\x46\xc3\x01\x72\x3e\x2c\x7c\x43\xce\xea\x3f\x23\x58\x55\x07\xbc\xa4\x74\x59\x39\x7f\xf7\x14\x2f\x81\x24\x09\x32\x55\x9e\x3b\x5b\x8c\x60\x95\x0f\xb0\xee\xe5\x1a\x18\xb8\x98\x85\xca\xe1\x2d\x34\x37\x5f\x00\x29\x5c\xe1\xf5\x6d\x12\xf3\x14\x27\xbe\x03\xe2\x75\x9e\xcc\xb8\x98\xc3\x04\x6c\x66\xce\x13\x92\xce\x47\x10\x95\x38\x97\x5b\xfb\xa8\x32\x3c\x1d\x1c\x75\x2c\x6c\x44\x49\xcf\x99\xb7\xda\x74\x36\xaf\xf9\x10\x54\xe9\xa9\x16\xc1\x11\x15\x1c\xc2\x16\x52\x8e\xbc\x2b\xd6\x09\x26\x0d\xf6\x61\xdd\x72\xd6\xba\xf4\x61\x9f\x13\x54\x8d\xea\x9e\xb0\x97\x2b\x18\xd5\x58\x77\x7f\x30\xc5\x3d\xaa\x53\x54\x03\xb5\x7a\x86\x6e\xd6\xcd\x3d\x9e\x57\x74\xb0\xcf\xfa\x9f\x39\xcd\xbf\x7e\xb9\x8b\x03\x68\xc9\x4e\xc4\x0b\xf4\x2b\x1e\x87\x75\x05\x3d\xcd\x03\xf8\xc3\xe6\x53\xae\x56\x68\x2d\x42\x88\x41\x1b\xc8\x2a\x5d\x78\xfd\x48\x9f\x83\x38\xa4\x1f\x9d\x62\x48\xa9\x26\xda\xea\x3d\xba\xd9\x56\xde\x73\xec\xd0\x51\x9d\x56\x39\x0d\xcf\x39\xbc\xd3\xe8\x19\xee\xe2\x34\x8d\xfc\xb8\xfc\x3c\x1e\x43\xc9\x99\x1a\x47\xe0\x15\x4f\x96\x65\x30\x5f\x2e\x08\x33\x85\xd0\x0b\xed\x49\x22\x0e\xa1\x59\x69\x2d\xdf\x51\x11\xca\x44\x84\x29\x71\xd4\xe5\x86\x42\xea\x27\xa7\xf6\xb5\x2e\x9b\xa1\x96\x86\x33\x5d\xa4\xc1\x7b\x9c\x51\x91\xf2\x3b\x73\x35\x2b\x4f\x57\xd7\x7a\x3d\x2f\x4b\x6b\x56\x38\x2e\xfa\x34\x7f\x53\xb8\xdc\x61\x56\xb8\x94\x1f\x61\x0b\xe3\x45\x12\x0b\xa5\xab\x1c\xe2\x6a\x15\xdc\x86\x2d\xed\xa2\x6e\xab\xf6\xec\xed\x22\xae\xda\xfd\x51\x4d\xab\x8d\xfe\x7a\x95\x3d\xf4\x14\x63\xce\x52\xbe\x3b\x2b\xad\x77\x6d\x64\xe0\x34\x56\x3a\xe6\xdf\xcb\x8e\xf3\xd5\xe9\x2e\x1a\xec\xf5\x6a\x5d\x97\x6d\x5a\xb9\xd6\x1a\x13\x39\x8a\x11\x14\x30\x5b\xfe\x75\xdf\x34\xad\xf3\xdd\xbe\xf7\x48\x8c\x7d\x84\x61\xc7\x17\x54\x28\x03\xc2\x0a\xf6\x09\x6e\xe6\x34\x9c\x03\xcd\x8f\x26\xe4\xfb\x46\xc5\xa9\x80\xda\x89\xc8\x6e\x87\x0b\x1d\x33\xd8\xe2\x24\xd1\x1e\x07\x69\xf2\x17\x3e\x37\xac\x4f\xeb\xda\xf8\xf6\x37\xaa\xea\xbe\xab\x91\xb5\x4f\xa3\x26\xfe\x60\xc2\xe3\xe4\x1d\x09\x3f\x13\xe9\x05\xb9\xcf\x0e\xb7\xd9\x04\xeb\x30\x25\xdf\xde\x7b\x17\x47\x6d\xf7\xd1\xc3\xfb\xe7\xf1\x7c\xb3\x93\xa2\x5c\x51\xef\x64\xbc\x70\x2b\x3a\xa9\xab\xe7\x79\x05\xcd\x1b\x48\x19\x21\x55\x0f\x6b\x39\x8e\xeb\xa5\x2d\xeb\xe4\xae\x70\xd5\x0c\x55\x2a\x3a\xb0\x69\x89\xa1\xbd\x2c\xbd\x2a\x8e\x56\xbf\xb8\xb1\xff\x01\xbe\x7e\x7f\x04\xfd\xeb\x78\x72\xd7\x1f\xb9\x7a\xd8\x73\xa2\x79\x4a\x18\x21\x93\xad\x86\xf0\x4f\xf8\xba\x91\xc8\xc5\x5c\x04\xaf\x8a\x2c\x00\x2b\xcf\x7a\x2d\xef\xc8\xa7\x82\x20\x18\xba\x92\xbd\x4e\xfe\xdd\xe6\xba\x36\xd0\x07\x3e\xa6\x41\x97\xb7\x12\xe1\x9c\x9a\x94\xc3\x3f\xe5\xd2\x69\x0b\x0d\x38\x6b\xaa\xee\xcf\x9b\xc5\x56\x3d\x95\xea\x42\x10\x43\x1b\x49\x5c\x6f\x22\x8b\x61\x26\xc7\x96\x8d\xca\xac\xbf\xce\x23\x43\x2b\x97\xec\x66\x45\x8c\xab\x7a\x84\x7d\xd9\xe6\xfd\x46\xea\xce\x47\x83\x83\x93\x86\x06\x2f\x2d\x07\x33\x41\xa8\x03\xa1\xd4\x56\xe5\x34\x28\xa5\x9d\x28\xa8\xad\x19\xa8\x27\x59\x42\x77\x77\xb3\xdd\x6a\x6b\x3b\xc1\xec\x46\xd4\xba\x8d\x76\x13\x7d\xfb\xf4\xd8\xdb\xae\x7a\x68\x47\xd0\xf6\x87\xb7\x64\x7a\x4f\xd0\x31\xb7\xa7\x86\x8b\xdf\x42\x29\x7d\xb4\xf8\x6a\x7b\x6a\xf9\x0b\x2b\x27\x47\x16\x77\x5c\xd9\x03\x7b\xac\xb7\x8e\xf5\xb5\x38\xb1\xec\xc8\x29\x7f\x77\x67\xf7\x4c\xee\x09\x25\x4f\x8f\xd3\xfb\xb7\x71\x7c\x7b\x0d\x7d\x95\x62\x13\x0c\x9a\x0d\x0e\x00\x0b\x4d\x8b\x7c\x34\x51\xdd\x89\x12\xf6\xf7\xae\x3f\xb3\x62\x6f\x42\x59\x1b\x50\xc5\x23\x46\x02\xb9\x5d\xbe\xf0\xe4\xb7\xa9\xba\x4e\x7f\x87\x34\x61\xb7\x2d\xad\x93\x04\x8a\xa7\xbb\x0f\xd6\x71\x09\x8f\xe1\xeb\x0d\xde\x7b\x7f\x6a\xd4\xbb\x8f\x76\xca\xc6\xd5\x65\x6f\xcc\x54\x55\xed\xb5\x1c\x8d\x25\xbb\xff\x2c\x54\xed\xbd\x1c\xff\xc2\xd5\xd8\xdd\x67\xa6\x85\xab\x17\x3d\xcf\xe7\x3d\xef\xf5\x67\x40\x9c\x6f\x1f\x6e\x7e\x67\xa4\x4b\xd6\xee\x27\xf7\x3d\x9b\xb1\x1b\xde\x64\x39\xf8\xc6\xe4\x99\x40\x3d\xc9\x1a\xa0\x60\xeb\xa4\xd9\x9d\xb9\xba\x53\x0d\xf3\xf7\x98\xd5\x1f\x93\xaf\x3b\x13\x76\x67\xc2\xee\x4c\xd8\x1d\x80\xb0\x6b\x71\xdb\x16\xd2\xee\x4c\xdb\x3d\x8d\x90\xfd\x38\x31\xe0\x4c\xdb\x3d\x4c\x80\xf7\x60\x45\xf3\x4a\x37\xf2\xae\x7b\x22\xbf\x15\x35\xf7\xe4\x92\xf8\x7b\x62\xe6\xba\x90\xa7\x8f\x13\x2f\xce\xec\xdd\x91\x5c\xbe\x77\x26\xdc\x8e\x4c\xb8\x1d\x93\xd1\xf1\xfc\xf0\xbe\xfd\x6f\x88\xb6\x49\xf3\x8e\x5a\xb6\x3d\xa2\x6c\xae\x63\xd5\x76\xae\xcf\xfe\x3c\x09\xda\x81\x2a\xb6\xca\x7d\x5b\xa1\xb7\xb9\x30\x5d\xd6\xad\x1b\x30\xfa\xd7\xae\x62\x6f\xed\x3b\xae\xb3\xb0\xe5\xff\xe6\xb0\xfe\x7d\x50\xdb\x3f\xe2\x08\xfc\xb2\x1b\xbf\xa2\xd5\x0e\x9a\x4e\x18\x69\xe2\xa4\xf7\xfd\xc8\xea\xd3\xff\x02\x00\x00\xff\xff\x25\x37\x04\x97\x27\x79\x00\x00") +var _templatesSchemavalidatorGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5d\x5b\x73\xdb\x36\x16\x7e\x5e\xff\x8a\xb3\x9e\xec\xae\x94\xba\x54\x1f\x3a\x7d\x50\x37\x3b\x93\xa6\x69\xeb\xd9\xa6\xc9\x34\x4d\x1f\x36\x93\xd9\xc0\xd4\x91\x84\x86\x02\x19\x80\x94\xed\xd5\xe8\xbf\xef\x00\xe0\x05\x04\x01\x8a\xd4\xc5\x96\x5d\xf9\x49\x22\x41\x5c\xce\xe5\x3b\xe7\x7c\x00\xe5\xd5\x0a\x26\x38\xa5\x0c\xe1\x3c\xe1\x74\x41\x53\xba\xc4\x29\xc5\x68\xb2\x24\x11\x9d\x90\x34\xe6\xe7\xb0\x5e\x9f\x01\xac\x56\x40\xa7\x10\xfc\x8a\x9f\x33\xca\x71\xa2\x2f\xd2\x29\x20\xe7\x30\x7e\x06\x79\x73\x2c\x1b\xe8\xf6\x84\x4d\x60\x80\x9f\x21\xf8\x31\xfe\xed\x36\x41\x38\x17\x29\xa7\x6c\x76\x3e\x84\x01\x8b\x53\x08\x2e\xc5\x2f\x59\x14\x91\xab\x08\x87\xb0\x5e\xbf\x55\x37\x57\x2b\x40\x26\x07\x18\xe4\x63\xbe\x21\xe9\x1c\xd6\xeb\xd5\xca\xfc\x88\x91\x40\x58\xaf\xcf\xcf\xcb\xe6\x17\x72\x8e\x09\xa7\x2c\x9d\xc2\xf9\xdf\x3e\x9f\x43\xf0\x73\x1c\x92\x94\xc6\xac\xb8\x49\xa7\x20\x47\x1d\xc4\x5c\x8e\xfc\x9c\xc5\xec\x76\x11\x67\xc2\x9e\x86\x1c\x28\x9f\xaf\x9e\x84\xee\x7f\xb5\x0a\x7e\x27\x51\x86\x2f\x6f\x12\x8e\x42\xe8\x7e\xbb\xf7\x3a\x2c\x3b\x1a\x7e\xab\xa4\xf6\xd7\x67\xc0\x68\x04\xab\x33\x00\x00\x8e\x69\xc6\x99\xbc\x7e\x06\x90\xcb\x5b\xb7\xae\x64\xff\x8a\xb2\x9f\x91\xcd\x94\x04\xdc\xc2\x2f\x5b\xec\x57\x74\x5a\x69\x45\x9f\xd5\xb2\x60\xbd\x7e\xda\x2e\x9e\xa1\xec\xb9\x36\xf1\xad\x17\x4f\x6e\x36\x2d\xbe\x68\x71\x64\x8b\x37\x26\xbe\xed\xe2\xdf\x90\x34\x45\xce\xbc\x4b\xcf\xef\x1f\xd1\xc2\x3f\xae\x56\xc6\xac\x3f\xee\x60\xf2\x74\x91\x2d\xda\x0c\x5e\xde\xd7\xad\x25\xce\xbc\xbd\x26\xb3\x19\x72\x0d\x36\x94\xa5\x38\x43\x85\x60\x97\x2c\x3d\x28\xae\xb4\x8d\x4d\xf5\xd8\xba\xe3\x69\x14\x93\x6a\x2a\xdf\x7c\xbd\x93\x57\xe5\xb2\x51\x5f\x5f\xde\x84\x51\x26\xe8\x12\xab\xeb\x3b\xf8\x5a\xbb\xd4\xf5\xfd\x3f\xa7\xd4\x4b\xd9\x58\x52\x2f\xaf\x6f\x2d\xf5\x2c\x4a\x69\x12\xe1\xeb\xa9\x5f\xf0\x65\x93\xfd\x4a\x53\x89\x67\x27\xa9\x98\x73\xdf\x56\x00\x2f\x59\x61\x73\xa3\x91\x5c\x73\x86\x80\x2c\x5b\xd4\x44\xb1\x5a\x05\xbf\x62\x88\x74\x89\xfc\x17\xb2\x90\xf3\x0b\x0a\xe9\xc8\x15\x12\x11\x92\x88\xfe\x0f\x21\xc8\xef\x4a\xc1\xbc\xcd\xa6\x53\x7a\x03\xeb\xb5\x1c\xe0\x10\x66\xd8\x4f\x60\xfd\xa5\xf3\x65\x91\x4a\x05\x97\xe2\x45\x26\xd2\x78\xf1\x43\xcc\x17\x0a\x5d\xcb\x3c\xea\x6d\xca\x91\x2c\xaa\xbc\xea\x3b\x22\xf0\x9b\xaf\x87\xba\x0b\xd5\x61\x8a\x8b\x24\x22\x29\xc2\x79\x2e\x31\x1a\x33\xdd\xdb\x54\xf5\x76\x0e\x41\xa9\x8e\x7c\xf0\xea\xd3\xd9\x6a\x55\xe4\x89\x22\xa2\x21\x76\x4a\x0f\x5b\x13\xc4\xbd\x2b\xa2\xa3\xac\x2d\x69\xfb\xac\x51\x66\x73\xaf\x28\xbb\x4c\x71\x21\x14\x22\xea\x4f\x95\x38\x83\x4b\x36\xc1\x9b\xdf\x09\xd7\x33\x6e\x9a\xde\x5b\xf9\x65\xfc\x0c\x28\x93\xae\x15\xa1\x0c\xcf\xae\x39\x0e\xbd\xa1\xaf\x36\xa4\x3b\xfa\xa9\x26\xfb\x17\x65\x97\xb5\x15\x41\xa8\x98\xe5\x0e\xc2\x6e\xc8\xd7\x1d\x74\xee\x7d\xb1\xd5\x2c\x77\x59\xec\x3b\x46\x3f\x67\xb8\x69\xbd\x46\xab\x7d\x2f\x79\xbf\x9e\x62\xe0\xb6\x42\xee\x69\xcc\x41\x61\x84\xb5\xb2\xbe\xd0\x7d\x08\xb4\xde\xf3\xca\x2d\x4c\x28\x71\x5a\xd7\x82\xf2\x66\x85\x88\xf9\xf7\x9f\x88\xf8\xbd\x84\x5f\x51\x5c\xd5\x78\xad\x72\x98\xf2\xca\xf3\x88\x12\x81\x93\x12\xd2\xf3\xcb\x97\x2c\x45\x3e\x25\x21\xda\x37\x8a\x08\x90\x4f\x07\x94\x22\x56\x2b\xd3\xbc\xa5\x1a\xbe\xfa\xd6\xbe\xf8\x4f\xf0\x83\x93\xdd\xf8\x8b\x2f\x4a\x11\xc9\xf5\x5e\xd3\x74\x6e\x89\xc1\x12\x85\x19\x1b\xf5\x7c\x0b\x89\x54\xb1\xea\x15\x49\x64\x9b\xd7\x4b\xe4\x9c\x4e\x70\x68\x76\xa5\x2c\x48\x5c\x93\x59\x70\x29\xfe\x83\x3c\x1e\x78\x90\x1e\x56\xd2\xf6\x64\x87\x3c\xef\xdf\xe8\x02\x20\x8c\x59\x4a\x59\x86\xc6\xc5\xfa\x74\x4b\xd5\x16\x97\x8c\x78\x99\xf0\x38\x41\x9e\xde\x1a\x41\x2f\xa8\x1a\x37\x9e\xae\xcc\xa1\x16\xc3\x73\x73\x35\x6d\x25\xa7\x0c\xb4\xa2\x61\xc0\xb0\xb9\xb4\x9a\xcf\x68\x76\x62\xf4\x14\x12\x8e\x4b\x64\xa9\x80\x19\x32\xe4\x24\xc5\x09\x84\xf1\x04\x21\x8d\x21\x24\x51\x04\x34\x15\x18\x4d\xc7\x90\xce\xa9\x00\x2a\x80\xa3\x40\xbe\xc4\x89\xb2\x09\x92\x8f\x97\xde\x26\x28\xe0\xe9\xa8\xb6\x12\xaf\xda\xfc\x6a\xa2\x53\x4f\xf8\xb5\x9d\xaa\x21\xa9\x1a\x38\x34\x9f\x0f\x72\x4f\xc1\x81\xce\x50\x84\xdb\x57\x55\x3f\x4b\xbc\x80\xf8\x93\xec\x0a\x39\x0f\x06\x4f\x91\xf3\x98\x8b\xa0\xf2\xb5\xe1\xb7\xf2\xfe\xca\x30\x80\xdc\xc7\x97\x58\x8e\x23\x65\xdc\x13\x72\x86\x67\x4d\x7b\xb2\xc0\xa3\xba\xb5\xa5\x80\x3d\x96\xd6\xb4\x30\x3b\x6b\x33\xd8\xbd\x05\x49\x6a\x39\x9b\x32\xa3\x02\x7f\x05\x90\xc9\x84\x4a\x29\x91\xe8\x8d\x36\x76\x5a\x99\x46\x2e\x90\x9f\x88\x78\xee\x6a\x55\x37\x69\x08\x5c\x8d\x6c\xd8\x33\x9e\x79\x52\x4c\x62\xa2\x0c\x40\x48\x15\xba\x89\xb6\x27\x9f\xf0\x56\xa2\x90\x6c\xe0\x1c\xe4\xdf\xfa\x7e\xde\xb9\x86\xbf\x4d\x4d\x65\x6f\x9c\xb0\x19\xfa\x6c\xb8\x32\xde\x1c\xed\xda\x84\x60\xc7\x01\x0b\xf0\xea\x85\x82\x52\x81\xf8\x44\x13\xb8\x9e\x23\x03\x96\x45\xca\x25\xa5\xbf\x92\x30\xc4\x44\x7a\xb5\xe1\x9d\x4d\x1c\x6c\x88\x6e\xbd\x7e\x6f\xc8\x69\xbd\xfe\xd0\x06\x8b\x16\x24\x5a\x70\x28\x0d\xbd\x58\x85\x03\xb2\x9f\x73\x4e\x6e\x4b\x38\x2a\x83\x9c\x8a\xfb\x72\x01\x09\x8f\x43\x14\x12\x65\xae\x30\x8a\xaf\xad\x75\xdc\x59\x4d\xd0\x41\x42\x1e\x48\xf1\xfa\xb0\x27\x5c\x7c\x99\x17\x82\x6f\x0a\x16\xbd\x1e\xc4\xaa\x06\x05\xda\xd7\x6e\x97\x0d\x0a\xf1\x96\x2c\xb2\x29\xb6\x25\x89\x0a\x90\xeb\xb4\xb6\x06\xe2\xed\x80\x41\xd5\x14\x9a\xb2\xf2\x8a\xc5\x52\x76\x67\x3c\xf7\xa8\xa0\xae\x86\x9d\x97\xe3\xea\xca\x11\xc8\x6b\xb7\xb5\x0d\x9a\xe0\x29\xad\x2d\x96\x13\x28\x34\x16\x5f\xfd\x81\x61\x5a\x0b\xac\x55\x17\x39\xd6\x04\xcf\xa3\xa8\xe0\x79\x7c\x4d\xdc\xe8\x52\x6b\xd9\x35\x45\xa9\x3d\xd4\xd0\x91\x57\x79\x7d\xe6\xb3\xc5\x6c\xdc\x73\xf1\xcc\xa4\xda\x4f\x0a\x2e\xc5\x6f\x59\x12\xa1\x89\xc4\x56\x06\x3a\x1a\xc1\x6f\xaf\xbf\x7f\x3d\x2e\x75\xc4\x66\x46\x84\x03\xaa\x5a\x8b\x79\x9c\x45\x13\x98\xc5\x30\x47\x8e\x17\xb2\xfb\xdb\x38\x03\x81\xa8\xd3\x26\x4e\xa8\x40\x20\x0c\xa8\x10\x19\x2a\x95\xcb\x4e\x07\x53\x09\x84\x63\xa0\x6c\x89\x22\xa5\x33\xb9\xe0\x74\x8e\x10\x12\xa1\xf2\x2f\x8e\x8b\x78\x29\x2f\x91\x14\xc2\x78\xb1\x40\x96\x8e\xc1\x9e\xa9\x1e\x9b\xfd\x43\x35\x41\xa0\x0c\x16\x24\x11\x01\xbc\x4b\x84\xca\xe2\x4d\xe3\xa2\x02\x18\xe2\x44\x26\x6c\x31\xcc\x32\xc2\x27\x40\x66\x84\x32\x91\xea\x79\x1a\x76\x36\x1a\x01\x49\x61\x9e\xa6\x89\x18\x8f\x46\x33\x9a\xce\xb3\xab\x20\x8c\x17\xa3\x59\xfc\xa5\xd0\x3c\xa9\xf9\x51\x2d\x4c\xd8\x62\x6e\x08\xbf\xc2\x5e\xbb\xa9\xa9\x71\xcf\xe6\x61\xd0\xec\xab\x09\x9d\x66\xb4\x71\x71\x5c\x32\x4f\xb6\x0b\xa7\x2a\x26\xe5\xfe\x18\xaa\xa7\x40\x43\x8b\x02\xd2\x90\x24\x69\x26\xc3\x12\x91\x01\xa9\xc0\x65\xcb\x2f\x0b\x64\x3e\xed\x6c\xde\xd1\xce\x66\xab\xa3\x37\x92\xa7\x36\x66\xb3\xf4\xc9\x31\x14\xcd\xd4\x93\x96\xfd\xe4\x8e\x7e\x85\xb0\xc8\xd2\x8c\x44\xd1\x2d\x60\x41\xdb\x4b\xd7\x53\x49\x17\x47\x11\x47\x4b\xe4\x4d\xd8\xee\x43\x9d\xb6\xac\xad\xd0\x6c\x9e\x05\xc8\xfc\xa9\xe1\x1a\xd5\x38\x36\xc9\x1a\xf8\xbb\x7a\x45\x92\x96\x8e\xea\x79\x7f\xd3\x1b\x6d\x02\xa7\x5e\x94\x41\x3f\xca\x46\x5b\xd1\x21\x58\xf6\x83\x24\x72\x9b\xf4\xa4\xed\xfe\x45\xbc\x48\x22\xbc\x79\xad\xc2\xba\x11\x7d\x2e\xdd\xe5\x90\x2f\xc5\xdb\x90\xe0\xed\x27\xbd\xdb\x3a\x1b\x6a\x4b\xed\xee\x23\xb1\xdb\x7a\x21\xad\xc9\x44\x43\xf5\xee\xb0\xd6\x9e\xa3\x1d\x51\x46\xd4\x61\x1e\xbd\x67\xe1\x85\x65\x57\x5e\x70\xaf\x29\xd9\x9e\x92\x1e\x57\x4a\xe2\x32\x9a\xfa\xd5\xc6\x37\x17\x13\xce\xe3\x85\x4c\xec\x1a\x44\x78\x4f\x58\x3d\x08\xa2\xee\x42\x85\x37\x37\x28\xcd\xd0\x56\x47\x3f\xd3\x93\x0d\x32\xbc\xe2\xb1\x5d\x91\xe7\xe0\xcc\x40\xe7\xd5\x7b\x03\x88\x83\x8c\xab\xbc\x41\xc6\xe4\x26\xe7\xe5\x2a\x1b\x73\x61\xc9\xf4\x1f\xae\xb2\x14\x26\x31\x0a\x15\x24\x3e\xb1\xf8\x1a\xc8\x55\x9c\xa5\xe0\x8a\x33\x63\xc0\x60\x16\x00\xd5\x15\x84\xd0\xb6\x46\xe0\x09\xc7\xa9\x83\xd2\xf5\xd3\x0a\x65\x93\x27\x65\x2a\xa1\xa6\x79\x8d\xba\x34\xc9\xfb\x5d\x90\x24\x47\x9b\x3a\x93\x53\x8f\x59\x0e\xa9\x5a\x41\xca\xcf\x9d\x6c\x53\xc1\x3b\x26\xdf\x81\xac\x70\x21\x7f\x67\x0e\xbb\x65\x11\x2d\x31\x52\x5b\x6f\x35\xcb\x25\x89\x2a\xbb\x75\x0f\x5c\xda\xf2\x7e\x83\xeb\x5e\xf8\x12\xbf\x16\x63\xde\xd0\x45\xcb\x63\xbd\x09\x6d\xe3\x18\x82\xa6\x59\x9a\xe7\x10\x46\x4f\x25\xf4\x7e\xff\xf2\xbb\x77\x3f\xea\x93\x24\x0a\x45\xc7\x4a\xbd\x39\x9e\xe6\xd7\x4b\xa8\xd2\x37\x2d\xe4\xca\x5b\x14\x1e\x53\xb6\xa9\xbb\x90\x6e\x55\x88\xb1\x68\x64\x90\xbc\x79\x9b\x02\xc7\xc6\x39\xfa\x9b\xb5\xa6\xee\xa3\xd8\x00\x2c\xfa\x28\x37\x04\xcb\x36\x96\x8d\x8c\x3d\x16\x5b\x8e\x58\x45\x98\xb1\x2b\xe6\x54\xf4\x7e\x2b\x44\x38\xf1\x3b\x2f\x09\xcb\x75\x1a\xf3\x1d\x3e\x50\x3c\xdf\x44\xdc\xd7\xf5\xd1\x8e\x19\xcf\x3c\x63\x32\x1a\x39\xc6\x6c\xc9\x2a\xee\x66\x97\x50\x51\x57\x46\x30\xda\xd7\xc6\xe0\x69\x6b\xb0\x81\x9c\xf7\xb6\x35\x58\xdb\x7c\xf6\x54\x38\x9b\x2a\x8a\x5e\x9b\xe2\xad\xc9\x72\xcb\x30\x9d\x07\x69\xa4\xa0\xee\x03\x73\xed\x85\xc9\xa1\xca\x92\x6d\x8b\x92\x4d\x51\xcf\x21\x10\x73\xcd\xae\x0d\xa8\x96\xad\xa7\x9a\xac\x1b\x01\x35\xa8\x59\x53\x2d\x61\xea\xc9\xfd\xba\xac\xf3\x5e\x28\xdf\x13\xd9\x7b\xe7\x64\xaf\xbf\x4e\xea\x78\x74\xb5\x2f\x03\xeb\xc6\x3e\x07\xed\xda\x85\x70\x75\x98\xaa\xcc\x6d\xa5\x94\xca\xad\xf0\xf2\x9c\x56\xde\xa0\x70\xb3\xda\x61\xad\xd2\x66\xf1\x26\xc4\x24\x55\xa7\x13\x68\x71\xf7\x42\xed\x20\x71\x64\x13\xe4\x94\x4d\x6b\xa7\x74\x54\x65\x48\x05\x24\xc8\xe5\x52\x71\x02\x57\xb7\x60\xf9\xaa\x69\xe0\x9b\xb8\x5f\x73\x45\x7b\x22\x38\x3b\xc1\x88\x0f\xd9\xca\x13\x2a\x16\x7a\x6c\x86\xb5\x1e\x10\x74\x42\x9c\x13\xe2\x3c\x40\xc4\xa9\x57\xd2\x1d\x7d\xbb\xed\xe8\x7e\x38\xc7\x05\xf1\x9c\xdd\x37\xc9\x4b\x7d\x69\xd0\x78\xbf\xa6\xb4\x42\x53\x52\x4f\x66\xb1\xda\x42\x1b\x3f\x33\xd4\x7f\x16\xc6\x4c\xa4\x30\x68\xa4\x96\xb5\xb7\x3c\x8c\xa7\xed\xc3\xd7\xb2\x48\xc8\x7d\x4b\xa8\xf7\x40\xf2\x57\x42\x6c\x5b\x95\x7d\xfd\x65\x43\x3f\xb5\xdb\xf0\xcc\xd9\x87\x9d\xb7\x0e\xad\x24\xf3\xac\x38\xda\xac\x64\x78\xb6\x24\xea\x74\x59\x48\x16\xd8\xe0\x6a\xe1\xfd\x87\x12\xda\x57\xeb\xb3\x69\xc6\x42\xa0\x8c\xa6\x83\xa1\x32\x5a\xf9\xa8\x5c\xd4\xfb\x0f\x35\x8d\x4e\x90\xe3\x74\x8a\x93\xb7\x6a\x00\x29\xc6\x72\x66\x15\x5c\xfc\x21\x62\x16\xbc\x63\x0b\xc2\xc5\x9c\x44\x83\xf7\x1f\xae\x6e\x53\x1c\x7c\x5c\xad\xd4\x9d\x52\xba\x1f\x87\x17\xf0\x77\x8e\xce\xaa\x28\x21\x8c\x86\x03\xe4\x7c\x98\x7b\x8c\x5c\xd5\x7f\x2f\x60\x59\x1d\x85\x93\xb3\x5b\x15\xeb\x77\x2f\xf1\x19\x90\x24\x41\xa6\x0a\x79\x67\x8b\x0b\x58\xea\x01\xd6\x67\x5a\x02\x03\x17\x07\x51\xc1\x80\x85\xf1\xe6\x5b\x34\xb9\x2b\xbc\xbc\x49\x62\x9e\xe2\xc4\x77\x4e\xbf\xce\xa8\x19\x17\x35\x78\xc0\x66\x8e\x3d\x21\xe9\xfc\x02\xa2\x02\xfd\xb4\xb5\x5f\x54\x86\x57\x86\xcc\x32\x42\x36\x62\xa7\xe7\x74\x60\x6d\x39\x9b\x75\x3e\x04\x55\xa4\x2a\x25\x38\x62\x85\x9c\xec\x0b\x22\xd0\x9a\x70\x3e\xd3\x0b\xaf\xd6\x8c\x17\x96\x54\x17\x97\xb0\x5e\x4f\x49\x24\xb0\x12\x5d\xca\x33\xec\x07\xb8\x06\xb7\xb1\x6e\x39\x26\x5f\xf8\xbd\xcf\x71\xaa\x46\x75\xef\xd9\xc9\x7d\x8c\x5a\xaf\xbb\x0f\x99\xd3\x3d\xa8\x23\x55\x03\xb5\x7a\x53\xd9\xac\x9b\x4b\x3d\xad\xc8\x66\x9f\xc7\x3c\x71\xba\x4c\xfd\x72\x17\xa7\x29\x67\x76\x24\x9e\x53\xbe\x9d\xb3\x7f\xf7\x31\x94\x70\xe7\x3e\xb4\xf9\xdc\xb1\x15\xc2\xf3\x50\x65\x10\x19\x09\x8f\x13\xe1\xf5\xbd\xf2\xdc\xc6\x3e\x7d\xef\x18\x43\x57\xb5\xd0\x56\x8f\x2b\x9b\xf5\xf2\xb8\x43\x87\xa8\xea\x74\xcd\x71\x78\xdb\x61\x1c\xcd\x90\xfd\xe1\x1d\xad\x91\xbb\x17\x9f\x47\x23\x28\x98\x5f\xe3\x2d\x09\xc5\xf6\xad\x56\x30\xcf\x16\x84\x99\x93\x2e\x8d\xc3\x93\xe0\xec\x43\x1b\x52\x14\xdf\x53\x11\xca\x24\x89\xa9\xe9\xa8\xcb\x0d\x01\xd6\x4f\x87\xed\x6a\x91\x36\xcf\x2e\x8d\x6d\xba\x48\x83\x5f\x71\x46\x45\xca\x6f\x4d\x0b\xa8\xd0\x41\x5d\x3b\x3b\xf3\x72\xcd\xe6\x9e\x93\x8b\x04\xd6\x2f\x80\x17\xfb\xe4\x0a\xcb\xf4\x31\xbd\x30\x5e\x24\xb1\x50\xb2\xd2\xb0\x58\xab\x39\x37\x95\x7f\x5a\x0d\xd5\xc9\x03\xbb\xec\xac\xf6\xb0\x54\xd3\xea\xb8\x42\x9d\x17\xf0\x15\x8a\x4e\xf2\xa1\x3b\xb7\x5e\x16\xa9\x32\x40\x1b\x9a\x8e\xf9\x0f\xb2\x63\xad\x9d\xee\x53\x83\x9d\xde\xbe\xec\xb2\xd9\x2c\x75\x5d\xe2\x28\x47\x71\x01\x39\x34\x17\x7f\xdd\xb7\x7e\xeb\xac\xbd\xef\x55\x23\x63\x37\x64\xd8\xf1\x1d\x26\xca\x80\xb0\x9c\x2f\x83\xeb\x39\x0d\xe7\xea\x40\x75\x9c\xe6\xbb\x5f\xf9\xd9\x86\xda\xa9\xcf\x6e\x07\x28\x1d\x2b\xe8\x71\x1e\x6a\x87\xe3\x40\xfa\x9d\xe0\x0d\xfa\x69\xd5\x8d\x6f\x97\xa6\x62\x1e\xba\x1a\x59\xfb\x32\x6a\xd3\x1f\x4c\x78\x9c\xbc\x21\xe1\x27\x22\xbd\x40\xfb\xec\xb0\xcf\x56\x5e\x87\x25\xf9\x4e\x10\x74\x71\xd4\x76\x1f\xdd\xbf\x7f\x1e\xce\x37\x3b\x09\xca\x15\xf5\x8e\xc6\x0b\x7b\x51\x5d\x5d\x3d\xcf\x3b\x51\xdd\x40\xce\x11\x52\xf5\x70\x39\x8f\xc3\x7a\x69\x8b\x9e\xdc\x95\xb4\x5a\xa1\x4a\x5f\x07\x36\x65\x32\xb4\xd5\x72\x56\xc5\xd1\xea\x87\x54\x76\x3f\x86\x78\x7e\x7e\x01\xe7\x57\xf1\xe4\xf6\xfc\xc2\xd5\xc3\x8e\x0b\xd5\x69\x64\x84\x4c\xb6\x1a\xc2\xbf\xe0\xab\x46\x22\x17\x73\x11\xbc\xc8\xb3\x00\xac\x3c\xeb\xa5\xbc\x23\x9f\x0a\x82\x60\xe8\x4a\xf6\x3a\xf9\x77\x9b\xeb\xda\x40\x1f\xf8\x18\x8d\xb2\x8c\x96\x08\xe7\x94\xa4\x1c\xfe\x31\x97\x5b\x3d\x24\xe0\xac\xc3\xba\x3f\x6f\x16\x68\xf5\x54\xaa\x0b\x79\x0d\x6d\x04\x76\xbd\x89\x2c\xa0\x99\x1c\x5b\x36\x2a\xb2\xfe\x3a\xc7\x0d\xad\x3c\xb7\x9b\x7d\x31\xae\x96\x23\xec\xca\x84\xef\x36\x52\x77\xae\x1c\x1c\x7c\x39\x34\x38\x73\x39\x98\x09\x42\x1d\x88\xab\xb6\x2a\xa7\x41\x5d\x6d\x45\x75\xf5\x66\xba\x1e\x6d\xd9\xdd\xc7\xd5\xee\xa2\x1e\xb7\x93\xd2\x6e\x24\xb2\xdb\xd0\x37\x51\xcb\x8f\x8f\x59\xee\x2a\x87\x76\xd4\x6d\x7f\xb8\x27\x0b\x7d\x84\xce\xdc\x9f\xb6\xce\x7f\x62\xa7\xf0\xeb\xfc\xab\xed\xdd\xc5\x0f\xf7\x1c\x25\x91\xdd\x59\xbb\xf7\xea\xe5\xde\x7a\xd9\xd7\xe2\xc8\xb2\x30\xe7\xfc\xbb\x03\x84\x67\x71\x8f\x28\x49\x7b\x98\x88\xd1\x07\x2c\x6c\x1d\xfa\x2a\xd2\x26\x80\x34\x1b\xec\x01\x4a\x9a\x16\xf9\xa8\xb3\x07\x27\xb2\xd8\xdf\xbb\xfe\x90\x8f\xbd\xa9\x66\x6d\xa8\xe5\x8f\x18\xc9\x6d\xbf\xbc\xe4\xd1\x6f\xbb\x75\x5d\xfe\x16\xe9\xc8\x76\x5b\x74\x47\x09\x2e\x8f\x7b\x5f\xaf\xb3\x1a\xef\x1f\x1f\x1a\x3c\xfe\xee\x54\xaf\x77\x5f\xf0\x98\x0d\xb2\xcb\x5e\x9f\x29\xaa\xda\xcb\x52\x25\xfe\x6c\xff\xa3\x8d\xb5\xb7\xa5\xfc\x8a\xab\xb1\xd5\x4f\x4c\xaf\x50\xaf\xdf\x9e\x4e\xdc\xde\xe9\x0f\xba\x38\xdf\x09\xdd\xfc\x26\x4f\x97\xea\xc0\xbf\x59\xe1\xd9\x5c\xde\xf0\x7e\xd1\xde\x37\x5a\x4f\x84\xf0\x51\xd6\x1a\x39\xfb\x28\xcd\xee\xc4\x3d\x1e\x73\x6a\x70\xc4\xd5\xc3\x21\xf9\xc7\x13\x01\x79\x22\x20\x4f\x04\xe4\x3d\x11\x90\x2d\xae\xde\x42\x42\x9e\x68\xc8\xc7\x91\x1a\x3c\x4c\xdc\x38\xd1\x90\x0f\x27\x91\xf0\xe0\x4b\xf3\x4a\x37\x32\xb2\x7b\x91\xd1\x8b\x6a\x7c\x74\x05\xc6\x1d\x31\x8d\x5d\xc8\xe0\x87\x89\x31\x27\x36\xf2\x88\x60\xe2\xec\x44\x20\x1e\x98\x40\x3c\x24\x43\xe5\xf9\xdf\x19\xf6\x7f\x12\xeb\x93\x4e\x1e\xb4\xa4\x7c\x40\x59\x63\xc7\x8a\xf2\x54\x3b\xfe\xb9\x12\xc1\x7b\xaa\x26\x2b\x97\x6f\x85\xeb\xa6\x32\xbb\xe8\xba\x1b\x98\xfa\xf5\x5d\x31\xd8\xf6\x1d\xd7\xf9\xe6\xe2\xbf\xe6\x58\xff\x35\xac\xed\x5f\xe4\x04\xfe\xb9\x1b\xbf\xef\xd6\x0e\xb4\x4e\xe8\x69\x62\xab\xf7\x3d\xd9\xea\xd3\xff\x03\x00\x00\xff\xff\x9c\xc8\x2c\x0b\xd2\x7c\x00\x00") func templatesSchemavalidatorGotmplBytes() ([]byte, error) { return bindataRead( @@ -435,12 +442,172 @@ func templatesSchemavalidatorGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/schemavalidator.gotmpl", size: 31015, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc, 0xc4, 0xc9, 0x40, 0xf4, 0x19, 0xfb, 0x67, 0x5d, 0xc6, 0x7f, 0x84, 0x5d, 0x86, 0xd9, 0x0, 0xbd, 0x22, 0x4a, 0x2e, 0xf4, 0x7, 0x8, 0x50, 0xf1, 0xbc, 0x6, 0xb1, 0x8, 0x56, 0xac, 0x99}} + info := bindataFileInfo{name: "templates/schemavalidator.gotmpl", size: 31954, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf4, 0x45, 0xe4, 0x3d, 0x35, 0x81, 0x2f, 0xdb, 0x7b, 0xba, 0x7e, 0x80, 0x2d, 0x28, 0x7b, 0x73, 0x23, 0x69, 0x4e, 0xfc, 0x8d, 0xdc, 0xa2, 0x16, 0x87, 0x17, 0xff, 0xf7, 0xee, 0x89, 0x9, 0x71}} return a, nil } -var _templatesServerBuilderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5b\x5f\x6f\x23\x39\x72\x7f\x4e\x7f\x8a\x3a\x61\x2f\x51\x0f\xb4\xad\xc1\x3d\x05\x5e\x38\x80\xd7\xde\xcd\x39\xd9\xdb\x31\xc6\xbe\xe4\xc1\x30\x0e\x74\x77\x49\x62\xa6\x9b\xec\x25\xd9\x56\x7c\x82\xbe\x7b\xc0\x7f\x4d\xf6\x3f\x49\xd6\x78\xb3\x7b\xf3\x32\x92\x58\xac\x2a\xfe\xaa\x58\xac\x2a\xd2\xcb\x25\x5c\xf3\x02\x61\x8d\x0c\x05\x51\x58\xc0\xf3\x2b\xac\xf9\xb7\x72\x4b\xd6\x6b\x14\xdf\xc1\xcd\x27\xf8\xf9\xd3\x03\xfc\x70\x73\xfb\x90\x25\x49\xb2\xdb\x01\x5d\x41\x76\xcd\xeb\x57\x41\xd7\x1b\x05\xdf\xee\xf7\xcb\x25\xec\x76\x90\xf3\xaa\x42\xa6\x7a\x63\xbb\x1d\x20\x2b\x60\xbf\x4f\x92\xa4\x26\xf9\x17\xb2\x46\xd8\xed\xb2\x3b\xfb\x71\xbf\xd7\x0c\xbf\xf1\x03\x17\x97\xe0\x47\xcc\x8c\xe5\x12\x1e\x36\x54\xc2\x8a\x96\x08\x5b\x22\xbb\x5a\xaa\x0d\x82\x53\x13\x14\xe7\x65\xa6\xe9\x7f\x28\xa8\xa2\x6c\x0d\xaa\x9d\x57\x19\x55\x6a\xc1\x5f\x10\x56\x8d\x32\xac\x36\xc8\xe0\x95\x37\x20\xf0\x5b\xd1\xb0\x0e\x27\x2f\xc2\xac\x87\xb0\x22\x49\x68\x55\x73\xa1\x60\x9e\x00\xcc\x72\xce\x14\xfe\xaf\x9a\xe9\xcf\x52\x09\xca\xd6\xd2\x7c\x66\xa8\x96\x1b\xa5\xea\x59\xa2\xbf\xad\xa9\xda\x34\xcf\x59\xce\xab\xe5\x9a\x7f\xcb\x6b\x64\xa4\xa6\x4b\x2d\x41\x13\xcb\x1a\xf3\x49\x9a\x1a\x73\x4d\x53\x72\x52\xc8\x29\x22\x33\xa8\xa9\x50\x08\x2e\x26\xc9\xec\xa8\x91\xa8\xc4\xaa\x52\x93\x32\xcd\xa8\xa6\x13\x0d\x53\xb4\xc2\x29\x42\x37\xac\x29\x2b\x5a\x14\x25\x6e\x89\x38\x46\xbc\x0c\x94\x46\x13\xcc\x1b\x41\xd5\xeb\xb1\x59\x9e\xce\xe0\xb9\xdb\x81\x20\x6c\x8d\x90\xdd\xe0\x8a\x34\xa5\xba\x35\x16\x91\x60\xdc\xab\x16\x94\xa9\x15\xcc\xfe\xf8\xcb\x0c\x32\xed\x36\x66\x82\x73\xba\x68\xf2\x37\x5f\xf0\x75\x01\xdf\xbc\x90\xb2\xb1\x9e\xd6\xe1\xa2\x47\x61\xbf\x87\x1e\x43\x47\xde\xe3\x9a\x1a\xd7\xfc\x19\xb7\x9a\x9a\xc8\x9c\x94\xf4\xef\x08\xd9\xcf\xa4\xd2\xa4\x57\x77\xb7\x90\x0b\x24\x0a\x25\x10\x60\xb8\x85\x51\x32\xa0\x4c\x2a\xc2\x72\x4c\x56\x0d\xcb\x0f\x71\x9b\x1b\x8f\xf9\x60\xcc\x9e\xdd\xf0\xbc\xd1\xfb\x2c\x85\x0f\x93\xd2\x77\xda\x96\xa8\x1a\xc1\xe0\x9f\xa7\x88\x34\x0d\xc0\x86\xb0\xa2\x44\x21\x2f\xa0\xfb\xaf\x22\x5f\x70\x5e\x91\xfa\xd1\x3a\xf9\x53\xf4\x51\xbb\x79\xf6\x67\x3b\x2f\x5d\x18\x2e\x2b\x2e\x2a\xa2\x06\x4c\x9c\xdf\x79\xab\x59\xda\xc2\x7e\xb9\xe6\x4c\x36\x15\x86\x39\xb3\xdd\xae\xb5\xaf\x1f\x84\xfd\x7e\xd6\x99\x75\x27\x78\xd1\xe4\x13\xb3\xfc\x60\x98\x95\x37\x52\xf1\xca\x71\x8b\x16\xd9\x5f\x9d\xf3\xba\xcc\x53\xa6\xf1\x74\xc7\xf6\x84\xe9\x9e\xd2\x4d\xbf\x47\xf1\x82\xe2\x7e\xd3\xa8\x82\x6f\x59\x00\x47\x9b\x7b\x9e\xc2\x0e\x60\x6f\x09\xb5\x79\x07\xd8\xb9\xdf\x23\x56\x3f\xe8\xfd\xdc\xa5\xb3\x5b\x3c\x0b\xc3\x96\xfc\x7b\x22\x69\x7e\xd5\xa8\x0d\x32\x45\x73\xa2\xfc\x34\xbf\xab\xb2\x96\xc0\xd2\x5f\xdd\xdd\xfe\x27\xbe\x0e\x27\xb4\xf4\x81\xc0\x09\x40\x22\x50\x1c\x98\x10\x08\xec\x84\xb0\x85\x23\xdb\xba\xb3\xe4\xb6\xaa\x4b\xd4\x2e\x4d\x14\xe5\xcc\x6d\xea\x81\xcb\x7a\xdb\x5c\x68\x5e\xc3\x39\x8b\xdd\x0e\x4b\x89\x47\x27\xf7\x4d\xfd\xa3\x36\x86\xb1\x88\x00\xca\xb3\xcf\x48\x0a\x14\x0b\x50\x44\xac\x51\x01\x65\x0a\xc5\x8a\xe4\xb8\xdb\xa7\x16\x6c\xb0\xfb\xa6\xdd\x5f\xce\x02\x3f\x73\xd5\xaa\x84\xc5\x7c\xb6\xdb\x19\xd1\xfb\x3d\xe4\x4e\x10\x6c\x88\x04\xc6\x15\xbc\xa2\x82\x67\x44\x06\x34\x4c\x98\xa5\x86\xeb\x3e\xd5\xcb\x60\x85\x09\x37\x1a\x34\xf3\x39\x60\x17\x79\xf8\x9b\xb0\xf3\x8e\x79\x16\x76\x61\x72\xdf\xcf\x03\x76\x5b\x8d\xdd\x7f\x0b\xaa\x34\x76\x05\x51\xe4\x3d\x90\xab\x9d\x98\xaf\x41\xce\x01\xf7\xa9\xd6\x67\x3a\xe5\x4c\xea\x1f\xe9\x0a\x18\x86\x4c\xc3\xa7\x1f\xfd\xf5\x87\x4c\x24\x18\x62\x08\x8f\x8b\x84\x1a\xda\x43\x7c\x23\x6e\xd9\x09\xec\x02\xb4\x35\x11\xa4\x92\xef\xc4\xfd\xce\x30\x33\xbc\x32\xbd\x39\xb9\xa0\x7f\xc7\x62\xbf\x5f\x98\x43\x2f\xa7\x35\x29\x9d\x24\xae\x60\x0e\xf8\x8b\xf6\x39\x3f\x30\x8b\x6c\x3a\x83\x74\xbf\xff\xd0\x9e\x88\x3a\xa3\xf3\x74\x2d\x5c\x69\x94\x25\x64\x9f\x51\xd6\x9c\x15\x38\x70\x83\x88\xa6\xef\x0a\xdc\x5b\xed\xc8\xea\x0f\xdb\xac\x87\xc2\x7e\x7f\xa2\x3f\xc5\x8e\xe4\x3e\x3b\x6f\xba\x77\x51\xee\x06\x57\x94\xd1\xd8\xad\xb2\x5b\xd9\x86\x56\x93\x17\x5f\xd5\x75\x49\x51\xda\x8c\x53\xa7\x99\x1e\x75\xbb\xae\x8d\x09\x37\x40\x25\x48\x54\xb0\xa5\x6a\x63\x88\x0c\x0f\x90\xf9\x06\x2b\xf4\xe1\x33\x5a\xc6\xed\x8d\x3e\xc2\x1b\xb5\xb9\xb0\x67\x49\x23\x51\x80\x3d\x8b\x16\x9a\x4e\xba\x2f\x29\xcc\xbf\xde\x98\x0b\xbb\x51\xd3\xbe\xdd\x18\x2d\x17\x53\x7b\xf8\xd9\xe8\x4f\x1a\xb5\x01\xad\x82\xd3\x38\x3d\x09\xf8\x45\x77\x03\x5b\x50\xc3\xf9\x33\x8e\xaa\x49\x03\x9c\x8f\xcf\x4c\x90\xbb\xe7\x8d\xc8\x6d\x9a\x65\xc0\x3d\x01\x46\xc5\xbf\x20\xfb\xad\xa1\x23\x35\x05\x9d\x8a\x1a\xf0\x62\xec\x42\x5c\x5c\x09\x5e\xe9\xaf\x76\x89\x3a\x50\xea\x5d\x0d\x8f\x11\x06\x4f\xa7\x41\xdd\x43\xf9\x93\x06\xe3\x4f\xfd\x2d\x75\x08\xa6\x05\xc8\x9c\xd7\x28\xe1\xf1\xe9\x37\xc6\x8d\x6b\xc0\xfe\x04\xcf\x26\xef\x18\xa2\xf7\x66\xcf\x1b\xf9\xac\x41\x1a\xdd\xfa\x66\x7c\xb9\xf4\x49\xaa\x91\x6e\x22\xab\xd9\xd9\xed\xb7\x02\x2a\x24\x4c\x17\xa7\x8c\x83\xc0\x5f\x1a\x94\x4a\x82\x2e\xa1\x9e\x4b\x9e\x7f\xc1\xc2\xe7\x62\x6d\x64\xee\x67\x61\x2d\xa7\xf9\x20\x3c\xed\x13\x5d\x2f\x1f\x28\x09\x5c\xbe\xc0\x56\x3c\xca\x1e\xd8\x8a\x67\x37\x28\x73\x41\xeb\x36\x7f\x18\xfc\x6a\x8b\xf8\x52\x6a\x56\x7a\xb3\xed\x76\xb0\x69\x2a\xc2\x3a\xc5\x8c\xae\x28\x82\x35\xdd\x07\xf8\xb0\x4c\xd4\x6b\x8d\xe3\x05\x90\x56\x4b\x2a\xd1\xe4\xca\x18\xda\x14\x39\xd1\xbf\x5e\xbd\x93\x00\xb8\xe2\x3b\x50\x44\x67\xc7\xb5\x1d\x4b\x42\x49\x13\xb2\xf5\x63\x55\x4c\xd2\x56\x30\x21\xf5\xb6\x95\xcb\x67\x5c\x53\xa9\xc4\x6b\x32\xa8\x25\xe0\x40\xf9\x90\x0c\x4a\x87\x31\x6a\x3f\x98\x0c\x6a\x22\xb7\xb9\x92\x41\xd9\x13\x06\xfe\x12\xea\xef\x50\x53\x44\x70\x7c\xdf\xd0\xb2\x40\x91\x42\x67\x9d\x89\x71\xd3\x61\x75\xd0\x36\x3d\x74\xc1\xea\xf5\xeb\x52\x98\xa0\x63\xfa\x24\x8d\x09\xbe\x05\x44\x41\x5e\x4b\xd7\x9e\x92\x59\x01\xb7\xca\xec\x37\xd2\x6e\x08\xda\xcd\x38\xa9\xeb\xb8\xf8\x5e\x80\x3b\xcb\x17\xb0\xe1\x5b\x7c\x41\x61\x5a\x33\x39\x61\x20\xb0\x2e\x49\x8e\x40\x95\x36\x90\xfe\x59\xe8\x60\xa7\x68\xde\x94\x44\x40\x23\xc9\x1a\xb5\xcc\x91\x15\x19\x40\xda\x9d\xf3\x57\x89\xe2\x8e\x48\x19\xd1\x50\xce\xd2\xf1\xb5\xda\x45\x8c\xd4\x44\x67\xc1\x64\xc3\xe5\xef\x02\xa6\xb1\x25\x59\x9c\x7c\x30\xf7\xff\x7b\xdc\x1e\xb4\xf2\x6f\x00\x6d\xa4\x2e\x3c\xcf\xb7\x6c\x18\xff\x1d\x61\x37\xb6\xb2\x2e\x76\x1e\xb3\x7b\x7d\x22\x16\x6f\x40\x2e\x89\x52\x4b\x1f\x02\x7c\x53\x75\xba\x94\x05\x61\x62\x93\x0e\x2e\x24\x14\x99\x7a\x0d\xc4\xa6\x43\x7f\xc1\x82\x92\x07\x1d\x7d\x75\x4e\x54\xd1\x0a\x41\xc7\xe2\xa4\x9f\x06\x0d\xf8\x0e\xa3\x59\x38\x66\x5a\x45\x7d\x48\x9a\x56\xd4\xc7\xb7\x8e\xa2\x6d\x4d\x77\xbe\xa2\x81\xef\x30\x90\x8e\x28\x3a\x75\x62\x8f\xe7\xeb\x13\xa9\x4f\x67\x0d\xde\x15\x41\x6d\x88\x02\x45\xbe\xa0\x04\x9d\x82\x33\xad\x1f\x61\x85\x49\xc1\xb7\x5c\x14\xe6\x8b\xcd\x5d\xec\xda\x5d\x86\x63\x5d\x98\x2a\xa8\x51\xe8\x83\xc7\xe6\x08\xc1\x51\x6c\x21\x10\xe2\xeb\x00\x89\xa0\xd7\xc8\xf6\x35\x29\x18\x9c\x96\x83\x41\x37\x09\x8b\x29\x43\x1a\x96\x1c\x4b\xc7\xcf\x05\x8d\xf8\x0d\x7e\x26\x4c\xcf\x44\x62\x01\x5c\x33\x00\x9f\x37\x47\x49\xb0\xe9\xf9\xd3\x02\x0b\x1f\x0d\xa2\x9c\xf9\x34\x48\x7f\x55\x28\x21\x4e\xba\xe1\xeb\x80\x64\x40\xf2\x1c\xa5\x8c\x00\xd5\x41\xa1\x2c\xd1\xd2\xf2\x95\x49\x38\xa9\xc0\xc2\x67\xec\xef\x01\x7a\x37\xe9\xb6\xb2\xfb\xa0\xbb\x44\xf7\x54\x1f\xee\x14\x12\xef\x0e\x7d\x7c\x2d\x10\x22\xc5\xa1\xc4\xde\x66\x02\x21\x23\xf7\xeb\x93\x1e\x71\x9d\x94\x0a\x5e\xc2\xfc\xea\xfa\xa7\xe5\xe7\xef\xaf\xae\x97\x57\xdf\x5f\x5d\xa7\xf0\xfc\xea\x48\x75\xc2\xdf\x5a\x27\x86\xc4\x9a\x29\xa0\x8b\x45\xc7\x0c\x5d\xb1\xf1\xd1\x61\x7f\x1a\x0f\x77\x71\xa7\xcb\x78\xd4\xaf\xd1\xec\xd2\x05\xb5\x34\x4b\x09\x2d\x1a\x97\x76\x9b\xc0\x3e\x59\x25\xb4\xe4\x1e\xf7\xf7\x57\xed\x20\xdb\x70\xef\x78\x4a\x13\xae\x83\xf0\x72\x19\x75\xe1\x75\x5d\x97\x93\xb2\xc4\xc2\xf6\x20\x88\x6b\x67\xea\xdf\x05\xe6\x48\x5f\xb0\x58\x68\x18\x04\x9a\x12\xb0\x4d\x53\x36\x2d\xe7\xe5\x12\x9e\x1b\xd5\xe6\x21\x12\x95\x4d\x3e\xf8\x96\xf9\x46\x10\x95\x49\xdc\xfa\x0f\x89\xbe\x49\xea\x6d\x47\x4d\xa2\x6f\xbb\x7e\x70\xbf\x1a\xdf\x6a\xbd\x3e\xd2\xbc\xbd\x8a\xe8\x6b\xaf\xcd\xf5\xe7\x87\x87\xbb\xf9\x7d\x0a\xd2\x50\x9a\xa6\xc9\xa6\x51\x60\xc8\xb5\x9f\x16\x9c\xa1\xe5\x65\x96\x60\x9c\xba\x2c\x81\xe4\x8a\xbe\xa0\xde\x04\xcc\x86\x1a\xe9\xa8\xd1\xd6\xdb\xda\xf1\x6b\xd5\x1b\x7f\x85\x8a\x0b\x4c\xfa\x37\x24\xee\x62\xc4\xa9\x7c\x6d\x2a\x28\x7f\x0b\x0b\x25\x65\x08\x44\xac\x4d\x2d\x08\x6b\xc1\x9b\x5a\xb6\x0d\x33\x2a\xa0\x08\xf5\xaa\x46\xed\xda\x4e\xfb\x89\x32\xfc\x64\x7f\xfc\x77\x3b\xe5\xf1\x49\x6e\xc9\x3a\x9b\x18\x77\xb2\x75\xb9\xa0\x4d\x46\x19\x16\x50\x72\x73\x2f\x1c\x27\xa0\x3f\xd9\x9f\xba\x37\x3a\x3e\x82\x65\x59\x16\x37\xbf\x13\x7b\x8f\x7d\x8f\xaa\x7f\x4d\xd5\x6e\x22\xef\x1c\xb5\x1f\xa9\x74\x46\x64\x93\x20\x73\x37\x38\xdf\xed\xb2\xcf\xd6\xad\x84\x6b\x02\x4d\x56\xfa\xe9\x88\xa8\x79\xd5\xa6\x58\x3e\xba\xee\x92\x7f\x1a\x30\xcd\xfa\xe5\xe6\x25\xb4\x13\x07\xcb\x68\x8b\x55\x7f\x88\xc4\x2b\xc9\xfd\xe0\x7b\xad\xc4\x4b\x7b\xe3\x4a\x5a\x25\x47\x57\x72\x5f\x63\x6e\xad\x40\x6c\xf7\xc1\x1c\xa9\x5b\x5a\x96\xf0\x8c\x76\x27\x14\x6d\x3c\xcb\x4b\x8a\x4c\xc9\xec\xcc\x75\x68\x59\x13\xf7\xb8\xa3\x0b\x30\xa4\x97\x46\x2d\xa7\x70\xdf\x7d\xc6\x70\x7f\x27\x0f\xea\xbb\x4f\xea\xc0\xd6\xaa\xba\x5e\xdc\x51\xe7\xe9\x6a\xfd\xff\xe1\x2d\x7d\x57\x79\x8b\xd6\x7e\x92\xd3\xfa\x47\xd7\x0e\x8a\xb5\xf5\x49\x98\x4e\xa1\x2c\x5f\xd7\x34\x3a\x47\x57\x27\xc0\xea\x18\x77\x9a\x0e\x2a\xeb\x05\x5a\x25\x3f\x3b\x85\x2c\xaf\x6e\x3d\x68\x83\xa7\xa5\x87\x17\x52\xd2\xc2\x94\x9a\x67\x68\xda\x95\x32\x37\x45\x8e\x0f\x75\x8e\xbf\x5b\x82\xa5\x58\x04\x71\x7e\xe0\xbf\xfc\x0f\xb6\xa3\x3b\xb9\xae\xec\xaa\x28\x8c\x00\xcf\x39\xe2\xe5\xe3\xa8\xe3\x85\x7e\x04\x63\xe3\xb8\xcc\x27\xe4\xfb\xe3\x8b\x3a\x07\x06\x2f\x77\x1e\xdf\x66\xbe\x10\x01\x0d\x8b\x1c\xc3\x67\xaf\xe3\x25\x7d\x02\x3a\xa1\x1d\x2e\xff\x70\x3d\x7e\x79\x09\x8c\x96\xae\x17\xde\x91\x76\x09\xa4\xae\x91\x15\xf3\xf8\xd7\x85\x29\xaa\xa7\xf9\x99\x6e\x77\x3f\x03\x1e\x14\xf5\x6f\x52\xb5\xad\xc8\xdf\x49\x55\xcf\xef\x90\xaa\x53\xf9\xfa\x09\x5a\x87\xca\xe3\x1c\x7d\xfb\x15\xf0\xd4\x9d\x7b\xe8\x99\x8f\x48\x6f\x2b\x11\xcd\xe1\xd0\x32\xe3\x74\x7e\x7a\x75\xbf\x4a\x22\x7d\x26\x38\xef\x93\x7a\x0f\x30\xb1\x8b\x2f\x91\x75\x84\xa6\xf0\x6f\xf0\xd1\xa9\xe8\xa2\xa6\x0e\x38\x26\x5d\x5e\xcd\x67\x15\x95\x52\x07\xea\x38\x3a\x5c\xc0\x1f\xe5\xcc\xf7\x4a\x64\xf6\x1f\x9c\xb2\xfe\x3a\x16\x30\x4b\xad\xfc\x24\xbe\x7b\x4a\xf6\x49\xa7\x08\xf8\xd1\x34\x37\x4d\xf6\x60\x43\x42\x5c\x02\x11\x58\xd3\x17\x64\x51\x81\x44\x8b\xf3\x52\x87\x48\xdc\xbc\xe5\x76\x7b\xd3\xe6\x3f\x6f\xac\x08\xe2\xc7\x61\x43\x5f\x0a\xe2\xec\x6a\x3b\x9d\x4a\xd9\xae\x58\x47\x57\xd2\x19\x6a\xf3\x24\x9d\xb1\xd0\x15\xd5\xa7\xa4\x6f\xbe\xda\x8b\xec\xb3\xce\xc9\x81\xfc\xb9\x63\x16\xdf\xa8\x68\x91\x6d\x40\xb8\x37\xe3\xe9\xd8\x8d\x4b\xb7\x7b\xbb\x3b\x5a\xfb\x0b\x94\x3a\x3d\xb9\xb8\x9c\x7c\xf1\xd5\xe1\x98\xda\x7b\x24\x30\x47\xe4\xc5\xa5\x7b\xb4\xe3\xf5\xb5\x4e\x2a\xb7\x54\xe5\x1b\x4b\xe2\x6f\x37\x8f\xc6\x34\xfd\x2f\x27\xd2\x5c\x73\x67\xb7\x37\xfb\xfd\xec\x22\xf1\xa5\xc7\x48\x1b\xd3\xaa\xfd\xa8\x65\x3c\xc1\xe5\x88\x91\x87\xd7\x25\x6f\xea\xb5\xb4\x6f\x0e\xec\x51\xdd\x76\x3b\xdb\xc6\x4d\x34\x63\x70\x95\x1b\xed\xd4\xf8\xf6\xf7\xb4\x80\xfd\x16\x2d\x47\x34\x4c\x5b\x1d\x42\x00\x4e\xe3\x3b\xde\x18\xd0\xb8\xc7\x69\x6d\xa8\x6d\xea\xac\x69\xc1\xed\x2c\xe9\x08\xe6\x23\x77\x2f\xce\x95\x8d\xbf\x2f\x1c\xe7\xec\x96\x2d\xe0\xcd\xc6\xe8\xbd\x5c\xf8\x7d\xe0\x6f\x94\x7a\x13\xe4\xfe\xfd\xc1\x71\x07\x1e\x5e\xc6\xb8\xbc\xf1\xab\xa0\x1b\x7b\xcd\xf0\x3b\xc2\xd2\xab\x77\x02\xa6\xf1\xb7\xbd\x3b\x49\x9d\xa6\x16\x5c\x7b\xb2\x9a\x47\x7f\xdd\x33\x2e\xcc\xb5\xf9\x76\xdc\x82\x1c\x2f\x86\xc2\x6b\x87\x73\x03\xbc\x9d\x3d\x4f\x47\x9a\x9c\x27\x45\xe9\x89\xb3\xac\xd3\x40\x3d\x79\xc1\xed\x0d\x7f\xe7\xb0\xcb\xdb\x7b\xff\xe1\x39\x17\xaa\xd6\xb3\x8e\xb8\x58\x60\x68\x6f\xc4\x4e\x78\xe0\xa9\x41\x84\x4f\xa7\xce\x38\x7e\x74\xb5\x6f\x9d\xdd\xa9\xf5\xb7\x05\x54\x2a\x1c\x5b\x91\x22\x9d\x93\xab\x52\xc3\x73\xab\x23\xb9\x33\x72\x55\x96\xf7\x28\xa8\x59\xb5\x18\x1e\x66\x41\x8a\x01\xa4\x7b\x13\x18\xce\x38\x17\x0f\x8e\x4d\x18\x8f\x15\x07\x8b\xa1\x91\xed\xd2\xdf\x3c\xe6\x3f\xba\x82\x7c\x01\xfc\x8b\xc6\x67\x28\xa2\xf7\x34\xe4\xb1\x52\x4f\xdf\x69\xe2\xf0\x7c\xc9\xe8\x5f\x29\xad\x61\xfe\x0e\x9b\xb2\x7d\x57\xd2\xf1\xd1\xba\x7d\x6d\xf2\xee\x3e\x1a\x0b\x3c\xd9\x47\xdb\xb2\x30\xf8\x68\xa7\xc0\x3c\xee\xa3\xed\x83\xfa\xaf\xf7\xd1\x8e\xe4\x7f\x08\x1f\x8d\xae\xb5\x4f\xf5\xd1\xfa\x98\x8f\xb6\x76\x3c\xec\xa3\xf5\x3b\xf8\xa8\x7f\xc8\x1c\x8a\xa4\xf8\x29\x52\xeb\xa2\xed\x75\x61\x28\x94\x2a\x54\x1b\x5e\xb8\x9b\x74\xb5\x39\xc7\x5f\x83\xf0\xb9\xe5\xb6\x30\xac\x42\x8a\x14\xeb\xb2\x80\x67\xce\x4b\x7b\xac\x8f\x16\xd8\xed\x8b\xb2\x4e\x49\x1c\x3f\x4a\x5c\x91\x52\xa2\x83\xab\xa9\x4c\xa2\xe8\xea\xcb\x07\xfe\xd7\xba\x46\xaf\x46\x6a\x45\xfc\x6d\xda\x4e\x5e\xd6\x63\x53\x3d\x7d\x07\x7f\x68\x2d\x34\x25\x4d\x5b\x9d\xd8\x56\xc6\x6c\x39\x73\xc4\xf6\x17\x98\xcd\x1c\xd1\xe6\x34\x79\x8f\x7a\xde\x53\x30\xab\x99\x16\x8e\x45\xf3\xf6\x2e\x4e\x02\xa2\x3f\x02\xf3\x4f\xf3\x0e\xde\xfe\x9d\xd9\x7a\x73\xa2\xe7\xe9\xd8\x83\xbf\x69\xab\x79\x95\x3a\x46\x3b\x40\xd6\x79\x89\x8e\xdb\xcf\xbc\x51\xe4\xb9\x44\x2f\x7d\xbc\x45\xbf\x18\x72\x5c\x68\x71\xfd\xf6\xc1\x6e\x07\x1d\x32\x08\x92\x35\xc0\x67\xa0\xa2\x73\x20\xe7\xc0\xd7\x24\xdf\xe0\x7c\xaa\xb9\x1a\xe0\x5b\x2e\xa1\xe0\xec\x5f\x14\xe4\xda\x64\xe4\x99\x37\xca\x25\x73\x7a\x67\x2f\xe0\x7f\x1a\xa9\xdc\xb3\x82\x0d\x1a\x01\x26\x2a\xfa\xfb\xdd\xba\x46\x66\x1e\xa9\xda\x58\x3e\xd6\x9a\x1a\x2e\x72\x7c\xef\x1c\xda\x63\x27\xff\xed\x59\xdb\x21\x3a\xd0\x2b\x9b\x56\xe8\xb1\xf7\x97\x7e\xf3\x46\xef\x53\x1d\xae\xcd\x46\x35\x8f\xa8\x7b\x3a\x7f\x25\xb3\xc1\xc2\xc6\x57\x33\xb9\x43\x8f\xcb\x78\xb4\x45\x85\x29\x27\x74\x08\xd0\x11\x61\xbf\x9f\xcd\xba\xbd\xc8\x98\x47\x5e\x22\x61\x86\xd6\xcc\x48\xe3\xde\xa4\x3d\xab\xde\xd4\xd2\x9b\xfa\x23\xc6\x91\xdd\xe3\xbc\x7f\x64\x03\xfd\x4a\x0d\xcd\xb4\xd7\x61\x8d\x0f\x2b\xd3\xf6\x8a\xfe\x68\x53\x5b\xa6\x6d\xe7\x29\x6e\xef\x02\xed\xdf\x6f\xdc\xdd\x02\x7f\x41\x61\x2e\xcc\xf5\xd4\x9c\x30\x78\x46\x68\x24\x16\x50\x50\x81\xb9\x2a\x5f\x81\x32\x7b\xda\xfd\xa4\x8b\x24\x76\xc5\x0a\x23\x60\x3e\xbb\xf8\xd7\x8f\x1f\x3f\xce\x16\x40\x6a\x6a\x5b\x6d\x73\x1d\x2b\xd2\xb3\x1b\x83\xf3\x67\xfb\xce\x17\x8e\x3d\xfd\x75\xb1\x61\xe8\xc1\xb7\x8c\x2a\x7b\xe7\x3e\xb2\x5f\xf6\xfb\x2c\x7a\x68\xfc\x87\x91\xd3\x6f\x8c\x65\x98\xe2\xd5\x4b\xbb\x99\xc4\xa4\x33\xe8\x92\xcd\x29\x1c\xa6\x5a\x0b\x69\x3d\x81\x94\x25\xdf\x4a\xf3\x66\x42\x71\x1b\xae\xda\x28\x65\xcd\xe3\x6d\x96\xeb\x90\xb8\x68\x5f\x57\xa8\x0d\xea\x04\x26\xe7\x55\xcd\x25\xf6\x0f\x2f\x62\x59\x4a\x44\x58\x51\x75\x8e\x31\x2c\x8a\xfe\x2c\x2a\x91\x8d\x38\xbc\xdf\xc7\xa9\x0e\x2b\x1f\x27\x03\xe1\x30\xae\xb7\xaf\xfb\xc3\x95\x5f\x5b\xfe\x75\x11\x21\x45\x01\x73\x2e\x8c\x83\x0a\x5a\x60\x3a\x7c\x1a\x1a\x0a\x81\xb3\x6e\xb2\xfb\x0a\x0c\xee\xe3\x17\x41\xe0\xa0\xd2\x9c\x38\xa0\x06\xe5\x93\x67\x69\xca\x25\x5f\xa9\x75\x01\x68\x6b\x8b\xe3\x00\xf4\x9e\x9c\xbe\x13\x00\x5e\x81\x11\x00\xea\xa9\x07\xaa\x87\x01\x88\x72\xf3\x18\x00\xcf\x2d\xd9\x27\xff\x17\x00\x00\xff\xff\x9b\x80\xf1\x22\xac\x41\x00\x00") +var _templatesSerializersAdditionalpropertiesserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x56\x4d\x6f\xe3\x36\x10\xbd\xeb\x57\xbc\x1a\x6d\x56\x2a\x14\xb9\xc9\xde\xd2\xba\xc0\x16\xdb\x02\x2d\xb0\x69\x91\xed\xf6\x62\xe4\xc0\x48\x63\x9b\x1b\x9a\x54\x49\xda\x6e\x2a\xe8\xbf\x17\xfc\x58\x4b\x6a\x24\xc3\x9b\xcb\xea\x46\x6a\x38\xf3\xe6\xcd\xcc\x23\x9b\x06\x15\xad\xb8\x24\xcc\x58\x55\x71\xcb\x95\x64\xe2\x0f\xad\x6a\xd2\x96\x93\x79\x4f\x9a\x33\xc1\xff\x25\x3d\x43\xdb\x26\xf3\x39\x3e\xc8\x2d\xd3\x66\xc3\xc4\x6f\xef\x7f\xbf\xc5\xee\xd3\xca\xc0\x6e\xb8\x81\x7a\xf8\x48\xa5\xc5\x81\xdb\x0d\x3a\x7f\xa8\x8f\x0e\xb1\xd2\x6a\x0b\x77\x36\x59\xed\x64\x89\xb4\x69\x8a\x3b\x2a\x89\xef\x49\xdf\xb2\x2d\xb5\x2d\xbe\x6d\x1a\xd4\xcc\x94\x3e\x2e\x0a\xb7\x8b\xb6\xcd\x86\x91\xd3\x8a\x59\x86\xe5\xfd\xc3\x93\xa5\x0c\xa4\xb5\xd2\x68\x12\x60\x3e\x87\xb1\x6c\x4d\xb8\xca\xf1\xc0\x65\x05\xbb\xa1\x5e\xf8\x04\xd8\x33\x1d\x4c\xae\xd0\x34\xb0\xb4\xad\x05\xb3\x84\x99\xc3\xac\x76\xf6\xcd\x11\xf5\x4f\xaa\x7a\x9a\xa1\x70\x79\x03\x7c\xe5\x82\xe0\x66\x81\x8f\x46\xc9\xe2\x88\xc5\xe3\xc8\x71\x11\x3c\x66\xdf\x7b\xab\xaf\x16\x90\x5c\x78\x3c\x80\x26\xbb\xd3\xd2\xed\x27\x40\x1b\x01\xe8\x72\x8f\xd1\x34\x13\xb8\x7d\xcd\xe4\x9a\x50\x74\x75\x08\x7f\x74\xb9\x2f\x46\x4f\x61\x11\x53\x1a\xff\xed\x9d\x5e\x82\x64\x15\x16\x8e\xe1\x01\xeb\xc1\x85\x2e\xf7\x49\x9f\xc2\xeb\x1c\x9a\xb6\x6a\xdf\x27\x10\x4c\x56\xae\xb2\xb0\x0a\x5b\x56\x27\x08\xb6\xd7\x8e\x99\x2d\x7b\xa4\x74\xcb\xea\xa5\xb1\x9a\xcb\xf5\x7d\xd3\x38\xda\x8a\x37\x23\x7d\x85\xb6\xf5\x3c\xde\xb1\xc3\x3b\x32\x86\xad\xa9\x69\x40\xc2\x38\x24\x5c\x5a\xd2\x2b\x56\x52\xd3\xba\x4d\x0f\x3a\x3b\xb7\x04\xd7\x67\x94\xe0\x24\xc7\x15\x09\xb2\x94\x06\x67\xb9\x2f\x92\xe6\xd2\xae\x30\xfb\xe6\xef\x59\xd7\x8d\x43\x4a\xe3\xea\x44\xb6\x7d\x5e\x5f\xe7\x9e\xc1\xf1\xf9\xd8\x33\xb1\xf3\x7d\xca\x57\x10\x24\x23\x90\x0c\x3f\xe2\xbb\x63\x36\x66\x27\xec\x04\xe1\x5d\x3f\x9b\x72\x43\x5b\xf6\xe7\x53\x4d\xb3\x49\x54\x99\x77\xb8\x52\x1a\x8f\x39\xf6\xce\x65\x60\x25\xd6\x34\xc4\x0b\x1d\x6b\x95\xc3\xfc\xd9\x11\xa2\x87\xc9\xda\xed\x1d\xc5\x7c\x05\xa9\xec\xb8\x8f\xe2\x57\x73\xbb\x13\x82\x3d\x08\xc7\xfb\xc5\xb1\x23\x3c\x9e\xb1\x62\x3f\x2b\xb8\xfb\x3e\xe1\x08\xdc\x2d\x1f\xef\xb1\x08\x19\x25\xdd\x5f\x37\x14\x7f\x39\xf6\x7f\xfe\xa7\xd6\x64\x0c\x57\x32\xce\x85\x3f\x14\xa7\xd7\x57\x3d\x34\x6a\x72\xe2\x4c\x60\xf0\x59\x97\x44\x60\x92\x8b\xa4\x4d\x9c\x9c\xbe\xeb\x89\xe9\xe7\x4a\x29\x97\x56\x81\x79\x31\x8d\xd6\x93\x9a\x3a\x21\xa9\xbd\xe8\x69\x86\x34\xc8\x69\x1e\xe4\x34\xf3\x7c\xbe\x4c\x2d\xa7\xc7\xeb\x94\x4c\x61\x31\xc1\xe7\x33\x1a\xe7\x73\xdf\xfb\xfd\xd4\x43\x17\x4b\x75\x90\x43\xb9\x77\x0b\x93\x0f\xba\x2f\x66\x9d\x46\xcd\xee\xa4\x65\x4c\x34\x24\x17\x79\x5f\x39\xe2\x58\x8e\x03\xcd\xb0\x58\xf4\xe6\xd4\x3b\x88\x00\x5c\xc9\xa3\x8b\x29\xf4\xee\xaa\x1a\xad\x74\x82\xde\xfe\x78\x2e\x13\x78\x5e\x94\x9b\x47\x9c\xe1\x07\xbc\x1e\x9a\xf7\x31\x0c\xd3\x29\x95\x2c\x99\x25\xe9\x5a\xc3\x65\x71\x1d\xd3\x3a\x16\x60\xd9\xf9\xbd\xbc\x72\xc3\xf7\x2a\x7f\xd5\x8d\x03\xab\x6b\x92\x55\x1a\x99\xea\xc2\x2c\xaf\x6e\xee\x8b\xa2\xc8\xf2\x38\x30\xfd\x26\xe8\x3d\x5c\xa4\x1a\x13\x8e\x97\x3e\x5d\x36\x5c\x10\x2a\x6e\x98\x10\xea\xc0\xe5\xfa\xcb\xbc\x63\xdc\xdc\x79\x3e\xce\x1f\x3b\x7f\x79\x95\xc7\xce\xb8\xa5\xc3\x5b\x2a\x55\x45\x3a\x75\xce\x8d\xdb\xb8\x23\xe6\xd6\x2e\x66\x96\x05\xfb\xe2\x6d\x4c\xf5\x83\xf4\xd3\xf3\x0b\x27\x51\x99\x74\x78\xe1\x7a\x3b\xef\x2c\xbd\x08\x55\x3c\xf3\x96\xbd\xc4\xd7\xee\xa9\x73\xb3\xc0\xb3\x07\xc7\x49\x99\x08\xca\xfa\xbf\x13\x93\xaa\xe1\x21\x9d\xf7\xf4\x19\x08\x70\xef\xcf\x7f\x01\x00\x00\xff\xff\xe9\x8a\xbc\x88\x08\x0b\x00\x00") + +func templatesSerializersAdditionalpropertiesserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersAdditionalpropertiesserializerGotmpl, + "templates/serializers/additionalpropertiesserializer.gotmpl", + ) +} + +func templatesSerializersAdditionalpropertiesserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersAdditionalpropertiesserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/additionalpropertiesserializer.gotmpl", size: 2824, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2f, 0x47, 0x3f, 0xb1, 0x62, 0x4b, 0x2b, 0x29, 0x88, 0x51, 0xf, 0x95, 0x6d, 0xcd, 0x3, 0x0, 0x3d, 0xd6, 0x57, 0x55, 0x3f, 0xb3, 0x58, 0x2c, 0xb4, 0x2c, 0x2d, 0x41, 0x26, 0xbc, 0xf, 0x47}} + return a, nil +} + +var _templatesSerializersAliasedserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x84\xd1\x41\x4b\xc4\x30\x10\x05\xe0\x7b\x7e\xc5\x63\x4f\x89\x68\xf7\x37\x78\x15\x5c\xc1\xd5\x93\x78\x98\x6d\xa7\x18\x68\xd3\x32\x49\x0b\xeb\x90\xff\x2e\x69\x2f\x5b\x5d\xf5\x1a\x5e\xde\xcb\x47\x54\xd1\x70\xeb\x03\x63\x47\x9d\xa7\xc8\xcd\x91\xc5\x53\xe7\x3f\x59\x76\xc8\xd9\xec\xf7\x78\x0d\x3d\x49\xfc\xa0\xee\xe1\xf8\x74\x40\xe4\x14\x41\x50\xc5\x48\xb1\x5e\x92\xa8\x0e\xd4\x33\x72\xc6\x4c\xdd\xc4\x68\x65\xe8\xb1\x84\x7d\x18\xa7\x64\xda\x29\xd4\xb0\xaa\xd5\x33\xd7\xec\x67\x96\x12\xcf\x19\x37\x57\x4b\xdc\x76\xd0\x9e\xf0\xf6\x7e\x3a\x27\x76\x60\x91\x41\xa0\x06\x10\x4e\x93\x04\x58\x5b\x2a\xaa\xfb\xf5\xe5\x2f\xe7\x71\xb9\x6f\xcb\xd9\x76\xca\xb9\xea\x5b\xa9\x33\xd9\x14\xdc\xe3\x05\x4d\x38\x89\xe7\x99\xff\xf3\x51\x5c\x75\xc3\x94\xfe\xe2\xfd\xa2\xbb\x58\xb4\x0e\x76\xc5\xdd\xae\x38\xb7\xd1\xfd\xb4\x5d\xa7\x6d\x1a\x4d\x36\xaa\x77\xe0\xd0\x94\xef\xfb\x0a\x00\x00\xff\xff\xf4\x01\x84\x5a\xe0\x01\x00\x00") + +func templatesSerializersAliasedserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersAliasedserializerGotmpl, + "templates/serializers/aliasedserializer.gotmpl", + ) +} + +func templatesSerializersAliasedserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersAliasedserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/aliasedserializer.gotmpl", size: 480, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5a, 0xe7, 0xb3, 0x5c, 0x43, 0x15, 0x6e, 0x2b, 0xe6, 0xfd, 0x53, 0xc5, 0x93, 0x9c, 0x19, 0x2b, 0xe9, 0x89, 0x5b, 0xd7, 0x61, 0xd6, 0xf8, 0x58, 0x4e, 0x4a, 0xb7, 0x17, 0x9a, 0x17, 0x4, 0x70}} + return a, nil +} + +var _templatesSerializersAllofserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\x5d\x6f\xdb\x36\x14\x7d\xf7\xaf\xb8\x33\x8a\xc2\x0a\x5c\x79\xcf\x19\xf2\x90\xae\xd9\x96\x01\x8d\x83\xa4\xdb\x1e\x82\x60\x65\xac\x6b\x87\xad\x44\x6a\x24\x95\x34\x23\xf4\xdf\x07\x52\xd4\xa7\xa9\x8f\x00\xc3\x9a\x62\x7e\x68\x63\x9b\xe4\xe5\x3d\x87\xe4\xb9\xf7\x68\x0d\x11\x6e\x29\x43\x98\x93\x38\x5e\x6f\xaf\x51\x50\x12\xd3\xbf\x51\xcc\x21\xcf\x67\x00\x5a\xbf\x81\x57\x02\x37\x48\x1f\x50\x5c\x90\x04\xe1\xf8\x04\xc2\xab\xe6\x0f\x79\x3e\x5b\xad\xe0\x37\x96\x10\x21\xef\x49\xfc\xeb\xf5\xfa\x02\xb2\xf2\x9b\x04\x75\x4f\x25\xf0\xbb\x4f\xb8\x51\xb0\x15\x3c\x01\x02\x76\x8a\x54\x22\xdb\xa8\x4c\xe0\x6c\x9b\xb1\x0d\x2c\xb4\x6e\x85\xcd\x73\x38\xd2\x1a\x52\x22\x37\x36\x21\x08\xdd\x66\x41\x7b\xab\x85\x20\x8f\x70\x73\x7b\xf7\xa4\x30\x00\x14\x82\x0b\xd0\x2e\x6f\x41\xd8\x0e\x21\x3c\x35\xc0\x0a\x34\x00\xab\x15\x78\xa3\xda\x41\xb3\x88\x6e\x81\xb0\x08\xc2\x73\x79\xca\x38\x7b\x4a\x78\x26\x21\xbc\x14\x3c\x45\xa1\x28\x4a\xc8\x73\xad\x57\x47\x35\xc0\x98\xb2\x1d\xa4\xf5\x38\x65\x40\xe2\x18\xb8\x09\x53\xae\x2f\xd0\x4b\x38\x5a\xb9\x8d\x1c\xaf\x29\x11\xca\xf0\xd9\x97\x0f\xc0\x03\x11\x10\x11\x45\xb4\x76\xb3\xf3\xdc\x11\x67\x51\x96\x91\x1c\xd2\x56\x9a\x6e\xb8\x42\xc5\xb8\x32\xa8\xde\x12\x89\x1f\x9e\x52\x6c\xce\x68\xcd\x79\x15\x9e\xcb\xb3\x2f\x29\x17\x0a\xa3\xf6\x24\x33\x0d\x14\x26\x69\x4c\x14\xc2\x3c\x15\xf4\xa1\xc8\x65\x4b\x31\x8e\xe6\x10\xee\xc7\xc4\x58\xa2\x27\x48\x07\x6f\x9e\xb7\x23\xcb\xcd\x3d\x26\xc4\x64\x59\x04\x85\x8f\x9f\x24\x67\xc7\x73\xad\x21\x5c\x0b\xba\xa3\x8c\xc4\x8e\x27\xad\xcb\x13\x5b\x58\x80\x57\xf8\x57\x46\x05\x46\x81\xc1\x7a\x96\xa4\xea\x69\x9d\x50\x55\x40\x59\xf2\x84\x9a\x4d\xd4\x93\xd6\x80\x2c\xaa\x96\x87\xe7\xd2\x5c\xa5\x6b\x25\xcc\x61\xe6\xf9\x52\xda\x4f\xd5\xac\xf9\xc7\x2e\x2c\x16\xb5\x19\xf6\x00\x2d\x42\xff\xcb\x8c\x4e\x27\xd4\x30\x16\x5e\x91\xc7\xf7\x28\x25\xd9\xe1\x0b\xa3\xd0\xc7\x60\xf3\x97\x3d\x92\xdd\x05\x0d\x7f\x21\xf2\x34\x8a\xa8\xa2\x9c\x91\xb8\xef\xbe\x37\xe9\xf0\xcd\x0e\x5b\xc8\xdd\xc3\x68\x9c\xd0\x4f\x86\xfd\x2a\x25\x48\x48\x7a\x53\xc0\xb9\xed\xbf\xa6\x3d\x59\x95\xbc\xbf\xa9\x08\xe8\x85\x56\x47\x38\x57\x98\x4c\x82\x64\x27\xb6\xd1\x70\xe1\x8e\xb1\x46\x64\x0f\xf2\x3a\xbb\x73\xcf\xbe\x83\xee\x66\x12\xa8\x32\xa5\x11\x3c\xe6\x1f\xdd\x1a\x1d\x36\xba\x26\x1f\xc9\x2e\xbc\x42\x12\x95\x42\xbd\x84\xd7\x1d\x35\x0b\x7e\xb0\x93\xbf\x3b\x01\x46\x63\xa7\x69\x02\x55\x26\x98\xf9\xdd\x45\x74\x14\xf4\xa8\x9c\x89\x26\xda\x05\x29\xf4\x6a\x3c\x9c\x74\xb5\xd4\x3f\x6f\xe6\xbb\x93\x95\x9a\x15\x97\xbd\x2e\x0e\x76\xdc\xe8\xb4\xd6\xe6\x0f\x33\x31\xaa\x1d\xcd\x73\xfb\x99\xd7\x7a\x5b\x73\x53\x3d\x9b\x52\x90\xf3\xbc\xaa\x6b\xad\x55\x0b\x53\xda\x64\x78\x81\x8f\x6f\xb3\xed\x16\x85\xe1\x31\x58\xc2\x6b\xcf\x76\x41\x2d\x10\x5e\xee\xfb\x96\x58\x94\x53\x0e\xc2\x24\xf6\x3b\x89\x33\x3c\xfb\x92\x0a\x94\x92\x72\x56\xf0\xea\x89\x3c\xf3\x5c\xf6\x76\x29\x6a\x72\xe8\x29\xaa\xb6\x21\x01\x13\x33\xea\x56\xd0\xff\x11\xdd\x57\xfb\x37\x3b\x12\x3c\xbd\x24\x9b\xcf\x46\xd6\xeb\xc4\x07\x4f\xa1\x3e\x84\xf6\xe7\x42\x79\xf6\x75\x74\xb5\x02\xc6\x1f\x61\xcb\x05\x08\xdc\x65\x31\x11\x8d\x1e\xa7\x3a\xca\xd1\x06\xe6\xc1\xad\x93\xbd\xfd\xcb\x48\xf7\x32\xde\xbb\x4c\xea\x5c\x9e\x51\x65\xfd\x5d\xcb\x37\xdd\xb3\x78\x2b\x4e\x17\xe3\x57\xe4\xf1\xe5\xb6\x2a\x7e\xe6\x9a\x7a\xd6\xfc\x56\xfc\x3f\x5c\xfe\xba\xaf\xc1\x57\xff\xba\x52\x50\x46\x1e\x7d\x2b\xd3\xeb\x60\x37\x8d\x81\x42\xd8\x15\x8c\xa6\x92\x8c\x76\x64\xab\x15\x7c\x58\xbf\x5b\x1f\x83\x6f\xca\x7e\xc0\x81\x46\xc8\x13\xc9\x8e\x76\x83\x38\xe6\x18\x8d\x67\xf9\xcc\x18\xd3\xf7\x0d\x5b\xea\x35\xa5\x8a\x4f\xb7\xa4\x3d\x8e\xb4\xb1\xc7\x22\x80\x45\x61\x47\x97\x85\x1d\x0d\xec\xa9\xfe\x69\x88\x96\xe6\x56\x24\xe4\x33\x2e\x6e\x6e\xcb\x39\xdf\x2f\x4d\xd0\x18\x59\x6d\x54\x83\x59\xb3\xdd\x69\xd9\xd7\x69\x0e\x75\xba\xc7\x3c\xf8\xcb\x17\xa6\xd5\x3d\xfe\xd2\xaf\xa5\x5f\x99\xd3\x97\xab\xdb\x43\x3c\xb6\xe5\xfc\xe0\x32\xbf\x49\x97\x39\x6a\x0a\x27\x19\xbd\xa2\x65\x9e\x56\x34\xf7\x6e\xcc\x0c\xec\x03\x78\xd7\xde\xc8\x8a\x7e\x53\x4d\xcb\x3e\xe0\x0f\x41\x15\xda\x02\xd1\x75\xc0\x95\x4f\x69\x2e\xf3\x19\x03\x46\xe3\x6e\x78\x67\x14\x5c\x75\x39\x01\x92\xa6\xc8\xa2\x45\xf1\x7d\xe9\x4b\x30\x18\x73\xb3\x3e\x27\x56\x0d\x2b\x73\xb8\x1b\x9e\xa4\x5c\xda\x23\x2b\x0d\x99\xc7\x79\x2c\x5b\x6d\x50\x0d\xdf\xef\x21\x6b\x16\x06\xa1\x8f\xe0\xf5\x39\xae\xe7\xf9\xd0\xd9\xb3\xc1\xf8\xae\x8f\xdf\xa1\xfd\x97\x18\xbd\x8d\x55\xfb\x91\x1c\x8c\xde\xc1\xe8\x1d\x8c\xde\x10\x73\xc3\x46\x6f\xf0\x46\x4f\x33\x58\xcf\x2e\x40\xed\x3c\x4a\x79\xbf\xec\x6c\x36\xa1\x08\xed\xf9\xd0\x86\x77\xed\xad\x43\xa3\xb5\xa8\xa4\x66\xac\x1e\x75\x13\x0e\xfa\x14\x6b\xb0\x11\x1b\x5f\xd1\x68\x71\x7c\x26\xd1\x72\xf2\x23\x67\x1b\xa2\x2c\x29\x45\x9a\x61\x18\x06\x4b\x67\x20\x1b\xab\xfe\x09\x00\x00\xff\xff\xa8\x0c\x30\x10\x2b\x1d\x00\x00") + +func templatesSerializersAllofserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersAllofserializerGotmpl, + "templates/serializers/allofserializer.gotmpl", + ) +} + +func templatesSerializersAllofserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersAllofserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/allofserializer.gotmpl", size: 7467, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xeb, 0x21, 0x72, 0xcc, 0xc6, 0xf2, 0x55, 0x19, 0xde, 0x64, 0xfe, 0xf4, 0xa7, 0xcd, 0x92, 0xd9, 0xd4, 0xdf, 0xe9, 0x53, 0xb, 0xee, 0xae, 0xaf, 0x60, 0x18, 0x73, 0x49, 0x75, 0x9b, 0x2c, 0xff}} + return a, nil +} + +var _templatesSerializersBasetypeserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xdc\x56\x4d\x6f\xe3\x36\x10\xbd\xf3\x57\xbc\x1a\xde\x40\x02\x54\x19\x08\x7a\x4a\x91\x43\x3f\xd0\x9e\xba\x87\x64\x7b\x0a\x82\x2e\x25\x8d\x62\xee\x4a\xa4\xc2\x0f\x1b\xae\xa0\xff\x5e\x90\xa2\x6c\x25\xb5\x13\xbb\xbd\x14\xbd\xd9\x24\x67\xe6\xf1\xbd\xc7\x19\xf5\x3d\x2a\xaa\x85\x24\x2c\x3a\xd5\xec\x5a\xa5\xbb\xb5\x28\xef\x49\x0b\xde\x88\x3f\x49\x2f\x30\x0c\x6c\xb5\xc2\xef\xb2\xe5\xda\xac\x79\xd3\xf7\xe8\xb8\x29\xc3\x2e\xf2\x8f\xbc\x25\x0c\xc3\x7d\x23\x4a\x82\x9b\xce\x18\xcc\x72\xc1\xf8\x4d\x03\x55\xe3\x68\x2c\xab\x9d\x2c\xcf\xc9\x9f\x68\xe2\x15\x69\x08\x95\xdf\x85\x5f\x19\x4a\x25\x8d\x6b\x49\x43\x3b\x69\x45\x4b\xf9\x4f\x71\x21\x45\xf2\xf0\x78\x34\x55\x06\xd2\x5a\xe9\x14\x3d\x03\x36\x5c\x83\x1a\x6a\x49\x5a\x83\x87\xc7\x2f\x46\xc9\xfc\x8e\x6f\x7f\x23\x63\xf8\x13\x31\x40\xd4\xfe\x38\x6e\x6e\xf7\xa5\xa6\x12\x11\x4d\x86\xab\x29\x41\xfa\x7d\x38\xfb\xcd\x2d\xa4\x68\x42\x7a\x40\x93\x75\x5a\xfa\x85\x50\x97\x01\x03\x8b\x75\x35\x19\xd7\x58\x9c\x80\xc9\x80\x5a\x69\xfc\x91\x4d\xf8\x3c\x06\xcd\xe5\x13\x1d\x00\x8f\x25\x54\xf1\x25\x9b\x40\xba\x37\x59\x4c\x62\xe4\x81\xb7\x34\x64\x88\x97\x7c\x01\xfc\x18\x74\x0f\x7e\xdc\x09\xc8\x6f\xc1\xbb\x8e\x64\x95\x8c\xff\x33\x8f\x24\x65\xe3\xa1\x18\x8c\x69\x4b\x8a\x86\x0d\xec\x7d\x23\x9d\xf2\xd0\x3f\x76\xce\x85\xa6\x79\xdf\x32\xab\x15\xb6\x04\x49\x54\xc1\x2a\xf8\xec\xb0\x6b\x61\x60\xb7\xa2\xa4\x0c\x46\xa1\x16\xda\x58\x08\x69\x15\x38\x0a\x57\xd7\xe4\xc9\xab\xb8\xe5\x7b\x9d\x84\x72\x56\x34\x01\xd1\x0f\x4d\x13\x31\xa6\xec\xb8\x14\xc7\x3c\x74\x60\xf8\x1d\xc9\xc7\xb2\x07\xbd\x07\x36\xb2\x76\x46\x18\x1e\x1e\x8b\x9d\xa5\x7f\x4b\x58\xe1\x6a\x7f\x65\x9f\xca\xe4\x1f\x69\xfb\x63\x60\x24\x54\xf0\x37\xee\x7b\x7f\xe9\xfc\x67\x61\x4a\x2d\x5a\x21\xb9\x25\xe3\x8d\x50\xb8\xfa\xfa\x64\x9c\x8f\x22\x59\x79\x0f\x8c\x92\xd8\x35\x45\xde\x3d\xc0\x51\x11\x61\x46\x79\xbc\x38\x0a\x35\xd9\x72\x1d\xce\x6d\x78\xe3\xc8\xb7\x23\xff\xa7\xef\x5f\xd4\x56\xfa\x17\x41\x8d\x4f\x8c\x4e\xab\x8e\xb4\xdd\xe5\xf1\xbd\x3e\x91\xfd\xb4\xeb\x08\xc6\x6a\x57\x5a\xf4\xaf\x3c\x79\x3c\x89\xb1\x5a\xc8\x27\x7c\xf6\x9d\xe5\xc6\x07\x68\x21\x6d\x8d\xc5\x87\xe7\xc5\x89\x90\xcf\x41\xdd\x37\xfa\x4e\xe1\xea\x0c\x57\x11\xcd\x05\x3d\xe7\x90\x72\xc3\x1b\x51\x71\x4b\xf9\x1d\x3d\x3b\xa1\xa9\xba\x0f\x28\x93\xb3\xf0\x65\x58\x14\xaa\xda\x2d\xb2\x89\x90\xfc\x0c\x1e\x2e\x80\xb9\x5a\xe1\xd3\x5c\xa4\xd3\x02\x09\x03\x67\xc6\x67\x58\x91\x25\xdd\xfa\x29\xb6\x5d\x0b\x2f\xb3\x17\xca\x2a\x94\x9a\xb8\x25\x70\x59\x1d\x0c\x1f\x64\x0f\xfe\xf6\x4f\x94\x01\x66\x2b\xbc\x35\x2e\xb8\x4e\xbc\x41\xdf\x7f\x1b\x5b\xf2\xf2\x6b\x86\xe5\xc6\x73\xfb\x37\x23\x87\x93\x25\x37\xc1\x6a\x73\x7a\x97\x5f\x31\x0c\x37\xb1\xd9\xce\x06\xc2\xf8\x20\xe8\x19\x89\xeb\x3a\xd2\x48\x0e\x68\x96\xe1\x81\xa5\xe9\xb4\xb5\xdc\xa4\x18\x86\xbe\x47\xc9\x5b\x9a\x9d\x18\x17\xa9\x31\xf1\xd7\x72\x13\x57\xc6\x27\x33\x96\x7c\xdb\x62\xd7\x19\xae\x46\x40\xc7\xb4\x3b\x35\x1f\xa6\x09\xb1\xdf\xbd\x9a\x0f\x80\x89\xb3\x3d\x8c\x59\x1f\x9b\xd2\x28\x1d\x1e\x7b\xf2\xdd\xf5\x75\x86\x85\x90\xc1\xab\x6f\x98\x20\xf8\xe4\x06\x1f\x9e\x2f\x34\x24\x1b\xd8\x0c\x0a\x9b\x7d\x06\x15\xdc\x90\x4f\x73\xe9\x37\xd0\x7f\x7f\x74\x45\xaa\x4f\x54\xfd\x55\x85\xf6\xb6\xaf\xfb\x6a\x6a\xfc\x6f\xbf\x01\xcf\x64\x65\x5e\xfe\x25\x35\x33\x1f\xfd\x15\x00\x00\xff\xff\x4e\x29\xe9\x04\x4e\x0b\x00\x00") + +func templatesSerializersBasetypeserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersBasetypeserializerGotmpl, + "templates/serializers/basetypeserializer.gotmpl", + ) +} + +func templatesSerializersBasetypeserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersBasetypeserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/basetypeserializer.gotmpl", size: 2894, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xea, 0xa6, 0x45, 0xd8, 0xdf, 0x80, 0xf1, 0xc8, 0xb0, 0xae, 0xaa, 0xf8, 0xf3, 0xf0, 0x66, 0x1f, 0x8, 0x2a, 0xce, 0x77, 0x63, 0xb3, 0x6f, 0xad, 0xb8, 0x99, 0x46, 0xec, 0xa0, 0x16, 0xc4, 0xd1}} + return a, nil +} + +var _templatesSerializersMarshalbinaryserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x90\xc1\x4b\xc3\x30\x14\x87\xef\xf9\x2b\x7e\xee\x20\xcd\xa8\xdd\x5d\xe9\xc5\xa3\xe0\x84\x0d\xf1\x20\x1e\xd2\xf6\x57\x0d\xb4\xd9\x78\xcd\x26\x33\xe4\x7f\x97\xb4\x22\x9b\xf4\xea\x25\x87\xf7\xc2\xf7\xf8\xbe\x10\xd0\xb0\xb5\x8e\x58\xf4\x46\x86\x0f\xd3\xdd\x5b\x67\xe4\xb4\xa5\x58\xd3\xd9\x2f\xca\x02\x31\xaa\xd5\x0a\x8f\xe7\x6b\x58\xe7\x29\xad\xa9\x09\xdb\xef\x3b\xf6\x74\xde\x78\xbb\x73\xaa\x3d\xb8\x1a\x59\x08\xc5\x86\x35\xed\x91\xb2\x36\x3d\x63\xc4\x32\x04\xec\xcd\x50\x8f\x50\x14\x69\x8a\x18\xf5\x25\x36\xd3\xc8\x5e\xdf\xaa\x93\x67\x0e\x8a\xec\x44\x23\x28\xc0\xb6\x08\x01\x17\x44\xc4\x88\xb2\x84\xb3\xdd\xf8\x03\x10\xfa\x83\xb8\x34\xc8\xd3\xa3\x80\xa8\x7e\xa7\xc3\xa7\x79\x2f\x5e\xc4\x7a\x3e\x6c\x9f\xd6\xd9\x0c\x4c\xab\xa8\x92\xe5\xb3\xeb\xff\xc7\xf3\x0f\x38\xab\x30\x89\xea\x49\x74\xb4\x38\x1a\x81\x70\xc0\x2c\x62\xea\x40\x11\xdc\x96\x93\xd0\x86\xa6\x19\x7d\xaa\x1c\xd7\xc2\x41\xdf\x8d\xeb\xab\x99\x2c\x14\xf9\x29\xb2\x9c\x2d\x99\xce\xaa\xf3\x88\x2a\xaa\x10\x6e\x40\xd7\xa4\xd3\xdf\x01\x00\x00\xff\xff\x22\x3a\x4f\x6c\x26\x02\x00\x00") + +func templatesSerializersMarshalbinaryserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersMarshalbinaryserializerGotmpl, + "templates/serializers/marshalbinaryserializer.gotmpl", + ) +} + +func templatesSerializersMarshalbinaryserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersMarshalbinaryserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/marshalbinaryserializer.gotmpl", size: 550, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0x26, 0x66, 0xd8, 0xe2, 0x4f, 0x4, 0x11, 0x3, 0xae, 0x3c, 0xf, 0x5, 0x8e, 0x7d, 0x1f, 0xd3, 0x91, 0xb1, 0x55, 0x3f, 0x6e, 0x43, 0x34, 0x32, 0x6b, 0x52, 0xd9, 0xa9, 0xab, 0xed, 0x32}} + return a, nil +} + +var _templatesSerializersSchemaserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x90\x41\x4e\xf3\x30\x10\x85\xf7\xff\x29\x9e\xba\x6a\x2b\xfd\x2e\x57\x28\xb0\xa0\xab\x22\xb5\x17\x98\x26\x93\x66\x90\x63\x5b\x9e\x29\x50\xa2\xdc\x1d\x19\xa1\x92\x45\x50\xbb\x60\x67\x7b\x3e\x7d\x6f\xfc\xfa\x1e\x35\x37\x12\x18\x33\xad\x5a\xee\x68\xc7\x59\xc8\xcb\x07\xe7\x19\x86\xa1\xef\x57\x4b\xe8\x9b\x58\xd5\xb2\xc2\x22\xac\x65\x50\x4a\x39\xa6\x2c\x64\x0c\xbd\xe0\x68\x62\x06\x85\x33\x8e\xf2\xca\x01\x76\x4e\x8c\xe5\x6a\x18\xfe\x01\x7d\xff\x1f\xd2\x80\x42\x0d\xb7\xd1\xdd\xe9\xb0\x2f\xc3\x79\x88\x06\xf7\x44\x7a\x4f\xca\xe5\x65\x81\x2f\xba\xf0\x30\xee\x92\x2f\x01\xb3\x96\xf4\x51\xb4\xca\xd2\x49\x20\xe3\x7a\xbc\xa0\xc3\xc5\xcf\x5e\xb9\x84\xb8\x8d\xee\x4f\xc9\xf3\xa4\xcb\xca\xe4\x9a\x60\xb4\xd1\x1f\x2d\xb4\xae\x6b\x31\x89\x81\xfc\x73\x8e\x89\xb3\x09\xeb\xa4\x9a\x26\xc0\x2b\xfa\x52\xea\xfc\x68\x98\x7b\x0e\x70\x6b\xef\xb7\xcd\x02\x77\x8b\xef\x76\x7f\xda\x9e\x2e\x97\x0a\x7f\x43\x82\xdb\xe8\x43\xec\x92\xe7\xf7\xed\xe1\x85\x2b\x83\xdb\x59\x96\xca\x6e\xfe\x59\x88\x53\xe8\x6f\xc9\xa1\x2e\x97\xd1\xf1\x33\x00\x00\xff\xff\xa7\x46\x92\xea\xa7\x02\x00\x00") + +func templatesSerializersSchemaserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersSchemaserializerGotmpl, + "templates/serializers/schemaserializer.gotmpl", + ) +} + +func templatesSerializersSchemaserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersSchemaserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/schemaserializer.gotmpl", size: 679, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5a, 0xf8, 0xc2, 0xed, 0xfb, 0xe0, 0x8f, 0xdc, 0x8e, 0xa8, 0x4a, 0x5d, 0x5e, 0x53, 0x3f, 0xd6, 0x9d, 0xf4, 0x4a, 0x2a, 0x9a, 0x7d, 0x96, 0x5f, 0x20, 0xbc, 0xb7, 0x66, 0x63, 0x42, 0x6c, 0x35}} + return a, nil +} + +var _templatesSerializersSubtypeserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\xdf\x6f\xdb\xb6\x13\x7f\xb6\xfe\x8a\xab\x91\xe6\x2b\x05\xfa\xca\x5b\xbb\xa7\x0e\x19\xd0\x9f\x43\x0a\xd4\x19\x9a\x75\x2f\x41\x30\xd0\xd2\x29\x66\x23\x91\x2a\x49\xd9\xf5\x04\xff\xef\x03\x45\x4a\xa2\x6c\xc9\x71\xb3\x3e\xac\x58\xdf\x24\x91\xbc\xfb\xdc\xdd\xe7\x43\x1d\x59\x55\x90\x60\x4a\x19\xc2\x74\x49\xe4\x2b\x2a\x63\x41\x73\xca\x88\xc2\xe4\x0a\x05\x25\x19\xfd\x0b\xc5\x14\xb6\x5b\x6f\x36\x83\x0f\x2c\x27\x42\x2e\x49\xf6\xf6\xea\x72\x0e\x65\xf3\x26\x41\x2d\xa9\x04\xbe\xf8\x88\xb1\x82\x35\x55\x4b\x20\x50\xf0\x6c\x93\x73\x51\x2c\x69\x0c\x6a\x53\x20\xa4\x82\xe7\x40\xa0\x5e\x2a\x95\x28\x63\x55\x0a\xf4\xd2\x92\xc5\xe0\x57\x55\xf4\x1e\x63\xa4\x2b\x14\x73\x92\xe3\x76\x0b\x67\x55\x05\x05\x91\x71\x0d\x00\x22\xfd\x15\xb6\xdb\xa0\x0f\xc1\x17\x64\x0d\xd7\x37\x8b\x8d\xc2\x00\x50\x08\x2e\xa0\xf2\x00\x56\x44\x40\x42\x14\x81\xaa\x02\x85\x79\x91\x11\x85\x30\xd5\xb8\x78\xa9\x5e\x10\x89\xbf\x6f\x0a\x7c\xc1\x93\xcd\x14\x22\x1d\x19\xc0\xa2\x4c\xe1\xd9\x39\x68\x43\x32\x9a\xe3\xfa\x45\x99\xa6\x28\xb4\xf9\xc0\x03\x48\x30\xd6\xa3\x1f\x25\x67\x7a\xf0\x15\xc6\x3c\x41\xe1\x2f\xca\xd4\x8e\x46\x1f\x24\xce\xcb\x7c\x81\xc2\x0f\x3c\x0f\x80\xa6\x1a\x8d\x5e\xa3\x07\xcd\x7c\xff\x54\x43\x0a\x7e\xae\x47\x1e\x9d\x03\xa3\x59\x0d\x76\x22\x50\x95\x82\xe9\xcf\x1e\x80\x06\x53\x55\xda\x00\x17\x10\x5d\xc8\x06\xad\x7e\xbe\x2a\x17\xf5\x63\x8d\x58\xc7\xb8\x20\x12\xfb\x31\xbe\x2d\xe5\x78\x80\x07\xe3\xfb\xe7\xe1\x69\x34\xfb\xe1\x01\x0c\xc4\xf7\x7f\x40\x96\x68\x60\x26\x5a\x41\xd8\x2d\x42\xf4\x3c\xcb\x2e\x53\x03\xd7\x4c\xa2\x29\x30\xae\x7a\x69\xb0\xa3\xee\xb2\xdf\x04\x2f\x50\x28\x8a\xb2\x1b\x6d\xd7\xef\x64\xd1\xb7\xf6\x5e\x7f\x2e\xb8\x50\x98\x04\xee\x92\xbe\xd3\xf7\xf8\xa9\xa4\x02\x93\x2e\xdd\x44\xe3\x1b\xa4\xa5\x2d\x59\x74\x21\x9f\x0b\x41\x36\xb0\xdd\x5e\xdf\xf4\x27\x5e\x28\xcc\x65\xf4\x2b\xb7\x41\x54\x15\x60\x26\xed\x93\x33\xad\x37\x81\x59\xdf\x34\xd5\x7a\xa1\xec\xd6\xd7\x0c\x8a\x46\x84\xf1\xe8\x1c\xa6\xac\xcc\xb2\xa9\x4d\x7b\x55\x41\x4c\x72\xec\xcd\x0a\x9b\xba\xb5\x2a\xda\x03\x7e\x10\xf6\x55\x46\x63\x3c\x1e\xbb\xbf\xcb\xb7\x03\xf8\x43\x10\x25\x53\x34\xc7\x48\x0b\xfb\x25\x67\xb2\xcc\x35\xdf\x82\x3a\x18\xcb\x38\xcb\xab\xd3\xd3\xe6\x8d\xf2\xe8\xf5\xe5\x1b\x1b\xf1\x0e\xd5\x0c\xd9\xe0\x50\xd9\xce\x07\xb3\xe4\x35\x2b\x3b\x52\xd8\x80\xbd\x43\xd6\xbe\xd1\xe4\x1e\x95\xda\x3d\x0d\xf7\x92\xd3\x10\x75\xe4\xd3\xce\x87\xde\xeb\xce\xcb\xb8\xa6\xbf\x58\xcf\x87\xb5\x5c\x08\x5e\x7c\x97\xf2\xb7\x26\xe5\xf1\xaa\xdd\xab\xe4\xbe\x8a\x47\x0d\x7d\xa3\x69\x7d\xb8\x88\x8f\x14\xa7\x95\x8d\x40\x59\x66\x0a\x06\x01\xba\x02\x3e\xf9\x33\x84\x93\x82\x08\x64\x4a\x27\x73\xf0\xd7\x6e\xc7\x75\x66\x19\x67\x9b\x9c\x97\x72\x4f\xbd\xdd\x9c\xfd\x0e\xc0\x75\x47\x93\xcf\x21\x9c\xac\x48\xa6\xbd\x35\x8b\x86\x1b\x83\x6e\x67\xc0\x76\xa6\xd3\xf6\x72\xf1\x86\x62\x96\xd4\xc6\x9c\xc8\xf6\x56\xd7\xe3\xdd\xc6\x63\x66\x99\xf4\x44\x2e\x15\x5d\x3b\xc6\xf2\x79\xdd\xb7\xf5\x8b\x7c\xd0\x5b\x47\xdb\x23\xed\xef\xff\xa3\x0e\xdb\xef\xef\xdf\xbb\x4e\x69\x7a\x0f\x60\x4d\xb4\x0e\xd9\xf0\x1c\x3f\xb0\x24\x9c\x9d\xc1\x9c\x2b\x50\x4b\x34\xa7\x82\x35\xfe\x4f\x20\x64\x9c\xdf\x51\x76\x0b\x29\x17\x11\x9c\xcd\x76\xe8\xca\x45\x2d\x11\xff\xa7\x27\x4f\x42\x98\x52\xb6\x22\x19\x4d\xa0\xaa\x5a\x07\xdb\x2d\xac\x48\x56\xe2\x33\x78\xfc\x69\x1a\xde\x03\x37\x78\xe8\x2f\xac\xcd\xc8\xd7\x60\x9f\xe5\x4f\x9f\xd6\x5f\xbb\xbe\x63\xec\x19\xa9\xe3\x39\xec\x6f\x3f\x87\x2c\x3f\xe0\xbf\xdf\xcb\xa1\x4d\x05\x61\xc9\x90\xd0\xbb\x4f\x7d\x91\xfd\x87\xb4\xff\x5d\xfa\xff\x36\xe9\x77\xc1\x36\xfc\x69\x7f\xea\x8e\x7c\xf6\xc6\xbe\x5e\x27\x3c\x9b\xe9\x41\xa7\xa0\x1d\x22\xd3\xa6\x38\x3b\xca\x50\x4b\x54\x13\x65\xac\x41\xb1\x73\xda\xf6\xc4\xb4\x55\x7b\x76\x47\xbb\xa7\xce\xee\x48\x1f\xd3\xef\x86\xdd\xe7\x33\x1d\x95\x7b\x07\x64\xdc\x9b\xe8\xbc\xf6\x56\x44\x77\x0b\x49\x42\x15\xe5\x8c\x64\x03\xb9\xe9\x06\xa1\x1b\x7d\x06\x02\x49\x02\x82\xac\x43\x10\x98\xf3\x15\x02\x23\x39\x26\x75\x1b\x68\xa6\x84\xf5\x2e\x44\x92\x04\x14\x87\x9c\x14\x3a\xb1\x64\xad\x4d\x48\xbd\xad\xe4\xe4\x0e\xfd\x9c\x14\xd7\xa6\x7b\xbf\xb1\x60\x46\xa0\xd4\x37\x29\xef\xc9\xfa\x1d\x4a\x49\x6e\x9d\x76\x90\x32\x85\x22\x25\x31\x56\x5d\x1e\x82\xde\x85\x4a\xbd\xb4\xed\x3d\xfd\x1a\xf2\x69\x83\xe4\xa8\xdb\x95\x43\xe4\x49\x30\x43\x85\x7e\x63\x2f\xac\x1b\x39\x41\x99\x4a\x61\xfa\xf8\xd3\x14\x5c\x9d\x0c\xb0\xf5\x50\xcc\x26\x8a\x0c\x59\x6b\x3d\x80\x5f\xe0\x87\xee\x04\x13\xfd\xa1\x65\xfa\xfa\x73\x21\x50\x4a\xca\x99\xa9\xef\x40\x62\xbb\xdb\x2c\x19\x2f\x31\x27\x9a\x74\xd3\x51\xbf\x06\x6a\xca\x05\xdc\x85\xb0\xd2\x29\x34\xb1\xb7\xd5\x6b\x0e\x14\xba\x7d\x55\x5c\x57\xf8\x8b\x7d\x58\x0b\xa3\x55\x5a\xe9\x44\x36\x67\xcd\x21\x1b\xd1\x85\x9c\x97\x59\x46\x16\x99\xce\xee\x69\x5b\xfb\x1a\xcf\x50\x55\xf7\x2a\x0b\xe0\xb6\xec\x43\xc9\xbc\xbe\xbb\x81\x73\x13\x61\x7b\x62\x1a\xff\xf1\x8e\x94\xa3\xc9\xda\x7d\x67\x01\x8b\x8d\xd1\xcc\xdb\x7a\xde\x6c\x06\xef\x9c\x7b\xe1\x2f\xba\x15\x56\xfc\xf8\x3b\xe1\x91\xe3\xb2\xe3\xdb\x0f\xc0\x37\xf7\xc1\xa1\xf9\x7b\x04\x50\xe9\x65\x27\xc2\xdd\x59\xf4\x89\x64\x67\xab\xf1\x26\xf5\x85\xea\x8f\x21\x2c\x9e\x84\xb0\x78\x6a\x6f\x95\xcd\x67\x5d\x9e\xda\x9a\x37\xd1\x33\xf4\xab\xe5\x80\x75\xed\xdf\x77\xd1\x7c\x29\xe6\x9c\x35\xfd\x82\xb9\x94\x0d\xbc\x49\xff\xd4\x56\x79\x93\x49\x97\xd7\xda\x8d\x37\xd9\x7a\x13\x0d\xe8\x18\x97\xae\xbf\xe7\x2c\x79\xb0\xc3\xa3\xb6\x5a\xab\xf5\x61\x22\xb9\xca\x9f\xcd\x6a\x8d\x9b\x12\x5b\x2e\x68\xb5\xea\x2e\x80\x74\x9b\x75\xb7\x13\xd7\xab\x16\x4f\xc7\x62\x1e\x72\x37\x70\xaf\xb0\x73\x8d\xd0\xc6\xe7\x2a\xc3\xa5\x74\x93\x08\xb9\x26\xb7\xd1\x4b\xce\x62\xa2\x6a\x3e\x75\x8c\x08\x42\x4b\x77\x67\xd9\xdf\x01\x00\x00\xff\xff\xf5\xab\x3a\x01\x3d\x19\x00\x00") + +func templatesSerializersSubtypeserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersSubtypeserializerGotmpl, + "templates/serializers/subtypeserializer.gotmpl", + ) +} + +func templatesSerializersSubtypeserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersSubtypeserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/subtypeserializer.gotmpl", size: 6461, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0xda, 0x25, 0x36, 0xe9, 0x81, 0xa, 0x2a, 0x43, 0xc0, 0x2, 0x5, 0xb4, 0x4e, 0x7a, 0x66, 0x2, 0x2c, 0x8e, 0x76, 0x64, 0x7a, 0x51, 0xc1, 0x93, 0xa8, 0x13, 0xe7, 0xff, 0x73, 0x8c, 0x12}} + return a, nil +} + +var _templatesSerializersTupleserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xbc\x95\x41\x6f\xe3\x36\x10\x85\xef\xfc\x15\xaf\x41\xb0\x90\x5a\x47\x41\xda\x5b\x8a\x14\x68\xd1\x3d\xa4\xc0\xba\xc5\xa6\xdb\x4b\x60\x14\xb4\x34\x8a\xb9\xa0\x28\x81\xa4\xec\xb8\x04\xff\x7b\x41\x52\xd6\x2a\xb6\x95\xf6\x10\xec\x25\x88\xc9\xa1\xde\xcc\xbc\x8f\x1c\xe7\x50\x51\x2d\x14\xe1\xc2\xf6\x9d\xa4\x07\xd2\x82\x4b\xf1\x0f\xe9\x0b\x78\xcf\xae\xaf\xf1\x49\x35\x5c\x9b\x0d\x97\xbf\x3d\xfc\xbe\x44\x7f\xf8\x65\x60\x37\xc2\x20\x1e\x82\xdd\x77\x84\x5a\xb7\x0d\x38\x62\x18\xd7\x9a\xef\x59\xdd\xab\x12\x99\x73\xc5\x47\x2a\x49\x6c\x49\x2f\x79\x43\xde\xe3\x5b\xe7\xd0\x71\x53\x46\x21\x14\x61\x15\xde\xe7\x2f\xa5\x32\xcd\x77\x78\x5c\xad\xf7\x96\x72\x90\xd6\xad\x86\x63\xc0\xf5\x35\x8c\xe5\x4f\x84\x9b\x05\x9e\xc8\xc2\x6e\x28\xa9\x61\xdd\x5b\x7c\xee\xcd\x64\x89\x01\x5b\xae\x53\xfc\x0d\x1e\x57\x9f\x4d\xab\x8a\x8f\x7c\xf7\x81\x8c\xe1\x4f\xc4\x80\x75\x5f\xe3\xf6\x0e\x41\xc4\x14\x4b\xda\xfd\xd2\xd7\x35\xe9\x20\x9d\x33\xa0\xa2\x32\xec\xc6\x63\x4b\xda\xfd\x4a\x65\x5b\x91\xce\xd6\x7d\x3d\xec\x16\x9f\x0c\x2d\xfb\x66\x4d\x3a\xcb\x19\x03\x44\x1d\x32\x0d\x67\xc2\x66\x8a\xcf\xde\x25\xfd\xfc\xc7\xb8\xf7\xcd\x1d\x94\x90\xb1\x14\x40\x93\xed\xb5\x0a\xeb\x0c\xf0\x6c\x5a\xde\xf7\xb7\xd8\xec\x2b\xcd\x2d\x19\x18\xab\xfb\xd2\xa2\xa1\xa0\x64\xb0\x13\x76\x33\x34\x9e\x24\x35\xa4\xac\x61\x80\x73\x57\x41\xbf\xf8\xb9\xaa\x84\x15\xad\xe2\xf2\xde\x52\x63\x82\x8b\xa9\x0d\x92\x1b\x7b\xaf\x2a\x7a\x86\x50\x36\x1e\x00\xa9\x2a\xed\x3b\x07\xcd\xd5\x13\xe1\x52\x54\xcf\x0b\x5c\x6e\xb9\x0c\x55\x14\x7f\xe8\xb6\x23\x6d\x05\x85\xef\x88\x1a\x92\x54\x36\x94\x83\x9f\xc2\xa9\x10\x0f\xef\x87\x7a\x82\x4c\xc5\x2d\x3f\xeb\x6f\x08\xb7\xd4\x74\x92\x5b\xc2\x45\x45\x9a\xea\x9a\xaa\x87\x72\x43\x0d\xff\x73\xdf\xd1\x05\x8a\x94\x4c\xb2\xe5\xd4\x95\x24\xfc\xf8\x45\x75\x95\xc7\xe8\xd7\x6d\x3a\x35\x2a\xac\x9d\x77\x6a\x36\xf7\x73\xe6\x1d\xd9\x17\x0c\x0c\x7f\x9d\xc3\x0b\xde\xe1\x7d\xe1\x5c\xb4\xe6\xde\xbc\x7f\xee\x5a\x6d\x29\x74\xfd\xac\x4e\xf0\x44\x9a\xe1\xbf\x92\x37\x74\xb2\x1b\x1d\xc3\x1d\xc6\x4f\x2e\x7b\x29\xf9\x5a\x86\xfd\x77\x63\xc0\x6c\x21\x87\x14\x45\x8d\xcb\xf3\xa8\x60\x02\xca\xdd\xc4\xe2\xc3\xc9\x91\x19\x7f\xca\xd0\x2c\x7f\x23\xd6\x3f\x4c\xb0\x3e\x8a\x4c\xf7\xe7\x25\x61\x63\x2a\xdf\xdd\x0c\x5d\xaf\x5b\x8d\xbf\x17\x18\x00\x4d\xd0\x0e\x60\x4c\x82\x6f\x57\xa3\x49\x81\x49\xdb\xf2\xaa\x7a\xc9\x9f\x99\x72\x37\xd3\x88\x39\x10\xb7\x5c\xe6\x43\xc0\x7f\xb1\x77\x9e\xbe\x19\xfe\x52\x07\x55\x6b\x4f\x32\x9a\xf3\x39\x16\x76\x1e\xce\x13\x3c\x0f\x80\xa6\xa7\x22\x3e\x22\xf3\x85\x47\x3b\x2f\x8b\xbf\xb8\xec\xe9\xfd\x73\xa7\xc9\x18\xd1\xaa\xc4\xf2\xd5\x9b\xc3\xcc\xbb\x8e\x54\x95\x7d\x35\xc9\x45\x22\x22\x9f\xf4\x63\xc4\x38\xb5\xc9\xb3\xa3\xe5\xa1\x99\x4a\x48\xe6\x59\x98\x8b\x1f\x26\x53\x71\x76\x26\x0a\x65\xdb\xff\x37\x13\x67\x46\xe2\x44\x25\xcb\x91\xa5\x79\xb8\x48\xf3\x30\x8f\x5e\x87\xab\x1e\x38\x7a\x5c\x09\x65\x49\xd7\xbc\x24\xe7\xdd\xf4\x4d\x9f\xbe\xe2\x57\xe3\x45\x3e\x4a\xa0\x38\x9b\xc0\xe2\xb8\x0d\xc3\x45\x7f\x85\x9e\xc3\x05\xfd\x72\x3d\xe7\x6d\x7d\x63\x90\x12\xfa\xb1\x21\x23\x53\xe1\xd7\x02\xdb\xfc\x15\x4f\xe3\xe5\x1d\x1a\x1d\xe3\x73\xe6\xd9\x24\xf0\xdf\x00\x00\x00\xff\xff\xaa\xdd\xa3\x28\x24\x09\x00\x00") + +func templatesSerializersTupleserializerGotmplBytes() ([]byte, error) { + return bindataRead( + _templatesSerializersTupleserializerGotmpl, + "templates/serializers/tupleserializer.gotmpl", + ) +} + +func templatesSerializersTupleserializerGotmpl() (*asset, error) { + bytes, err := templatesSerializersTupleserializerGotmplBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "templates/serializers/tupleserializer.gotmpl", size: 2340, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xf1, 0x74, 0xac, 0x39, 0x38, 0xfb, 0x30, 0xa, 0x98, 0x77, 0xaf, 0xfa, 0x90, 0xce, 0x7c, 0xed, 0x34, 0xe7, 0x68, 0x29, 0x54, 0xe4, 0x1a, 0x53, 0xb1, 0x12, 0xc6, 0xb4, 0x4f, 0x4b, 0x1f, 0xbf}} + return a, nil +} + +var _templatesServerBuilderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x3c\x5d\x6f\xe3\x38\x92\xcf\xa7\x5f\x51\x6b\xec\xde\x59\x0d\xb7\xdd\xb8\xa7\x43\x06\x39\x20\x93\xcc\xec\xe6\x6e\x66\x3a\xe8\xf4\xdc\x3d\x04\x8d\x05\x23\x95\x6d\x5e\xcb\xa4\x86\xa4\xe2\xc9\x0a\xfa\xef\x07\x7e\x8a\xfa\xb2\x1d\x77\x7a\xa7\xf3\x92\x48\x24\xeb\x9b\xc5\xaa\x62\x29\xab\x15\x5c\xf3\x1c\x61\x83\x0c\x05\x51\x98\xc3\xe3\x33\x6c\xf8\x5b\xb9\x27\x9b\x0d\x8a\xef\xe0\xe6\x3d\xfc\xf2\xfe\x23\xfc\x70\x73\xfb\x71\x99\x24\x49\x5d\x03\x5d\xc3\xf2\x9a\x97\xcf\x82\x6e\xb6\x0a\xde\x36\xcd\x6a\x05\x75\x0d\x19\xdf\xed\x90\xa9\xde\x58\x5d\x03\xb2\x1c\x9a\x26\x49\x92\x92\x64\x9f\xc9\x06\xa1\xae\x97\x77\xf6\xcf\xa6\xd1\x00\xff\xec\x07\x2e\x2e\xc1\x8f\x98\x15\xab\x15\x7c\xdc\x52\x09\x6b\x5a\x20\xec\x89\xec\x52\xa9\xb6\x08\x8e\x4c\x50\x9c\x17\x4b\x3d\xff\x87\x9c\x2a\xca\x36\xa0\xc2\xba\x9d\x21\xa5\x14\xfc\x09\x61\x5d\x29\x03\x6a\x8b\x0c\x9e\x79\x05\x02\xdf\x8a\x8a\x75\x20\x79\x14\x86\x1f\xc2\xf2\x24\xa1\xbb\x92\x0b\x05\xf3\x04\x60\x96\x71\xa6\xf0\x77\x35\xd3\x7f\xaf\x77\xf6\x37\xe5\xe6\x17\x43\xb5\xda\x2a\x55\x9a\x07\xa9\x04\x65\x1b\x39\x4b\xf4\xc3\x86\xaa\x6d\xf5\xb8\xcc\xf8\x6e\xb5\xe1\x6f\x79\x89\x8c\x94\x74\x85\x42\x70\x21\x67\xd3\x13\x0a\x4e\xf2\x43\xe3\xa2\x62\x8a\xee\xf0\xf8\x8c\xd5\x8e\xe6\x79\x81\x7b\x22\x4e\x99\x2c\x31\xab\x04\x55\xcf\x07\xa6\xca\x12\xb3\x43\xc3\x4a\x78\xd9\x4c\x4c\xd8\x93\x8d\x11\x8d\xb6\x26\x23\x5d\x09\xcb\x1b\x5c\x93\xaa\x50\xb7\xee\xb9\x69\x7a\xe3\xd1\x40\x6a\x4c\xe3\x17\xdc\xd7\x35\x94\x44\x66\xa4\xa0\xff\x40\x58\xfe\x42\x76\xda\x6e\xae\xee\x6e\x21\x13\x48\x14\x4a\x20\xc0\x70\x0f\xa3\xd3\x80\x32\xa9\x08\xcb\x30\x59\x57\x2c\x3b\x04\x6d\xae\xf9\x85\x37\x46\x1f\xcb\x1b\x9e\x55\xda\xce\x53\x78\x33\x89\xbd\x4e\x00\x04\xaa\x4a\x30\xf8\xd7\xa9\x49\x7a\x0e\xc0\x96\xb0\xbc\x40\x21\x2f\xa0\xfb\xb3\x23\x9f\x71\xbe\x23\xe5\x83\x35\xa4\x4f\xd1\x9f\xda\xc6\x96\x7f\xb3\xeb\xd2\x85\x81\xb2\xe6\x62\x47\xd4\x00\x08\x58\x45\x78\xc9\xda\xb9\xb9\x7d\xb8\xe6\x4c\x56\x3b\x6c\xd7\xcc\xea\x3a\xe8\xc0\x0f\x42\xd3\xcc\x3a\xab\xee\x04\xcf\xab\x6c\x62\x95\x1f\x6c\x57\x65\x95\x54\x7c\xe7\xa0\x45\x4c\xf6\xb9\x73\xa6\xb7\xf4\x33\xd3\x78\xb9\x03\x7b\xc2\x72\x3f\xd3\x2d\xbf\x13\x78\x8f\xe2\x09\xc5\xfd\xb6\x52\x39\xdf\x33\x07\x40\xab\x7b\x9e\x42\x0d\xd0\xd8\x89\xa3\xb3\xc6\x26\x6a\x3b\x18\x08\xd9\xbd\xb7\x33\x2a\x89\xf7\xd6\x91\xfc\x7a\x1b\xcf\x5c\x93\x42\x62\x84\xed\x07\xbd\xf9\xbb\xa0\xac\x3f\x58\xb6\xc3\x76\xfa\xf7\x44\xd2\xec\xaa\x52\x5b\x64\x8a\x66\x44\xf9\x65\x7e\x9b\x2e\xc3\x04\x3b\xff\xea\xee\xf6\xbf\xf1\x79\xb8\x20\xcc\x6f\x27\x38\x04\x48\x04\x8a\x03\x0b\xda\x09\x76\x41\x5d\x83\x20\x6c\x83\xb0\x8c\xec\x24\xb1\x4c\xd4\xf5\x5b\x73\x3e\xdc\xee\xca\x02\xf5\x36\x21\x8a\x72\xd6\x8e\xc3\xf8\x5e\xf4\x8a\xbf\xd0\xc3\xc3\xc5\x8b\x08\x3a\x16\x12\x5f\x00\xaf\x6f\x5a\x3f\x6a\x9d\x1a\xc5\x0a\xa0\x7c\xf9\x01\x49\x8e\x62\x01\x8a\x88\x0d\x2a\xa0\x4c\xa1\x58\x93\x0c\xeb\x26\xb5\x0a\x81\x3a\x69\x55\xe4\xf6\xb4\xd3\xd4\x2f\x5c\x05\x4a\x31\x9f\xcf\xea\xda\xa0\x6f\x1a\xc8\x1c\x32\xd8\x12\x09\x8c\x2b\x78\x46\x05\x8f\x88\x4c\x7b\x33\xbf\x60\x96\x06\xc8\x4d\xda\xe1\xd0\x9e\x97\xa3\x8f\x5e\xf2\xd1\x5e\xfb\x32\xc9\xfb\x3d\xf3\x5a\x92\x6f\xe1\xf5\x77\x65\x2b\xf9\xbd\x96\xfc\xff\x0a\xaa\xb4\xe4\x73\xa2\xc8\x6b\xc9\xbd\x74\xa8\xbe\x9e\xdc\xdf\x97\x3a\x38\xa0\x9c\x75\x24\xaf\x05\xcf\xb0\x8d\x5d\x42\x40\x63\xe2\x9f\x48\x48\x77\xf1\x7b\x8b\x60\x54\x8a\xce\xbd\x5f\x44\xb2\x7e\x7b\x18\x89\x7f\x7d\x55\x50\xa2\x69\x5b\x9e\x84\xa0\xd5\x49\x49\x04\xd9\xc9\xa3\xbc\x8c\xa0\xe9\x89\x8d\xae\xe1\xcf\xcb\xbf\x22\x7b\x5f\x2a\xb9\xbc\x57\x82\x66\xea\x03\xca\x92\xb3\x1c\x85\xec\x58\xcf\xdb\x31\xf3\x31\x64\xd4\xb5\xb6\x64\xed\x71\xb8\xa0\xff\xc0\xbc\x69\x16\x50\x0a\xca\x32\x5a\x92\x02\xcc\xa8\xd6\xee\x1c\xf0\x37\xbd\x15\xfc\xc0\x2c\x32\xa3\x19\xa4\x4d\xf3\x26\x12\x42\x3b\x4f\x3f\x21\xcb\x9b\x26\x75\xa0\x8e\x72\x7b\x5c\x9e\x81\xc5\x60\xb7\xce\x66\x5f\x0d\x43\xcf\xea\x53\x27\x70\xbd\x29\xbf\x35\xa9\xb6\xe1\xe6\x72\x52\x2e\xd1\x9c\xfe\x7e\xe6\x7e\x8f\x9d\x6c\x8d\x3d\xe9\xf5\x04\xd0\x34\xa7\xf8\x03\xb7\xfe\xad\x13\xa6\x77\x0d\x93\x9e\xe0\xde\x1d\x8f\x37\xb8\xa6\x8c\x0e\x5c\x82\x73\xc6\x32\x9c\xce\xed\xe0\x6a\x05\x57\x65\x59\x50\x94\x36\x11\xd1\xd9\x87\xd7\x8a\xe5\x7b\x6b\x4e\x25\xa0\x12\x24\x2a\xd8\x53\xb5\x35\x93\x0c\x2c\x90\xd9\x16\x77\x98\x0c\x3d\xf0\xed\x8d\x8e\x2c\x2b\xb5\xbd\xb0\x91\x4b\x25\x51\x80\x0d\x91\x16\x7a\x9e\x74\x0f\x29\xcc\xbf\x5c\xd9\x0b\xeb\x8d\xd3\xbe\x5e\x19\x2d\x16\x53\x8e\xfa\xd1\xd0\x4f\xb4\x30\x34\x09\x8e\xe2\xf4\x14\xed\x34\x13\x8e\x3a\x16\x75\x1b\xd8\x1c\x96\xb5\x89\x59\xdd\xce\x98\x99\x63\xef\x9e\x57\x22\xb3\x39\x81\x11\xf9\x09\xc2\x55\xfc\x33\xb2\x3f\x5a\xa0\xa4\xa4\xf0\x19\x9f\xad\x48\x63\x89\xb6\x47\xe2\x5a\xf0\x9d\x7e\xb4\x2c\xea\x33\x52\xfb\x02\x78\x88\x64\xf0\xe9\xb5\x14\xf0\x5e\xcb\xe7\xdf\xa3\xad\x72\xa2\xfc\x16\x20\x33\x5e\xa2\x84\x87\x4f\x7f\xb0\x40\x39\x31\x1c\x3c\x9a\x88\x77\x28\xd6\x2f\x90\xd3\xc8\xa3\x16\xda\x01\x2f\xb2\x5a\xf9\xac\xcb\x10\x62\x7c\xb6\xf1\x09\xe1\x29\x87\x1d\x12\x46\xd9\x06\x18\x07\x81\xbf\x55\x28\x95\x04\x22\x10\x1e\x0b\x9e\x7d\xc6\xdc\x27\x04\xc1\xe7\xf7\x53\x81\x00\x69\x3e\xe6\xee\x9a\xa4\x49\x92\xd5\x81\x34\xd7\xd6\x82\x6e\xd9\x9a\x5b\x7f\xec\x9f\x96\x37\x28\x33\x41\x4b\x17\x44\xd6\xf5\xe0\xad\x0d\x80\x6c\x40\xa9\xf7\x64\x5d\xc3\xb6\xda\x11\xd6\x49\xd0\x75\x96\x1c\x9d\x89\xf6\x0f\x78\xb3\x4a\xd4\x73\x89\xe3\xe1\xa7\x26\x4b\x2a\x51\x65\xca\xa8\xdd\x24\xee\xd1\x4f\x2f\x87\x4f\x00\x5c\x41\xa7\x9d\x11\x1d\x4c\xd7\x76\x2c\x69\xd3\x74\x3f\xeb\x78\x66\x9e\x84\xac\x3c\x80\x76\xd9\xf8\x07\xdc\x50\xa9\xc4\x73\x32\xc8\x8f\xe1\x40\x4a\x9c\x0c\xd2\xe1\xb1\xd9\x7e\x30\x19\xe4\xf9\x6e\xab\x25\x83\x54\xbe\x1d\xf8\x39\x70\x6e\xe9\x35\xfb\x34\x12\xc7\xf7\x15\x2d\x72\x14\x29\xf4\xf8\x8c\x73\x5e\xbd\xee\x91\xf3\x22\x49\x8c\x01\x0f\x93\xd7\x50\x5f\x93\x40\x42\x8a\xd0\x9d\x61\x5c\x96\x29\xc9\x55\xc6\x75\xe7\x10\x1d\x1c\x9a\x28\x6d\x40\x4b\x8b\xe0\x56\x99\x4d\x49\xc2\x56\xa1\xdd\x0c\x86\xba\xe2\x9e\xb3\x78\x70\xe1\xc3\x02\xb6\x7c\x8f\x4f\x28\x4c\x15\x30\x23\x0c\x04\x96\x05\xc9\x10\xa8\xd2\x7a\xd3\xaf\x85\x76\x95\x8a\x66\x55\x41\x04\x54\x92\x6c\x50\xe3\x1c\xe1\xc8\xc8\x29\xec\xa9\x5f\x25\x8a\x3b\x22\x65\x34\x87\x72\x96\x8e\xf3\x6a\x99\x18\x49\xd9\xcf\x12\x93\xf5\xa9\xdf\x84\x98\xc6\x58\xb2\x72\xf2\x1e\xdf\xff\xf6\x72\xfb\xa8\x89\x7f\x81\xd0\x46\xca\x16\xe7\xd9\x96\xf5\xf5\xdf\x90\xec\xc6\x38\xeb\xca\xce\xcb\xec\x5e\x1f\x9b\xf9\x8b\x24\x37\x55\xbc\xb1\x35\xfc\xe9\x4a\x0a\x08\xe3\xb6\xb4\xdf\x21\x6d\x7d\x43\xf3\xa1\x99\x5f\xf3\xa2\xe0\x7b\x7d\x12\xed\xe8\x0e\x41\xfb\x67\x79\x11\x0e\x14\x87\xf0\xaa\x28\xee\x51\x50\x03\x5f\xb4\x68\x01\xde\x9a\x20\xec\x67\xcc\x29\xf9\xa8\x3d\xfb\x64\x12\x7e\x88\xbc\xa1\xbf\xec\xac\x1f\x96\x4e\x0e\xb2\xed\x1d\x69\x87\xed\x50\x5e\xf8\xc3\xd9\x6e\xc9\x1b\x3a\xfe\x09\xb6\x47\x22\x8d\x5e\x2c\x12\x25\x2b\x4d\x93\x8c\x09\x27\x04\x71\x1d\xb1\xf8\xfd\x02\x6a\x4b\x14\x28\xf2\x19\xa5\x3e\x13\x04\xd3\xb4\x12\x96\x9b\xdc\x63\xcf\x45\x6e\x1e\x6c\x14\x66\xc5\xe9\x62\x35\x8b\x8a\x2a\x28\x51\xe8\x43\xd3\x86\x38\xad\x35\xdb\x0c\xa8\x3d\x04\x92\xc9\xe0\x72\xcc\xc7\x98\x60\x12\x4e\x8b\x26\xa1\x1b\x4e\xc6\x33\xdb\x80\xf2\x50\x3c\x17\x67\x21\x5f\x2c\x44\xe2\xbd\xd2\x99\x62\x7b\x24\x12\x73\xe0\x1a\x00\xf8\x54\x21\x8a\xfb\xcd\x9d\x18\xcd\x31\xf7\x2e\x2c\x4a\x13\x4e\x13\xf1\x3f\x59\xb4\x6d\x7e\xf1\x85\x72\x65\x40\xb2\x0c\xa5\x8c\xe4\xab\x9d\x5a\x51\xa0\x9d\xcb\xd7\x26\x9c\xa6\x02\x73\x9f\x9a\xbc\x86\x0e\xba\xd9\x85\xc5\xdd\xd7\x81\x0b\xe3\x4f\x35\xf1\x4e\xc6\xf4\x75\x35\x31\x78\x38\x90\xbf\x84\xb8\xa6\xcd\x3c\x3c\xa7\xd2\xcb\x5e\x47\xde\x82\x17\x30\xbf\xba\xfe\x69\xf5\xe1\xfb\xab\xeb\xd5\xd5\xf7\x57\xd7\x29\x3c\x3e\xbb\xa9\xda\xaf\x06\x3d\xc5\xc2\xb1\x0a\x6b\xe5\x8c\x79\x47\x21\x5d\xb4\xf1\x41\x68\x5f\x8d\xf1\x32\x75\x05\x7d\xb8\xf6\x6b\x6d\xf0\x2b\x15\x7f\x41\xa2\x92\x86\xed\xb6\x20\xe6\xf2\x90\x70\x00\x8d\xa6\x4d\x61\x7a\xd2\xa9\x4e\x7f\x05\x0a\xcf\xa8\x16\x9f\x00\xb6\xaf\x9f\xd5\x2a\xba\x33\xd3\x09\x70\x46\x8a\x02\x73\x5b\xd0\x21\xee\x5a\x40\xbf\x17\x98\x21\x7d\xc2\x7c\xa1\x65\x23\xd0\xe4\xca\x21\x6a\xdb\x06\xe0\xab\x15\x3c\x56\x2a\x84\x65\x12\x95\x8d\xc5\xf8\x9e\xf9\x5a\x1b\x95\x49\x7c\x51\xd7\xa6\x43\x26\xf5\xb1\x45\x4d\x89\xfe\x0a\xe3\x8d\x7b\x6b\x8c\x33\x6c\x20\x8b\x69\x70\x09\x19\x31\xf0\x88\x6b\x2e\xd0\x28\xf2\x6f\x1f\x3f\xde\xcd\xef\x53\x90\x66\xae\x29\x43\xb9\xf9\x16\x8c\x69\x83\x20\x3a\xda\x90\x46\xf9\x36\x17\x0c\xde\xcd\xec\x90\x0d\x2a\xc0\xdf\x31\xab\xd4\x41\xd8\x52\xf1\xd2\x6e\xc2\xd2\x76\x4a\x08\xb2\x5e\xd3\x2c\x19\xb9\x30\x75\x37\xa0\x49\xa4\x84\x31\x3e\x42\x65\x6d\x9c\x0b\x30\xd3\xf5\x9e\xcd\x39\x43\x0b\xcb\x68\xc3\x6c\xf0\xa2\x00\x92\x29\xfa\x84\xda\x21\x30\x74\xec\xd8\xd9\x68\xcb\x2d\x96\xd6\xde\xf8\x33\xec\xb8\xc0\xa4\x7f\x7b\xdb\x25\xf9\xda\x8a\xc9\xb5\x72\x40\x41\x19\x02\x11\x1b\x93\xfc\xc3\x46\xf0\xaa\x94\xa1\xbc\x4a\x05\xe4\x6d\x81\x42\x1b\xc0\xb5\x5d\xf6\x13\x65\xf8\xde\xbe\xfc\xab\x5d\xf2\xf0\x49\xee\xc9\x66\x39\x31\xee\x70\xeb\x44\x50\x5b\x1f\x65\x98\x43\xc1\x4d\x73\x49\x9c\x5a\xfc\x64\x5f\x85\x9f\x8e\x5f\x5f\x2e\x97\xf1\x9d\x58\x62\x9b\x61\x7e\x95\xf8\x01\x73\x9e\x19\x13\xc8\x5d\x11\xc3\x7a\x06\xa2\x60\x95\xf3\x4c\xda\x66\x86\x79\x5d\x2f\x3f\xd8\xdd\x20\x5c\x21\x70\xb2\x8c\x93\x06\xb0\xf3\x14\xea\xe4\x5f\x06\x4b\x97\x9d\x04\xff\xd2\xde\x65\xb7\x14\xb5\x43\xaf\x4e\x55\x00\x7d\x22\x65\x4a\x54\x9e\xb0\x7b\x54\xfd\xb6\x84\xe0\x4f\xbd\x4b\x28\xfd\xc8\x4e\xc7\xe0\x26\x7c\x3f\x87\xd0\x21\xaa\xf9\x2e\x04\xf5\xfe\x78\x1e\x25\xbf\x5f\x8a\xb9\x84\xb0\x70\xc0\x46\x48\xd7\x7c\x14\x12\x73\x92\xf9\xc1\xd7\xe2\xc4\x63\x7b\x21\x27\x81\xc8\x51\x4e\xee\x4b\xcc\xac\x16\x88\xad\xcc\x99\x98\x6c\x4f\x8b\x02\x1e\xd1\x3a\x8d\x3c\x1c\x6d\x59\x41\x91\x29\xb9\x3c\x93\x0f\x8d\x6b\xa2\x6f\x67\x94\x01\x33\xf5\xd2\x90\xe5\x08\xee\x9b\xcf\x98\xdc\x5f\xc9\x82\xfa\xe6\x93\x3a\x61\x6b\x52\xc3\x3d\xe2\x11\xe3\xe9\x52\xfd\xcf\xb0\x96\xbe\xa9\xbc\x84\x6a\xbf\xc8\x51\xfd\xa3\x2b\x95\xc6\xd4\xfa\x28\x5e\xc7\xe0\x16\xae\x2b\xa8\x9e\x43\xab\x43\x60\x69\x8c\xab\xb0\x07\x89\xf5\x08\x2d\x91\x1f\x1c\x41\x16\x56\xb7\x20\xe2\x8e\x63\x3b\xf2\x44\x0a\x9a\x9b\x7a\xcb\x19\x94\x76\xb1\xcc\x4d\x12\xed\x4f\x05\x07\xdf\xb1\x60\x67\x2c\x5a\x74\x7e\xe0\x7f\xfc\x0b\x7b\xf7\x31\xc9\xd7\xf2\x2a\xcf\x0d\x02\x0f\x39\x82\xe5\x8f\x1c\x07\x0b\xfd\x08\xc6\xca\xf1\xe1\x70\xc8\x1f\xc7\x99\x3a\x47\x0c\x1e\xef\x3c\xee\x07\x79\x22\x02\x2a\x16\x19\x86\x4f\x7f\x0e\x14\xb6\xe8\x7a\x44\x00\x87\x6b\x49\x97\x97\xc0\x68\xe1\xee\x8d\x3a\xf8\x2e\x81\x94\x25\xb2\x7c\x1e\xbf\x5d\x98\x1b\xc5\x69\x78\xe6\x66\x68\x24\x83\x1a\xef\xe5\x39\x9d\xde\x50\x04\x7a\x25\x7a\x3d\xbc\x63\xf4\x4e\xde\x59\x9d\x40\x7a\x9b\xc6\x9e\x43\xf4\xc8\x3d\xef\x28\x27\xed\xdd\xd2\x08\xf6\x90\x83\x68\x08\xc7\x78\xed\xe7\x7c\x53\x2c\x7e\xad\x1c\xf0\x2c\xd5\xbe\x52\xc7\x89\xa3\x61\x4c\x44\x56\x12\x05\xb2\x0e\xf6\x14\xfe\x13\xde\x39\x5a\x9d\x4f\xd5\xee\xc8\xa4\x50\xeb\xf9\x6c\x47\xa5\xd4\x6e\x3c\xf6\x1d\x17\xf0\x17\x39\xf3\x95\x3a\xb9\xfc\x2f\x4e\x59\x9f\xa1\x05\xcc\x52\x4b\x42\x12\xdf\xe1\x26\x4d\xd2\x49\x0c\x7f\x34\xf5\x7f\x13\x5b\x58\x87\x11\xe7\xca\x04\x36\xf4\x09\x59\x94\x49\xd3\xfc\xbc\xc0\x22\x42\x37\x0f\xd0\x6e\x6f\x42\x74\xf4\xc2\x2c\x31\x6e\x15\x1e\x1a\x56\x8b\xce\x72\xdb\x29\xe6\xcb\xc0\xb1\xf6\xbd\xa4\x33\x14\xa2\x28\x1d\xcf\xd0\x35\xd5\x67\xa8\xbf\x9f\xb0\xfd\x23\x67\x9d\xa2\x03\xfc\x73\x07\x2c\xbe\x8b\xd4\x28\x83\x8f\xb8\x37\xe3\xe9\xd8\x5d\x65\xf7\x82\xa3\x3e\x5e\x54\xd2\x82\x92\x3a\x7e\xb9\xb8\x9c\x6c\x01\xee\x00\x4d\xed\x25\x2c\x98\x33\xf4\xe2\xd2\xed\x69\x4f\xb2\xb5\x53\xb9\xa7\x2a\xdb\xda\x29\x75\x74\x75\x7f\x4a\x97\x4f\x46\xa4\xe9\x26\x59\xde\xde\x34\xcd\x6c\xd0\xac\x37\xde\xfd\xe3\xb9\x78\xd0\x28\x3f\xc1\xe5\x88\xda\x87\x77\x8c\x2f\x2a\xee\x85\xe6\x1f\x7b\xb4\x87\xea\x7b\xa8\x14\x46\x2b\x06\x4d\x12\x10\xb7\xae\xb5\x7d\x15\xa7\x39\xf5\x97\x50\x39\x42\x61\xd4\x98\x19\x70\xa7\x1d\xa9\x76\x1a\x4f\x8e\xf5\xfe\x80\x53\xb5\x56\xbd\x53\xba\x15\x7a\x87\xd5\x23\xba\x18\xb9\xc8\x74\x46\x6f\x76\xc6\xc2\x41\x5e\xde\xb2\x05\xbc\x58\x49\xbd\x26\xa2\x6f\x43\x2f\x86\xa8\x2f\x50\x45\xb7\x0b\xe8\x34\x83\x1f\xde\x78\xba\xb8\xf4\x8b\x44\x3a\xd6\x57\xf4\x0d\xc9\xd8\x93\xf7\x42\x59\xbb\x36\x4b\xdb\x6d\xe4\x8e\x66\x47\xb5\x15\x74\xd2\x6f\xd7\x8e\x0e\xcd\x0e\x3c\x1b\xe1\xc7\xb5\xf2\xf1\xf4\xab\x6d\x3f\x3a\xf7\xd0\xb0\xab\xe7\xe9\x48\x35\xfe\x54\xcf\x3f\x71\x44\x76\x8a\xfd\x2f\xe4\x3c\x34\xde\x74\x4e\xd2\x2c\xb4\xe3\x0c\x0f\xd1\x36\x61\x96\xe6\x6b\xb3\x9f\x6f\x7f\xfe\xc1\x3c\xda\xb6\x3a\xb4\xe9\xa0\x40\xa0\x1b\xc6\xb5\xe8\xb6\x28\xf0\xac\x12\x46\x4c\x5b\x5b\x84\x89\x4d\xf9\x40\xb3\x50\x47\xa6\xdd\x74\xe8\xf8\x11\xea\x81\x2c\x4c\x7c\xd7\xa2\x4e\xfd\x71\xfa\xf7\x05\xec\x54\x7b\x9e\x46\xc4\x75\x8e\xd4\x9d\x72\xcf\xd1\x71\x3a\xfe\xc1\xc8\x81\x8b\xf2\xf8\x98\xed\xde\x95\x47\xe7\xad\xf3\x2f\xc3\x29\xe3\xde\xe6\x60\xb2\x76\x52\xf7\x9e\x09\x45\x4d\x08\x9c\x2d\x80\x7f\xd6\xb2\x18\xa2\xe9\x35\x77\x3d\xec\xd4\xa7\xef\xf4\xe4\xb6\x1d\xd1\x50\xbd\x53\x9a\xca\xec\xd5\xb6\x73\xe8\x0f\xeb\x18\x75\x19\xba\xc6\xfe\x48\xa3\x8e\x69\x3b\xd9\xa8\x43\x9a\x1b\x1b\x75\x37\x67\x3e\x6e\xd4\x1e\xc8\xab\x19\x75\xc7\x72\x87\x5f\xe3\x7c\x3b\x86\x1d\x75\x86\x4c\x1e\x28\x13\xc6\x5d\x1e\x33\xee\xa0\xcf\xc3\xc6\x5d\xbe\x9a\x71\xfb\xcf\x56\xda\x5c\x2f\xee\x45\x0c\xb6\x1d\x2e\xd5\xdb\x7c\x6f\x87\x6a\xcb\x73\xd7\x8e\xa2\xb6\xe7\x58\x6f\x8b\x7c\x6e\xa1\x2d\x0c\xa8\x36\x7e\x8b\x69\x59\x98\x36\x48\x1b\x5b\x8c\x16\x0d\x42\x4b\x69\x27\xc5\x8f\x7b\x94\xed\x3d\x8b\x15\x5a\xb5\x33\x51\xac\x4b\x93\x3f\xf2\x5f\xcb\x12\x3d\x19\xa9\x45\xf1\xf7\x69\x6d\x79\x5c\x0f\xd5\xee\xd3\x77\xf0\xa7\xa0\xa7\x29\x6c\x5a\xf7\xc4\xd6\x68\x66\xab\x99\x9b\x6c\xdf\xc0\x6c\xe6\x26\x6d\x4f\xc3\xf7\xa0\xd7\x7d\x6a\x35\x6b\x96\xb5\x07\xb0\x69\xbe\x8d\xe3\x8e\xb6\xe1\x34\xf4\xe6\x1e\xbc\xed\x3e\xb3\xbe\xe8\x50\xcf\xd3\xb1\x8e\xdf\x69\xad\x79\x92\x3a\x4a\x3b\x30\xad\xf3\x9d\x0b\xee\x3f\xf0\x4a\x91\xc7\x02\x3d\xf6\xf1\x7b\x88\xc5\x10\xe2\x42\xa3\xeb\x57\x41\xb4\x5b\x88\xa7\x41\x8b\x59\x0b\xf8\x0c\xa9\xe8\xa0\xcb\x19\xf0\x35\xc9\xb6\x38\x9f\xaa\x20\xb7\xe2\x5b\xad\x20\xe7\xec\xdf\x14\x64\x5a\x65\xe4\x91\x57\xca\xc5\x8f\x7a\x7f\x2f\xe0\xff\x2a\xa9\x5c\xf3\xcd\x16\x0d\x02\xe3\x08\x7d\x3f\x43\x59\x22\x33\x8d\xea\xde\xb3\x8f\x56\xdc\x86\x7c\x8e\x6f\x9f\x43\xdb\xec\xe4\x6f\xaa\x9d\x7d\x1f\x2d\x03\x4e\x13\xf5\xa0\x25\x2c\x28\x53\x6b\x98\xfd\xe5\xb7\x19\xcc\x2b\xbd\x5d\xb5\x0f\x37\xfb\xd5\x7c\x73\xd1\xa3\xfb\x0b\x81\x0d\x98\x1b\xe3\xe8\xc0\x46\x3d\x8e\xe3\xc1\x26\x38\x26\xb5\xd1\x9e\x40\x3b\x86\xa6\x99\xcd\xba\xb5\xd6\x18\x46\x56\x20\x61\x66\xae\x59\x91\xc6\x45\x4f\x7b\x80\x9d\xdb\x3d\x32\xf5\xad\xfe\xc8\x7e\x72\xfb\x61\x64\x4b\x2d\x27\x3f\xcd\x3b\x54\xb4\x35\xb9\xd7\xa1\x72\xe9\xe1\xce\x29\x7f\x17\x2a\x9e\x30\xfa\x1f\x05\x5a\x59\xa1\x5e\xa9\xb8\xbd\x0a\xb5\xdf\x85\xdd\xdd\x02\x7f\x42\x61\x5a\x2b\xf4\xd2\x8c\x30\x78\x44\xa8\x24\xe6\x90\x53\x81\x99\x2a\x9e\x81\x32\x7b\x0e\xfe\xa4\x33\x36\x76\xc5\x72\x83\x60\x3e\xbb\xf8\x8f\x77\xef\xde\xcd\x16\x40\x4a\x6a\x6b\x89\x73\xed\x45\xd2\xb3\x2b\x9f\xf3\x47\xfb\x09\x00\x1c\xfb\x2a\xc0\x79\x8d\xa1\x51\xdf\x32\xaa\x6c\x77\xc6\xc8\x16\x6a\x9a\x65\xf4\x0d\xc2\x9f\x46\xce\xc5\x31\x90\xed\x12\x4f\x5e\xda\x1e\x63\x47\x5a\x06\x7a\xc0\x27\x8c\x47\x27\x99\x8e\xb1\xb6\x23\xa1\x87\xeb\x05\x30\xda\xa5\xd6\x1a\xb4\x4c\x7c\x6f\xcf\x33\xaf\xb4\x01\x18\xa7\x19\x7c\xa5\x35\x05\x6f\x1f\x99\x76\xcc\x8b\xd0\xbe\xa4\xb6\xa8\x83\xa9\x8c\xef\x4a\x2e\xb1\x7f\x84\x12\x0b\x52\x22\xc2\x9a\xaa\x73\x14\x6f\x35\xe6\x4f\x44\x1d\x3d\x4f\xbb\x91\x54\x7b\xb5\x77\x93\xbe\x78\x78\xba\x84\x8f\x8c\xda\xdb\xd5\x90\xc3\x76\x25\x42\xf2\x1c\xe6\x5c\x98\xcd\x20\x68\x8e\x69\xbf\x0d\x9d\x44\x79\xcc\x59\xc9\x49\x9f\x80\x41\xeb\xc3\xa2\x45\x38\xf8\x87\x15\x13\xc7\xe4\x20\x07\xf4\x20\x4d\xce\xe7\x53\xce\xae\x00\x42\xbe\x73\x5c\x00\x9d\x86\xf4\x57\x13\x80\x27\x60\x44\x00\xe5\x54\xdf\xf9\x61\x01\x44\x79\x42\x2c\x00\x0f\xcd\x17\xa2\xf2\xbc\xdd\xcb\x3a\xc4\x27\x79\x1e\xbc\x63\x64\xd3\x8a\x03\xfe\x4e\xa5\x69\x5e\xf3\x5d\x7d\xe7\xd4\xa5\x7a\xe8\xc6\x82\xfa\x05\x1c\xf2\x78\xf5\x69\x81\xf9\xf1\x50\x7a\x28\x37\xe7\x27\xcd\xfa\x17\x05\xda\x51\x16\x76\x60\xba\xa5\xcf\x2d\x81\x4b\xcf\xe5\x7c\xeb\x77\xe4\xff\x07\x00\x00\xff\xff\x05\x90\xb7\x4c\x17\x4a\x00\x00") func templatesServerBuilderGotmplBytes() ([]byte, error) { return bindataRead( @@ -455,12 +622,12 @@ func templatesServerBuilderGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/builder.gotmpl", size: 16812, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x93, 0xde, 0x22, 0x72, 0x72, 0x82, 0xf0, 0x64, 0x30, 0xf4, 0xdf, 0x23, 0x74, 0x41, 0x39, 0x49, 0x20, 0xb3, 0xe7, 0xa, 0x7e, 0xea, 0x2b, 0xd7, 0xb, 0x8b, 0x1, 0x1d, 0xb, 0x1a, 0x93, 0x9e}} + info := bindataFileInfo{name: "templates/server/builder.gotmpl", size: 18967, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xcd, 0x9, 0x7f, 0x2a, 0x86, 0xd5, 0x9a, 0x75, 0x25, 0x2d, 0x98, 0xc0, 0xc2, 0xb3, 0x1, 0xf3, 0x73, 0xa6, 0xe1, 0x1b, 0x6f, 0x95, 0x62, 0xb, 0xb6, 0x3f, 0xe3, 0x6d, 0x3c, 0x4d, 0x3a, 0x5b}} return a, nil } -var _templatesServerConfigureapiGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x58\x4f\x6f\xdb\x38\x16\x3f\xaf\x3f\xc5\x83\xd0\x05\xec\xc2\x96\x81\x3d\x16\xc8\x21\x9b\x74\x3a\xc6\xb6\x13\x63\x1c\xec\x1e\x06\x73\xa0\xa5\x67\x9b\x1b\x8a\xe4\x90\x54\x13\x8f\xa0\xef\xbe\x78\x8f\x94\x2c\xc7\x76\x92\xb6\x58\xcc\xc9\x26\xf9\xfe\xf1\xf7\xfe\x52\xf3\x39\xdc\xef\xa4\x87\x8d\x54\x08\xd2\x83\x17\x1b\x84\x60\x00\x4b\x19\x72\xb8\xd3\x05\x82\x0c\x80\x4f\xd2\x07\x4f\xff\x1e\xa5\x52\xa0\x4d\x80\x35\x82\xf9\x8a\xee\xd1\xc9\x10\x50\x8f\x46\x4d\x03\x72\x03\xf9\x8d\xb1\x7b\x27\xb7\xbb\x00\xb3\xb6\x9d\xcf\xa1\x69\xa0\x30\x55\x85\x3a\x3c\x3b\x6b\x1a\x40\x5d\x42\xdb\x8e\x46\x23\x2b\x8a\x07\xb1\x45\x22\xce\xaf\x97\x8b\x65\x5a\xd2\x99\xac\xac\x71\x01\xc6\x23\x80\xac\x30\x3a\xe0\x53\xc8\xf8\xbf\xdb\xdb\x60\xe6\x41\x79\x5e\x6a\x0c\xf3\x5d\x08\x96\x17\xca\x6c\xb3\xd1\x08\x00\x9d\x33\xce\x43\xb6\x95\x61\x57\xaf\xf3\xc2\x54\xf3\xad\x99\x19\x8b\x5a\x58\x39\x8f\xa7\xc4\xe0\x6a\x1d\x64\x85\x97\x08\xd3\x31\x51\x56\xb2\x2c\x15\x3e\x0a\xf7\x1a\xf1\xfc\x40\x49\x7c\x1e\x8b\xda\xc9\xb0\x7f\x8d\xab\xa3\x63\xf3\x9b\xc6\x09\xbd\x45\xc8\x6f\x71\x23\x6a\x15\x16\x0c\x85\x27\xe8\xac\x93\x3a\x6c\x20\xfb\xfb\x1f\x19\xe4\x6d\xcb\xc4\xa8\xcb\xf4\x2f\xb2\xbd\x7b\xc0\xfd\x14\xde\x7d\x15\xaa\x46\xf8\x70\x05\xf9\x80\x9f\xce\xda\x96\xf0\x1e\x4a\x8a\xb4\x47\xe2\x26\xe4\xd7\x77\x9d\x7f\x48\xca\xd0\x39\x4d\x03\x8f\x32\xec\x20\xff\x84\xfa\xce\x06\x4f\x9b\xf3\xf9\xd6\x7c\xd8\xa2\x46\x27\x02\x82\x7f\x14\xdb\x2d\x3a\x38\x6c\xa0\xfb\x8a\x0e\x66\xb3\x20\xdc\x16\x03\xbb\xfc\x9e\xff\x2e\x45\xd8\x41\xdb\xc2\x6c\xa6\x45\x15\x63\xe1\x17\xfa\xc3\x5b\xde\x62\xc1\x5b\x2b\x8b\x45\xa2\x1c\x35\xcd\x8c\x63\xee\x28\x64\x62\x1c\x6a\x3c\xda\xce\x8c\x25\xf5\xd2\x68\x9f\x45\x81\xc2\xca\xd9\xc5\xb0\xeb\x63\xf3\x10\xa4\x9d\xae\x2f\xa6\x44\x75\x4e\xdb\xd1\x41\x56\xd1\xaa\xd3\xc5\x8b\x23\x6d\xa7\x52\x2e\xe9\x5b\x31\x5e\xe7\x14\x1e\x9f\x64\x0e\x7d\x10\x56\x66\x11\x2e\x3e\x3b\x52\x79\x46\xd0\x25\x9d\x37\x4a\xa2\x0e\xe7\x74\x1e\x9f\x64\x05\x2f\xd3\x2d\xe3\xe2\x48\xe7\x19\x41\x97\x74\xde\x63\x65\x95\x08\x78\x2b\x5d\x14\x17\xd2\xc6\xac\x94\x2e\x46\xc9\x11\xc5\xb1\x84\x94\x28\x77\xbd\x97\xa3\x8c\xde\xeb\x2c\xe0\x12\xd7\xbd\xd8\x26\xfa\x40\xff\xce\x92\x92\x89\x4b\x27\x75\x21\xad\x50\x91\xd8\xf6\x4b\xe2\x18\x1e\x9e\xb2\xa6\x0c\x5e\x15\x3b\xac\x8e\x11\x3d\x3e\xc9\xb8\x86\x45\xf9\x65\x3c\x99\xf9\x78\x44\x4a\xce\x88\x39\x87\x67\xba\x17\x07\x99\x1f\x84\xe0\xc5\xab\x19\x07\x63\xaa\xe9\xf9\x42\x17\xaa\x2e\x91\x39\x27\xc7\x7b\xff\x16\x4a\x96\x22\x18\x37\x49\x19\xf9\x20\x6d\x14\xeb\x5f\x95\xf7\xb3\xd0\xa5\x42\xf7\x4c\xe2\x52\x38\x51\x61\x40\xe7\xe1\xd9\xc9\xaf\xe8\xad\xd1\x1e\xfd\x50\xd7\x21\x85\x4f\xf4\x0d\x79\x57\xb5\xe5\x8e\x71\x60\xf4\x71\xe7\x45\xae\x2f\x42\xea\xc8\x82\x4f\xbc\x31\xab\x84\xd4\xa7\x8e\xfc\x18\x4f\xa9\x0a\x1d\x93\x53\x81\x3a\xe3\xf7\xba\xb2\xb7\x22\x88\xe4\xd1\xba\xb2\xb3\x52\x04\x31\x24\xec\xfe\x6d\x6a\x5d\x40\x61\xf4\x46\x6e\x6b\x87\x3f\x29\xb1\xf5\x63\x61\x25\xbc\x6f\x9a\xae\xe6\xb6\x6d\x4e\x15\x5b\xf8\x42\x28\xf9\x27\xf6\xf5\xf1\x7a\xb9\x98\x40\x33\x02\x98\xcf\x41\x58\x99\xdf\x98\xaa\x12\xba\xfc\x2c\x35\xde\x59\x46\xec\x93\x33\xb5\xf5\x70\x05\xbf\xfd\x4e\x15\xf9\x12\x45\x03\x79\x9e\x43\x3b\x6a\x47\xcf\xcc\xb9\x5e\x2e\xbe\xc9\x18\x0a\xe3\x3c\x79\xbd\xb3\xac\x17\x06\x61\x87\x64\x27\xec\xd0\xe1\x08\xd8\x64\xae\x4e\x1f\xa9\x23\xc3\x55\xea\xdb\x83\xbd\x51\x94\xb0\xc2\x00\x7b\x53\x3b\x28\x6a\x1f\x4c\x05\xca\x70\x6f\xe1\x4c\xc2\x12\xcb\x1c\x52\x82\x80\xd1\x3c\xcc\x28\xb3\xe5\xc4\x0c\x9b\x28\xe0\xe3\x93\xc5\x22\x60\x09\x52\x07\x74\x1b\x51\x20\xd0\x3d\xc7\x3e\x38\xa9\xb7\x53\xba\x7d\x7f\xd2\xb4\x13\x66\xea\x38\x45\x65\x15\x7e\x38\x80\xfc\x39\x2a\xbf\x1a\x2a\xe1\xc6\xd9\xa5\xdf\x8d\xd1\xbe\xae\xd0\xf7\xe9\x4e\x0d\x58\x21\x8d\x42\xb1\x26\xb5\x2d\xc9\x39\x0b\x62\xe2\x25\xf1\x94\xb3\x27\x8c\xb1\x43\x2b\x8f\x6f\x93\x91\xc6\x8b\xce\x24\xf7\x13\x5d\x9a\x6f\xee\x40\x9a\xfc\x57\x14\x25\xba\x29\xa4\x96\x3c\x84\x20\xfa\x82\x5d\x08\xe0\x30\xd4\x4e\x77\xee\xf9\xc5\x84\xde\x2e\x2c\xc7\x59\xd3\xb0\xe6\xb6\x25\x4f\x47\xcd\x3b\xe1\x39\xcb\xf6\x48\xf3\x22\x6a\x90\x07\x86\x8c\xe0\x6d\x27\xc3\xb9\xe5\xf0\xaf\xc3\x70\xe9\x4c\x59\x17\xdf\x87\x61\xe2\xfd\x21\x0c\x07\x32\x3a\x0c\xbb\xad\x03\x86\x8f\x84\xe1\x7f\x9c\x0c\x84\x21\xa5\xf7\x8f\x23\x68\x3b\xbd\x3f\x8c\xe0\x2a\x4d\x94\xb7\xb8\x91\x5a\x76\xbd\x91\x8d\xe9\x8a\xd4\xc2\xff\x53\x78\x59\x5c\xd7\x71\xaa\xe2\x08\xbf\xb6\x56\x49\xf4\xf0\xb8\x43\xcd\xf9\x4a\xa7\xc6\xc9\x3f\x23\x7a\x3b\x8e\x18\x7e\x2f\x60\x88\x33\x20\x11\xb1\x1c\x88\x0d\x2b\x25\xf6\x31\xac\x8b\x5b\xaa\x10\xa4\xe8\x2a\x66\x5e\xed\xd1\x41\x97\x7e\x56\x78\x9f\x16\x13\x18\x37\x4d\xaa\xd1\x63\xc0\x3f\x86\x0d\x36\x1b\xc0\x9b\xc1\xa4\x6d\xdf\x0f\xfa\xe0\x81\xae\x6d\xa7\x11\xe8\xc9\x31\xf8\x5a\xaa\xe9\x25\x0f\xac\xf9\x02\x82\x0c\x24\x03\x92\xc1\x93\x37\xb8\xa1\x47\x94\x22\x2a\xc1\x7a\xbd\x5c\xfc\x0b\xf7\x2f\xe3\x9a\x0d\xe6\xdc\x2c\x0e\x6a\xa6\x76\x05\x8f\xbd\x11\xde\xb7\x01\x19\xcc\x03\xea\xbf\x16\x3c\x2a\xe9\x0f\xb8\x8f\xf0\x0d\xd1\x3b\xc4\xf5\xc6\x99\x8a\x96\xf1\x8e\x14\xe8\x34\x03\xc0\x6f\x03\x10\x7e\xff\x4e\xb0\xef\x08\x8d\x7f\x44\xa0\xbf\x11\xaf\x29\xf8\xc2\x58\xf4\xd4\x1d\xff\x4a\x00\x8d\xe0\x2b\xac\x51\x38\x74\xa7\x30\x7e\x0b\x2e\x71\xa6\x38\xb3\x88\x6f\x8a\xb3\x35\xe1\x7c\x93\x15\x29\xf1\x5f\x6c\xb4\xdd\xbb\x35\xef\xca\x04\x96\xe3\xc9\xc5\x9e\xdb\x95\xd2\x9e\xd8\xbd\xd8\x69\xaf\x97\x8b\x03\x25\x5c\x5d\x54\xf6\xec\xae\x27\x6f\x82\xb6\x95\x9b\x14\x1a\x69\xf8\xee\x5e\x26\xdd\x03\x97\x9f\xd6\x87\xa0\x59\x1e\x76\xb9\xb0\x9e\x6d\x11\xdd\x94\x73\x75\x45\xbe\x4d\xce\xfe\xff\x69\x81\xd7\x27\xb0\x44\x7b\x68\x50\x9c\x64\xfe\x0d\x9c\x3c\x91\x7b\x36\x7c\x00\x2e\x85\xf2\xf0\xb1\xf3\xa3\x89\x91\xee\x39\x19\x7c\x4d\xc9\xe3\xc4\x5f\x62\xd7\x28\xfb\x7c\x19\xd0\x9c\xa4\xcb\xe0\x75\xf7\x02\xd4\xa7\x08\xe7\x47\xf8\xa7\xd2\xf4\x6a\x76\x51\xaf\x4d\x49\xd6\x35\xda\xe1\xf0\xea\x56\xbb\x3a\x94\xe6\x51\x77\x15\x66\x02\x0d\x51\x8f\xfa\xab\x78\x0c\xb5\xfd\xa4\xcc\x5a\xa8\x2f\xfd\xad\xc6\xbd\x80\x31\x9f\x1f\x4e\xfc\x64\x42\x83\x38\x7f\xa0\x43\xb8\xff\xbc\xea\x27\xe8\x78\xe9\x35\x6e\x8c\x43\xf8\xf9\xfe\x7e\xb9\xea\x3e\xab\xf8\x20\x5c\xf0\xf9\xb3\xe9\xfd\xfe\xf3\x6a\x1c\x94\xbf\xe1\x35\xbc\x0f\xca\xe7\xf1\x7f\xff\x6a\xf8\x22\x1e\x10\x84\x52\xa0\xb1\x40\xef\x85\xdb\x43\xb1\xa3\xfc\xf1\x10\x0c\xf7\xa9\x53\xfd\x34\xbd\xe7\xc9\xc2\x6b\x0f\xde\x18\x0d\xc2\x77\x96\x48\x0f\x5c\x5b\x18\xe4\x12\xd6\x75\x60\x74\x5d\xad\x09\xe1\x29\x04\xfe\xe8\x58\xeb\x82\x65\xf1\x57\xc5\x35\x42\x21\x94\xc2\x32\x27\x91\x8b\x0d\x95\x21\x2e\x38\x64\x43\x65\x4a\xb9\xd9\x83\x48\x46\x4c\xc1\x07\xba\x7d\xa7\x4d\xfb\x20\x74\xc1\x5f\x2e\x7d\x30\x16\x24\x8d\xb1\xa5\xfc\x2a\xcb\x5a\x28\xb5\x07\x25\x78\x3a\x63\xad\xd2\xf3\x8d\xac\x12\x05\xe6\xa3\xfe\x03\x68\x67\x4b\x21\xf4\xc1\x14\xa8\x6a\x15\xa4\x55\x08\x54\xb1\xfc\x14\x4a\xb4\xa8\x4b\xa9\xb7\x60\x62\x03\xd7\x75\xb5\x46\x07\x66\xc3\xb6\xd0\x41\x9c\x7f\x3c\x8b\x4e\x8f\xf7\xf8\x11\xae\xbb\x25\xcd\x4c\xa2\x28\x8c\x23\x39\x6a\xff\x21\x3d\xfb\xa7\xf1\xd7\x67\xf4\x7e\xce\x6a\x2d\x9f\xb2\x67\x8e\x8c\x81\x36\xf6\xf0\x9e\x1f\x58\x71\x39\x4d\x4a\xa6\x20\xca\xd2\xf5\x23\x40\x33\x08\x9e\xc1\x67\xcb\x63\x1f\xd2\xbd\x8d\xe3\x7b\xec\x52\x85\xc1\x27\x2c\xea\x40\xed\x89\x58\x3d\x42\x69\xd8\x73\xc2\x5a\xb5\xef\xa2\x21\x7d\xd6\xcb\xff\xeb\x8d\x86\xd2\x14\x35\xe5\x49\x7e\x46\x5d\x94\x86\x1e\xc4\x26\xa0\x03\x67\xea\x40\x10\x51\x38\xa4\xf8\xa5\xfe\x82\x3a\xc8\x82\x2d\x9a\xc2\x5a\x46\x78\x85\x2e\x09\x36\x59\xf2\x7e\x04\xe2\x79\x86\x8c\x3b\xa3\x87\xef\xcd\x93\xd7\xe7\xdf\x52\xfe\x25\xe2\xb7\xe0\xb2\x13\xd6\xa2\xf6\xbd\x8d\x7a\x1f\x76\x3c\x28\x70\x00\x0d\xd8\x84\xf2\x86\xa1\x91\x31\x55\xba\x18\x78\x19\xa4\x95\xe9\x23\x51\xc0\xd6\x98\x32\x06\x23\x09\xb0\xaa\xde\x82\xd4\x20\xc0\x0a\x2d\x8b\x68\x34\x49\x3c\x28\x9d\xf2\xc3\xb7\xc3\xa8\xc2\xe0\x64\xe1\x07\x00\x9d\x94\x98\xef\x44\xe9\x7f\x01\x00\x00\xff\xff\xa7\xba\xf9\xd2\x1b\x18\x00\x00") +var _templatesServerConfigureapiGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xc4\x58\x4b\x93\xdb\xb8\x11\x3e\x47\xbf\xa2\x4b\xb5\x07\xc9\x25\x51\x55\x39\xba\x6a\x0e\x13\xdb\xeb\x55\xc5\x5e\xab\xac\x71\x72\xd8\xda\x03\x44\xb6\x24\x64\x40\x00\x01\x40\xcf\x68\x59\xfc\xef\xa9\x6e\x80\x14\x25\x51\x33\xb3\x99\x4d\xf6\x44\xe2\xd5\x8f\xaf\x1f\xe8\xc6\x62\x01\x77\x7b\xe9\x61\x2b\x15\x82\xf4\xe0\xc5\x16\x21\x18\xc0\x42\x86\x0c\xbe\xe8\x1c\x41\x06\xc0\x47\xe9\x83\xa7\xbf\x07\xa9\x14\x68\x13\x60\x83\x60\xbe\xa3\x7b\x70\x32\x04\xd4\xa3\x51\x5d\x83\xdc\x42\xf6\xce\xd8\x83\x93\xbb\x7d\x80\x79\xd3\x2c\x16\x50\xd7\x90\x9b\xb2\x44\x1d\xce\xd6\xea\x1a\x50\x17\xd0\x34\xa3\xd1\xc8\x8a\xfc\x5e\xec\x90\x36\x67\xb7\xab\xe5\x2a\x0d\x69\x4d\x96\xd6\xb8\x00\x93\x11\xc0\x38\x37\x3a\xe0\x63\x18\xf3\xbf\x3b\xd8\x60\x16\x41\x79\x1e\x4a\xc3\x1f\x65\x76\xfc\xd5\x18\x16\xfb\x10\xec\x78\x44\xa3\x9d\x0c\xfb\x6a\x93\xe5\xa6\x5c\xec\xcc\xdc\x58\xd4\xc2\xca\x05\x3a\x67\x5c\x3c\x3d\xbc\xc1\x55\x3a\xc8\x12\x9f\xdf\xb1\x28\x65\x51\x28\x7c\x10\xee\x25\x9b\x3d\xe6\x95\x93\xe1\xc0\xb2\x11\x6a\xac\xa1\x87\xec\x3d\x6e\x45\xa5\xc2\x32\x8d\x9b\xe6\x6c\xbd\xb7\x30\x65\xbc\x1f\x64\xd8\x43\xf6\x11\xf5\x17\x1b\xa7\x17\x8b\x9d\x79\xbb\x43\x8d\x4e\x04\x04\xff\x20\x76\x3b\x74\x70\x9c\x40\xf7\x1d\x1d\xcc\xe7\x41\xb8\x1d\x06\x86\xfb\x8e\x7f\x57\x22\xec\xa1\x69\x60\x3e\xd7\xa2\x8c\x76\xf8\x99\x7e\x78\xca\x5b\xcc\x79\x6a\x6d\x31\x4f\x3b\x47\x75\x3d\x67\x7b\x9f\x98\x2b\xfa\x80\xc6\x93\xe9\xb1\xb1\xc4\x5e\x1a\xed\xc7\x91\xa0\xb0\x72\x7e\xd5\xe4\x9d\x5f\x1c\x1d\xa4\xe5\xf5\xd9\x14\xa8\x86\xb8\x9d\x2c\x8c\x4b\x1a\xb5\xbc\x78\x70\xc2\xed\x92\xca\x35\x7e\x6b\xc6\x6b\x88\xe1\xe9\xca\xd8\xa1\x0f\xc2\xca\x71\x84\x8b\xd7\x4e\x58\x0e\x10\xba\xc6\xf3\x9d\x92\xa8\xc3\x10\xcf\xd3\x95\x71\xce\xc3\xa4\x65\x1c\x9c\xf0\x1c\x20\x74\x8d\xe7\x1d\x96\x56\x89\x80\xef\xa5\x8b\xe4\x42\x9a\x98\x17\xd2\x45\x2f\x39\xd9\x71\x4a\xc1\x09\xbd\x43\xc8\xbe\x74\x56\x8e\x34\x3a\xab\x33\x81\x6b\xa7\xee\xc4\x2e\xed\x0f\xf4\x37\xb8\x95\x44\x5c\x39\xa9\x73\x69\x85\x8a\x9b\x6d\x37\xa4\x13\xfd\xc5\xcb\xa3\x29\xac\xd6\xf9\x1e\xcb\x53\x44\x4f\x57\xc6\x9c\x30\x22\xfd\x22\xae\xcc\x7d\x5c\x22\x26\x03\x64\x86\xf0\x4c\x7a\xb1\x93\xf9\x9e\x0b\x5e\x55\xcd\x38\x98\x50\x3e\xcd\x96\x3a\x57\x55\x81\x7c\x72\x7a\x3a\xf7\x0f\xa1\x64\x21\x82\x71\xd3\x14\x91\xf7\xd2\x46\xb2\xfe\x59\x7a\x3f\x09\x5d\x28\x74\x67\x14\x57\xc2\x89\x12\x03\x3a\x0f\x67\x2b\x5f\xd1\x5b\xa3\x3d\xfa\x3e\xaf\x63\x08\x5f\xf0\xeb\x9f\x5d\x57\x96\xb3\xf5\xf1\xa0\x8f\x33\x4f\x9e\xfa\x2c\xa4\x8e\x47\xf0\x91\x27\xe6\xa5\x90\xfa\xd2\x90\x1f\xe2\x2a\x65\xa1\xd3\xed\x94\xa0\x06\xec\x5e\x95\xf6\xbd\x08\x22\x59\xb4\x2a\xed\xbc\x10\x41\x0c\x84\x79\x70\x32\x0f\x51\xef\x82\x10\x89\xe2\xf3\xec\xdc\x75\xd3\xfd\x83\xed\xdf\xb6\xd2\x39\xe4\x46\x6f\xe5\xae\x72\xf8\xa3\x12\x3b\x3f\x11\x56\xc2\x9b\xba\xce\x52\xe8\x35\x4d\x56\xd7\x60\x85\xcf\x85\x92\xbf\x61\x97\x58\x6f\x57\xcb\x29\xd4\x23\x80\xc5\x02\x84\x95\xd9\x3b\x53\x96\x42\x17\x9f\xa4\xc6\x2f\x96\xa1\xfe\xe8\x4c\x65\x3d\xdc\xc0\x2f\xbf\x52\x2a\xbf\xb6\xa3\x86\x2c\xcb\xa0\x19\x35\xa3\x33\x71\x6e\x57\xcb\xdf\x25\x0c\xf9\x7f\x96\xdc\xa5\x95\xac\x23\x06\x61\x8f\x24\x27\xec\xd1\xe1\x08\x58\x64\x4e\x6b\x1f\xe8\x1a\x85\x1b\x88\xd7\x69\x6f\x6e\x14\x29\xac\x31\xc0\xc1\x54\x0e\xf2\xca\x07\x53\x82\x32\x7c\x29\x71\x08\x62\x81\x45\x06\x29\xb2\xc0\x68\xae\x40\x94\xd9\x71\x44\x87\x6d\x24\xf0\xe1\xd1\x62\x1e\xb0\x00\xa9\x03\xba\xad\xc8\x11\x48\xcf\x09\x19\x48\xef\x66\xa4\x7d\xb7\x52\x37\x53\x3e\xd4\x9e\x14\xa5\x55\xf8\xf6\x08\xf2\xa7\xc8\xfc\xa6\xcf\x24\x29\xf3\xcd\xe3\x3a\x5e\x98\xdf\x96\x93\x48\x05\xee\x0c\x01\x10\xa4\xae\x10\x2a\x2f\xf5\x0e\x1c\x16\x26\x07\xe1\xa3\x4a\xdf\x96\x33\xa8\x74\x5b\xdf\x10\x42\x5b\xa3\x94\x79\xa0\x9d\x4a\x6a\x3c\x32\xfe\xe6\xf1\x2b\x1d\x9d\x4c\xd3\xad\x9f\xf2\xc4\x3b\xa3\x7d\x55\x62\xba\xed\x69\x25\xfa\xe4\x92\x04\x27\xaa\x31\x85\xf2\x2a\xd1\x19\xb4\x5e\x22\x42\x7a\x51\x96\x19\x3a\x1b\x29\xa3\xf2\xf8\x72\x5a\xa9\x60\x69\x65\x74\x3f\x12\xea\x0c\xbd\x03\x69\xb2\xaf\x28\x0a\x74\x33\x48\xc5\x44\xdf\x06\xd1\x19\xd8\x87\x00\x1c\x86\xca\xe9\xd6\x3f\x7e\x36\xa1\x93\x0f\x8b\xc9\xb8\xae\x99\x73\xd3\x10\xd2\x91\xf3\x5e\x78\xce\x0f\x07\xa4\x2a\x13\x35\x55\x40\xed\x81\x31\x59\x86\x8d\x9c\x34\x8a\x71\x78\x31\x68\xf1\x5d\x39\x53\x54\xf9\x2b\xf1\x4d\x44\xfe\x10\x7c\x7b\xb4\x5a\x7c\xdb\xa9\x23\xbe\x0f\x84\xef\x3f\x9d\x0c\x84\x2f\x25\xad\xd7\xa3\x6b\x5b\xbe\xaf\x41\xf7\x0c\xdc\x75\xaa\x64\xdf\xe3\x56\x6a\xd9\xde\xfd\xa7\x38\xfb\xbf\x09\x2f\xf3\xdb\x2a\x56\x8d\x1c\x0f\xb7\xd6\x2a\x89\x1e\x1e\xf6\xa8\x39\x68\x68\xd5\x38\xf9\x5b\xc4\x73\xcf\x7e\xc5\xbd\x08\x86\x58\xe3\xd2\x26\xa6\x03\xf1\x42\x1e\x01\x11\xbf\xc4\x78\xf9\x9e\x72\x19\xf1\xba\xb9\x01\x2d\x55\xc2\xe8\xc9\x8d\x31\x99\x54\x1e\x1d\xb4\x19\xc5\x0a\xef\xd3\x60\x0a\x93\xba\x4e\xf7\xd5\x04\xf0\xdf\xfd\x62\x63\xdc\x33\xca\x18\xa6\x4d\xf3\xa6\x57\x13\x1c\xf7\x35\xcd\x2c\x9a\x67\x9a\xc4\xe9\x8c\xa6\xa5\x9a\x5d\xb3\xdc\x86\xd5\x15\x24\x22\x89\x90\x44\x9e\x3e\x6f\x3e\x00\x82\xf9\xcc\x27\xa3\x29\x6e\x57\xcb\xbf\xe3\xe1\x69\x5b\x8c\x7b\xb5\xff\x38\x16\xaf\xa6\x72\x39\xb7\x02\xd1\x24\x7f\x3c\xf8\xc1\xdc\xa3\xfe\xb3\x01\xa7\xbb\xed\x1e\x0f\x11\xf2\x3e\xe2\xc7\x18\xda\x3a\x53\xd2\x30\x22\x42\x41\x45\x55\x14\xfc\xd2\x83\xec\xd7\x57\x19\xe8\x0b\xa1\xf2\xd7\x68\x9c\xff\x21\xc6\x33\xf0\xb9\xb1\xe8\xa9\xb0\xf8\x73\x41\x37\x82\x15\xde\xa0\x70\xe8\x2e\xa1\xff\xfd\x58\x5e\xb9\x0e\xda\x7e\x6e\x30\x5f\x0d\xd7\x29\x22\x25\xa5\x27\x6b\x95\xb6\x97\xcf\xda\x14\x86\x45\x5b\x3b\x0c\x94\x2d\x6d\xc2\xef\x36\xbb\x27\x8b\x95\xdb\xd5\xf2\xb8\x13\x6e\xae\x32\xbb\xd0\xf5\x87\xb6\x0f\x7c\x7b\x03\x59\xef\x31\x25\xae\x0e\xf5\x6b\x27\xfe\x96\xba\xa3\xf6\x60\x47\x8d\x9b\x97\x9e\x8f\x0d\xf7\x96\x97\x57\x5e\x5b\x52\x0e\xb9\xec\x53\xbc\x2e\x59\xbd\x98\x53\xe7\x10\xed\xc9\x5b\x25\x05\x29\x9a\xd1\xe4\xd5\x83\xc7\x1b\x98\x23\x3b\xf6\xa3\x2f\xa3\xc0\x0d\x95\x3f\x3a\xdb\x0f\xed\xbb\xcc\x50\x7b\x71\x72\x45\x1e\xad\x49\x31\xd4\xef\x6c\x5f\x1b\x91\x75\xcd\x77\x36\xa7\xb0\x67\x1a\x80\x4e\xbc\x36\x7a\x53\xf0\x3e\x7f\xf2\x2c\xa4\xa3\x43\xf6\x2a\xa1\xff\xab\xa2\xc7\x87\xb8\xec\x42\xa3\x56\xa5\xde\x9e\x8b\x74\x74\xf2\x66\xd1\x57\xfc\x4c\xef\xa6\x79\x3e\x37\x25\x59\xe7\x09\x05\x2e\xab\xce\x52\x53\x2a\x14\x57\x0e\xe3\x0b\xd1\x7a\x5f\x85\xc2\x3c\xe8\x36\x69\x4f\xa1\xa6\x33\xfd\x76\xeb\x89\x3d\x49\x3f\x8f\xa1\xb2\x1f\x95\xd9\x08\xf5\xb9\x53\x75\xd2\x11\x98\xf0\xfa\x71\xc5\x4f\xa7\xd4\x3a\xf2\x3b\x30\xc2\xdd\xa7\x75\xd7\xf3\x45\x24\x36\xb8\x35\x0e\xe1\xa7\xbb\xbb\xd5\xba\x7d\x41\xf4\x41\xb8\xe0\xb3\xb3\x7e\xf3\xee\xd3\x7a\x12\x94\x7f\xc7\x63\x78\x13\x94\xcf\xe2\x7f\xd7\xe7\x7e\x16\xf7\x08\x42\x29\xd0\x98\xa3\xf7\xc2\x1d\x20\xdf\x53\x3a\xf2\x10\x0c\x97\x1f\x97\xfc\xa9\xdf\xcc\x92\x84\xb7\x1e\xbc\x31\x9a\xfa\xaf\x24\x89\xf4\xc0\xa9\x9c\x6d\x53\xc0\xa6\x0a\x6c\x14\x57\x69\x32\xcc\x0c\x02\xbf\x6d\x57\x3a\x67\x5a\xfc\x78\xbd\x41\xc8\x85\x52\x58\x64\x44\x72\xb9\xa5\xac\xcf\xf9\x9d\x64\x28\x4d\x21\xb7\x07\x10\x49\x88\x19\xf8\x40\xda\xb7\xdc\xb4\x0f\x42\xe7\xfc\x40\xee\x83\xb1\x20\xa9\xef\x29\xe4\x77\x59\x54\x42\xa9\x03\x28\xc1\x25\x3b\x73\x95\x9e\x35\xb2\x4a\xe4\x98\x8d\xba\x77\xf6\x56\x96\x5c\xe8\xa3\x28\x50\x56\x2a\x48\xab\x10\xe8\x82\xf0\x33\x28\xd0\xa2\x2e\xa8\x8f\x34\xb1\x2e\xd3\x55\xb9\x41\x07\x66\xcb\xb2\xd0\x42\x2c\x85\x3d\x93\x4e\xef\x54\xdf\x85\xaa\xb0\xd3\x92\xca\x67\x91\xe7\xc6\x11\x1d\x75\x78\x9b\x5e\xb8\x66\xf1\xeb\xc7\x60\x1c\x8c\x2b\x2d\x1f\xc7\x67\x86\x8c\x8e\x36\xf1\xf0\x86\x9f\x04\xe2\x70\x96\x98\xcc\x40\x14\x85\xeb\xaa\xb5\xba\xe7\x3c\xc7\xc8\x3a\xb3\x21\xe9\x6d\x1c\xeb\xb1\x4f\x29\x1a\x1f\x31\xaf\x02\xd5\x04\x74\xd4\x23\x14\x86\x2d\x27\xac\x55\x87\xd6\x1b\xd2\x0b\x76\xf6\x2f\x6f\x34\x14\x26\xaf\x28\xbc\xb2\x01\x76\x91\x1a\x7a\x10\xdb\x80\x0e\x9c\xa9\x02\x41\x44\xee\x90\xfc\x97\xae\x73\xd4\x41\xe6\x2c\xd1\x0c\x36\x32\xc2\x2b\x74\x41\xb0\xc9\x82\xe7\x23\x10\xe7\x11\x32\x69\x85\xee\xbf\x90\x5c\xbc\x97\xfc\x25\xc5\x5f\xda\xfc\x12\x5c\xf6\xc2\x5a\xd4\xbe\x93\x51\x1f\xc2\x9e\xeb\x33\x76\xa0\xde\x31\xa1\xbc\x61\x68\x64\x0c\x95\xd6\x07\x9e\x06\x69\x6d\x3a\x4f\x14\xb0\x33\xa6\x88\xce\x48\x04\xac\xaa\x76\x20\x35\x08\xb0\x42\xcb\x3c\x0a\x4d\x14\x8f\x4c\x67\xfc\x54\xd3\x62\x54\x22\x5d\x63\xbe\x07\xd0\x45\x8a\xf9\x2f\x51\xfa\x4f\x00\x00\x00\xff\xff\x11\xfc\x88\xee\x82\x1a\x00\x00") func templatesServerConfigureapiGotmplBytes() ([]byte, error) { return bindataRead( @@ -475,12 +642,12 @@ func templatesServerConfigureapiGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/configureapi.gotmpl", size: 6171, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xbb, 0x96, 0xda, 0x4, 0x85, 0x1a, 0xb7, 0x14, 0xb9, 0x13, 0x38, 0x8c, 0xf2, 0x58, 0xa9, 0x26, 0xad, 0x62, 0xb7, 0xa3, 0x32, 0x55, 0x1, 0x46, 0xc7, 0xc5, 0x1, 0xf8, 0x60, 0x6c, 0xb9, 0x33}} + info := bindataFileInfo{name: "templates/server/configureapi.gotmpl", size: 6786, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x80, 0x9, 0x27, 0xe2, 0x95, 0x78, 0x35, 0xb1, 0x73, 0x83, 0xa2, 0xd, 0x6e, 0x5, 0x7d, 0x1e, 0xbf, 0xbd, 0x6b, 0xa5, 0x4b, 0xd5, 0xf2, 0x6a, 0x86, 0x1b, 0xa3, 0xa5, 0x56, 0x85, 0x2e, 0x5d}} return a, nil } -var _templatesServerDocGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x54\x4d\x8f\xdb\x20\x10\xbd\xf3\x2b\xe6\xbc\x52\xf0\xdd\xad\x2a\xb5\xc9\x4a\x8d\xb4\xdd\x44\xdd\xb4\x77\x6a\x4f\x1c\xd4\x00\x11\x90\xae\x52\xc4\x7f\xaf\xf8\xb0\xc3\xe2\xa4\xd2\x9e\xec\x79\xf3\xe6\xbd\x61\x3c\xa6\x69\x60\xa9\x7a\x84\x01\x25\x6a\x66\xb1\x87\x5f\x17\x18\xd4\xc2\xbc\xb2\x61\x40\xfd\x01\x56\x1b\x78\xde\xec\xe0\x71\xb5\xde\x51\x42\x88\x73\xc0\xf7\x40\x97\xea\x74\xd1\x7c\x38\x58\x58\x78\xdf\x34\xe0\x1c\x74\x4a\x08\x94\xb6\xca\x39\x07\x28\x7b\xf0\x9e\x10\xd2\x3c\x90\x2d\xeb\x7e\xb3\x01\x03\x9f\x7e\xde\xae\xc7\xd0\x7b\xc8\xc2\x6b\xb9\x57\x74\xc7\xed\x31\x80\x81\x55\x03\x78\x34\xf9\xed\x70\x16\x4c\xf2\xbf\x08\xf4\x99\x09\x4c\x66\x28\xfb\x98\x9b\xa4\x56\x68\x3a\xcd\x4f\x96\x2b\x19\x9a\x98\x14\xe7\x78\x6a\xf3\x4d\x1b\xa8\x85\xd9\xec\x5f\x50\xff\xe1\x5d\x30\x25\x11\x81\xcd\x1e\x32\xd6\x92\xab\xe2\x9c\x5d\x89\x2a\x0d\xf4\xa5\x3b\xa0\x40\x03\xf4\xab\x32\x16\xe8\x17\x66\x70\xcb\xec\x21\x49\xe4\x9a\xe0\x3f\xf2\xbc\x27\x00\x00\x39\x6c\xc3\x94\x34\x93\x03\xce\x18\x00\xce\xd1\x62\xdc\xf5\x81\xa2\x5f\xe6\x86\xf7\x28\x35\xa2\x35\x79\x6a\x2b\x17\x8c\x71\x2a\x2a\xb2\xa9\x30\x3e\x5f\x79\x71\x8c\xac\xf3\x13\xb5\xc9\x03\x0e\x32\x39\x4c\x2a\xd7\x5c\xed\xfe\xc4\x3b\x94\xf1\x23\xc7\xaa\x1c\xb6\xf0\x36\x9d\x3e\x7a\xda\x91\x12\x4a\xab\x74\x4b\x90\xfe\xf8\xfe\x54\x15\x4c\xc8\xed\xa1\x2d\x95\xb4\xac\x9b\xe6\x96\xc3\xa9\x93\x1c\x97\x9d\xcc\xa1\x5b\x82\xf4\x51\x30\x7e\x04\xef\x3f\x96\x35\x23\xf8\xe9\x5e\x55\xea\x16\xca\x9a\xff\x1c\xa0\x96\x30\xe7\xbc\x2e\xe3\x59\x22\xd0\x5e\x37\xaa\xe4\x04\xca\x22\x3a\x7d\xc3\x9e\xb3\xdd\xe5\x14\x7f\x30\x92\x16\xed\x8e\xc9\x56\xab\xfe\xdc\x15\x26\x23\x50\x98\x94\x9c\xf7\x99\x5c\x7f\x27\x92\x2f\xa7\x56\xa0\x65\xe4\xa1\x21\xa7\x7b\xb7\x0a\xf9\x17\x00\x00\xff\xff\x2c\x04\xd8\xf5\xdf\x04\x00\x00") +var _templatesServerDocGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x94\x4f\x8f\xda\x30\x10\xc5\xef\xfe\x14\x23\x4e\xed\x01\x73\x4f\xab\x4a\x5b\x58\xa9\x48\xdb\x05\x95\xb4\x77\x37\x19\x82\xd5\xc4\x46\xb6\xe9\x8a\x45\xf9\xee\x95\xff\xae\x63\x40\x55\x0f\xbd\x65\x9e\xe7\x3d\xff\x86\x0c\x59\x2c\x60\x29\x5b\x84\x0e\x05\x2a\x66\xb0\x85\x9f\x67\xe8\xe4\x5c\xbf\xb0\xae\x43\xf5\x01\x56\x1b\x78\xde\xd4\xf0\xb8\x5a\xd7\x94\x10\x72\xb9\xcc\x81\xef\x81\x2e\xe5\xf1\xac\x78\x77\x30\x30\x8e\x64\xb1\x80\xcb\x05\x1a\x39\x0c\x28\x4c\x71\x66\x0d\x28\x5a\xfb\x48\x6c\xe3\x96\x35\xbf\x58\x87\xd6\x40\x1f\xb6\xeb\x58\x8e\xa3\x55\x6c\xf2\x5a\xec\x25\xad\xb9\xe9\xad\x98\xc7\x96\x07\xd8\xeb\xa2\xe5\xdd\xe1\x34\x30\xc1\x5f\x11\xe8\x33\x1b\xf0\xbd\x3b\x45\xd1\x3a\xc4\x84\xee\x72\x56\xa8\x1b\xc5\x8f\x86\x4b\x11\x26\x80\xab\xbb\xf2\x9e\x19\xc0\xac\x18\x67\x92\x57\xa3\x1a\xf4\x66\xbf\x43\xf5\x9b\x37\x18\x23\x9d\x0a\x9b\x3d\x04\xbd\x72\xea\x8d\xab\x0a\xfb\xcc\x36\xdd\xb9\x4f\x2a\xa0\xbb\xe6\x80\x03\x6a\xa0\x5f\xa4\x36\x40\x3f\x33\x8d\x5b\x66\x0e\x3e\xcc\xf6\xda\x2b\x3c\x5d\x6c\x0d\x44\xa1\xac\x88\xc7\x98\x83\x62\xa2\xc3\xab\x36\x87\x48\x7d\x92\xef\x0b\x10\x37\x0a\x7b\x8b\xe3\x08\x5e\xfb\x5c\x39\x7f\x54\xef\x98\x12\x76\x30\xc6\xda\x9b\xf3\xd3\x14\x90\x9e\x5f\xf8\x74\xdc\xb7\xd4\x1f\xa8\x74\xf6\x56\x43\xe9\x33\xb3\xb3\xab\xb9\xde\x12\x9e\x78\x83\x42\xa7\x97\x18\xca\x2a\x2e\x68\xa8\xdd\x8a\xf9\xfd\x9b\x48\x7e\x93\x7d\x6c\xe1\xf8\xfe\xed\xa9\x30\x24\xa5\xc0\xb8\x41\xb5\x94\xc2\xb0\x26\xfd\xca\xa1\x4c\x54\xa1\xce\xa9\xae\xa5\x09\x55\x3c\x7e\x1c\x18\xef\x61\x1c\x3f\xe6\x9e\x28\x7e\xba\xe7\xf2\xe4\x90\x7b\xfe\x3a\x4c\xb1\xcc\xc5\xff\x68\x29\x85\x3e\xa5\x1d\x8c\x43\x3a\xa9\x22\x93\x65\xcd\x3b\x8b\x3d\x7e\xe8\xfb\x1d\x2a\xce\x7a\xfe\x8a\x2a\x5b\xe7\xb9\x23\xfd\x8a\x2d\x67\xf5\xf9\x88\x30\xff\x77\xbe\xad\x92\xed\xa9\x99\xf0\x45\xa9\xe0\xcb\x3b\xff\x3f\x9f\x67\x09\x1f\xec\x6a\x40\xc3\xc8\xf1\xde\x47\x96\xfc\x09\x00\x00\xff\xff\xd1\x23\x8f\xf6\xf0\x05\x00\x00") func templatesServerDocGotmplBytes() ([]byte, error) { return bindataRead( @@ -495,12 +662,12 @@ func templatesServerDocGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/doc.gotmpl", size: 1247, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x7b, 0xee, 0x9c, 0xf5, 0xc6, 0x25, 0x6a, 0xc6, 0x8d, 0x3d, 0x62, 0x9d, 0x29, 0x7d, 0x93, 0xd6, 0x99, 0x6f, 0x82, 0x8d, 0xdd, 0xbf, 0x29, 0xb8, 0xa0, 0x50, 0x2f, 0xb8, 0x1c, 0xbd, 0xb1, 0xaa}} + info := bindataFileInfo{name: "templates/server/doc.gotmpl", size: 1520, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x1f, 0x54, 0x22, 0xf5, 0xb6, 0xf8, 0x73, 0x9d, 0x94, 0x4a, 0xad, 0xb4, 0xa6, 0x5d, 0xc9, 0xb9, 0xce, 0xf8, 0x9c, 0x99, 0x26, 0xa7, 0x96, 0x89, 0xbe, 0x1f, 0xa6, 0xf5, 0x50, 0xc2, 0x4c, 0xb7}} return a, nil } -var _templatesServerMainGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\x5b\x6f\xdb\x36\x14\x7e\x16\x7f\xc5\xa9\xd0\x01\x52\xe7\x48\x2b\xf6\x96\xc2\x0f\x41\x2e\x9d\x87\x34\x0e\xe0\xf4\x61\x58\x87\x82\x91\x8e\x64\x2e\x32\xa9\x91\x54\xdc\xcc\xd0\x7f\x1f\x78\x89\x4d\xdf\xd2\x6c\x41\xd0\x01\xcd\x4b\x1c\xf1\x1c\x7e\x3c\xfc\xce\x8d\x27\xcf\xe1\x58\x94\x08\x35\x72\x94\x54\x63\x09\xd7\x77\x50\x8b\x03\x35\xa7\x75\x8d\xf2\x1d\x9c\x8c\xe1\x62\x7c\x05\xa7\x27\xa3\xab\x8c\x10\x02\x8b\x05\xb0\x0a\xb2\x63\xd1\xde\x49\x56\x4f\x35\x1c\xf4\x7d\x9e\x9b\xe5\x42\xcc\x66\xc8\xf5\x86\x6c\xb1\x00\xe4\x25\xf4\x3d\x21\xa4\xa5\xc5\x0d\xad\x11\x66\x94\x71\x42\xd8\xac\x15\x52\x43\x42\x00\xe2\x46\xd4\xb1\xf9\x15\xca\xfe\x70\xd4\xf9\x54\xeb\x36\x26\x04\xa0\x11\xb4\x54\x10\xd7\x4c\x4f\xbb\xeb\xac\x10\xb3\xbc\x16\x07\xa2\x45\x4e\x5b\x96\x5b\x61\x4c\x22\x6f\xd6\x47\x85\xef\xc5\x44\xcb\xae\xd0\x67\x0d\xad\x15\xf4\x7d\x65\x7f\xc3\xed\x7f\xa2\x52\x78\x5b\xde\x18\x1c\x2b\x35\x67\x7a\x3b\x0f\xfa\xde\x7d\x78\xb4\xcb\x10\x66\x0d\x45\xb5\xd5\xdb\x9f\xf3\xd6\xac\x3f\xb0\xff\x7e\x7b\xbc\x43\x8f\xd8\x4f\x49\x79\x8d\x90\x9d\x60\x45\xbb\x46\x8f\x2c\x29\xca\xf0\xd6\x4a\xc6\x75\x05\xf1\x0f\x7f\xc5\x90\x79\x58\xe4\xa5\xff\xcf\x6d\x7b\x7d\x83\x77\x03\x78\x7d\x4b\x9b\x0e\xe1\x70\x08\x59\xb0\xdf\xc8\xfa\xde\x1c\x18\x22\x39\xdd\x35\xb8\x94\x90\x3c\x87\xab\x29\x53\x50\xb1\x06\x61\x4e\xd5\x7a\x3c\xe8\x29\x82\x0f\x08\xd0\x42\x34\x99\xd1\xff\x40\x6f\x10\x54\x27\x11\xb8\xd0\xa0\x05\x88\x5b\x94\x73\xc9\x34\x82\x5e\x42\xd1\x4a\xa3\x84\x3b\xd1\x05\x80\x4c\xc3\x35\x16\xb4\x53\x08\xb4\x69\x8c\x50\x02\x96\x4c\x2b\x98\x8b\xae\x29\xe1\x1a\xa1\x11\x4a\xbf\x22\x9e\xc5\xd3\x2f\x45\xd3\x95\x38\x69\xb1\x30\x61\x54\x75\xbc\x00\xc6\x99\x4e\x52\x58\xdc\x87\x47\x76\x54\x96\xe7\x82\x96\x28\x93\x6a\xa6\x55\xf6\xdb\xd1\x87\xf3\x0f\x54\x17\x53\x94\x03\x58\xae\x9c\x88\x22\x25\x3d\x09\x42\xd2\x82\x99\x70\xf4\x60\x3b\x1c\xef\x96\xcc\x1d\x37\x2d\x81\x7b\x52\xcc\xc2\x00\x50\x4a\xe3\x02\x67\xcf\xe9\xec\x1a\xcb\x12\xcb\x64\xb1\x80\xec\xe8\x72\x74\xe9\x43\xbf\xef\xb3\x89\xdb\xf4\xeb\x64\x7c\x31\x80\x6d\xf1\x59\x43\x75\xa0\x92\x12\x30\xe7\x1b\xf0\x57\x43\xe0\xac\xb1\x76\x9a\x6b\xd7\xd9\x19\xd5\xb4\x69\x78\x82\x52\x1a\xb5\x7e\x15\x5e\xd6\xba\x5b\x2a\x41\xa1\xbc\x45\x09\x6f\x76\x98\xe1\x24\x79\x0e\xb3\xa5\x27\x0d\xad\xc0\x14\x14\xb4\x69\xb0\x24\x24\x32\x51\x9b\x7d\x54\x66\xcb\x10\x0c\x59\x9e\x27\x30\xa4\x66\x67\x36\xb0\x12\xa1\xb2\x89\x2e\x51\xca\x01\xc4\x56\xf7\xf0\x13\x8f\x53\x12\x45\x7b\x74\xac\x95\x25\x55\x53\x94\xec\x6f\x84\xec\x82\xce\x8c\x45\x07\xde\xd6\xdf\xc7\x97\x57\xa3\xf1\xc5\xe4\x8f\x4f\xdc\xe2\xd8\xe3\x34\xd3\x8d\x8d\x70\xef\xa1\x11\xaf\xc4\xd2\x39\xf6\x2b\xbb\xb2\x2a\x76\x6d\x2d\x75\x36\x85\xd8\x28\x5c\x6d\x5d\xf7\x69\x1c\xaf\x14\x02\xe7\x66\xe6\x4f\x92\x06\x50\x4b\x9e\xd7\xfe\x79\x06\xe4\xbe\xdf\x4b\xa4\xe5\xe4\xc7\xd8\xd3\x14\x45\x25\xaa\xe2\x61\x8a\x4e\x50\x15\x92\xb5\x9a\x09\xbe\x8f\xa8\x2d\x95\xa7\x5e\x2a\x00\x7c\x16\xd2\xf6\xe3\xdb\x24\xb0\xd9\x63\x99\x79\x35\x84\x38\x86\x05\x89\x42\x3e\xab\x90\x50\xa3\x16\xf0\xb9\xce\x7c\xc3\x43\x55\x9b\x18\xc7\x62\x36\xa3\xbc\x3c\x67\x1c\x4d\xda\xd6\x36\xf8\x55\x92\xa6\xc4\xec\xcd\x73\x68\xa9\x54\x68\xcb\xe7\xf1\xf9\xc8\xee\x51\x3e\xa7\x2e\x8d\x24\x49\xc9\xaa\xe6\x6c\x17\x17\x97\x0e\xc3\x1d\x35\xe2\x02\xe7\x2e\x7d\x13\xce\x9a\xf4\xc1\x42\x64\xa9\x52\x5a\x32\x5e\x27\x0e\xd1\x2e\xa5\xff\xb2\xae\xd0\x96\xb9\xd0\xca\xbc\x19\xce\x0a\x13\x42\x54\x15\xb4\x09\x13\xf9\xe8\x72\x94\x04\x06\xa5\xcb\xbb\x64\x13\xd4\x46\x48\x5b\x96\xfa\x5a\xe5\x7c\x4b\x20\x72\x07\xfc\x37\x7c\x43\x75\x8d\xfa\x9e\xb1\x39\xd3\x53\x4b\x36\xd8\x5e\x67\x5b\x51\x83\x25\x88\x4e\x93\xe8\x51\xac\x06\x06\xba\x62\x1a\x95\x58\xa1\x5c\x5e\x63\xda\xe9\x52\xcc\xb9\xf1\x9f\x07\xcc\x8e\x05\xaf\x58\xdd\x49\x34\xd6\xa5\x24\xf2\xdc\x1e\x0e\x57\x77\x97\xb7\x98\xa4\xef\xd6\x29\x8f\xa2\x2d\xc2\x4d\xec\x84\x65\x7c\xcf\xd3\x66\x4f\xca\xac\x02\xe7\xf0\xeb\x91\x13\x7a\xe0\x7f\xd7\xcc\x9e\x1a\x75\xd1\xe3\x78\xf0\xbe\xde\xe3\xe0\xe0\xad\x00\x2e\x9d\x2d\xa0\x4d\x65\x03\x62\xf3\x58\xfa\xcc\x1a\xf8\x75\xff\x96\x4b\x97\x5b\xb2\xc9\x54\x48\x1d\x96\xd6\xef\xb2\x91\x2d\xe9\x38\x17\xbc\x7e\x2c\x1b\xdf\x5d\xcf\x5a\xa6\xfc\x9e\x37\xe7\x46\xbd\xb1\xc5\x20\x31\xb1\x56\x09\x09\x9f\x07\x20\x5a\xad\xde\x4b\xd1\xb5\x26\x50\xdd\x98\x40\x5b\x16\x36\xab\xb1\x3d\xd9\x29\x29\x9f\x82\x9f\x97\x39\xef\x7d\x74\x54\x96\x56\x21\x59\xe2\x6d\x45\x71\x70\xd6\xa6\x4b\x43\x91\x3f\x2e\xbd\xef\xc6\x5b\xe9\xbf\xb3\x00\xb8\xbe\xb3\xfe\xa6\x35\x55\x75\xcb\x50\xdf\x4a\xb7\x0a\x6b\x61\xe6\xda\xc3\x21\xbc\x25\x91\xd9\x57\xe1\x00\xc4\x8d\x59\x40\x29\xb3\xe4\x8d\x4b\xd5\x53\x29\x85\x4c\xdf\x19\x89\x7d\x19\x58\xc5\xec\xea\xae\x45\x18\xde\xa7\xf9\xa9\x94\xbf\x60\xd3\x3a\x05\x07\x3b\x84\x9f\xcc\x47\xef\x5f\x09\x42\x65\xa7\x5f\x98\x4e\x8c\xcc\x16\xf0\x07\xba\xfa\xf3\x76\xea\x67\x6a\xd5\xfb\xda\x5f\xe8\x9c\x1d\xb1\xe9\x7a\xe1\xca\xfe\xaf\x75\xc3\x47\x0e\x36\x9b\xf3\xf5\xcb\x90\xf6\x32\xa4\x7d\xeb\xde\xf6\x32\xa4\x7d\xc3\x21\x6d\x73\x18\x9b\xa0\x1e\x77\xba\xed\x02\x4f\xb8\x96\xe2\x66\x2f\x83\xe9\xdf\x68\xa6\x73\xbe\x0c\x6b\x2f\xc3\xda\x13\x86\xb5\xf0\xe8\x9e\xfc\x13\x00\x00\xff\xff\x26\xd4\x1f\xcf\x51\x17\x00\x00") +var _templatesServerMainGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x57\x4d\x6f\xe3\x36\x13\x3e\x8b\xbf\x62\x56\xc0\x0b\x48\xfb\x3a\x52\x17\xbd\x65\xe1\x43\x90\x8f\xad\x8b\x6c\x1c\xc0\xd9\x43\xd1\x2d\x16\x8c\x38\x92\xd9\xd0\xa4\x4a\x52\xf1\xa6\x86\xfe\x7b\x41\x8a\xb6\xe5\x8f\xa4\x2e\x82\xa0\x8b\x6e\x2e\x71\xc4\x19\x0e\x87\xcf\x7c\x3c\x9c\x3c\x87\x53\xc5\x10\x2a\x94\xa8\xa9\x45\x06\xb7\x0f\x50\xa9\x23\x33\xa7\x55\x85\xfa\x3d\x9c\x8d\xe1\x6a\x7c\x03\xe7\x67\xa3\x9b\x8c\x10\x02\x8b\x05\xf0\x12\xb2\x53\x55\x3f\x68\x5e\x4d\x2d\x1c\xb5\x6d\x9e\xbb\xe5\x42\xcd\x66\x28\xed\x96\x6c\xb1\x00\x94\x0c\xda\x96\x10\x52\xd3\xe2\x8e\x56\x08\x33\xca\x25\x21\x7c\x56\x2b\x6d\x21\x21\x00\x71\x39\xb3\xb1\xfb\x15\xaa\xf2\xbf\x12\x6d\x3e\xb5\xb6\xf6\x1f\xca\xc4\xc4\xfd\x56\xdc\x4e\x9b\xdb\xac\x50\xb3\xbc\x52\x47\xaa\x46\x49\x6b\x9e\x0b\x45\x99\x89\x49\x14\x1c\xfb\x64\xf0\x83\x9a\x58\xdd\x14\xf6\x42\xd0\xca\x40\xdb\x96\xfe\xb7\xbf\xfd\x77\x34\x06\xef\xd9\x9d\xb3\xe3\xa5\xee\x9c\xe0\xe9\x51\xdb\x76\x1f\xc1\xda\x75\xdf\xcc\x86\x15\x53\x97\xef\x7e\xcc\x6b\xb7\xfe\xc4\xfe\xe5\xf6\x78\x8f\x5e\x50\xf4\x40\x18\xc8\xce\xb0\xa4\x8d\xb0\xa3\xf0\xbd\x32\xb4\x94\xf7\x04\x29\x21\x79\x0e\x37\x53\x6e\xa0\xe4\x02\x61\x4e\xcd\x66\x0c\xed\x14\x21\x04\x11\xac\x52\x22\x73\xfa\x1f\xe9\x1d\x82\x69\x34\x82\x54\x16\xac\x02\x75\x8f\x7a\xae\xb9\x45\xb0\x2b\x53\xb4\xb4\xa8\xe1\x41\x35\x3d\x83\xdc\xc2\x2d\x16\xb4\x31\x08\x54\x08\x27\xd4\x80\x8c\x5b\x03\x73\xd5\x08\x06\xb7\x08\x42\x19\xfb\x86\x84\x7b\x9f\x7f\x2d\x44\xc3\x70\x52\x63\xe1\xbc\x2d\x1b\x59\x00\x97\xdc\x26\x29\x2c\x08\x80\x8f\x59\x76\xc2\xd8\xa5\xa2\x0c\x75\x52\xce\xac\xc9\x7e\x39\xf9\x78\xf9\x91\xda\x62\x8a\x7a\x00\xab\x95\x33\x55\xa4\xa4\x25\xbd\x34\xf2\xc6\x5c\x0a\x05\x63\x7b\x42\x45\x00\xdc\xfa\x91\x13\xb8\x9b\x6e\xfb\x03\x4b\x68\xdc\xc2\x00\x50\x6b\x38\x1e\x06\xaf\xce\x67\xb7\xc8\x18\xb2\x64\xb1\x80\xec\xe4\x7a\x74\x1d\x92\xb6\x6d\xb3\x49\xb7\xe9\xe7\xc9\xf8\x6a\x00\xbb\xe2\x0b\x41\x6d\x4f\x25\x25\xe0\xce\x77\xc6\xdf\x0c\x41\x72\xe1\xbd\x75\x97\xaf\xb2\x0b\x6a\xa9\x10\x32\x41\xad\x9d\xda\xda\xe1\xe5\x25\x01\xee\xa9\x06\x83\xfa\x1e\x35\xbc\xdd\xe3\x4a\x27\xc9\x73\x98\xad\x62\xea\x00\x06\x6e\xa0\xa0\x42\x20\x23\x24\x72\x19\x97\x7d\x32\x6e\xcb\x10\x1c\x6c\x01\x31\x70\xf0\x66\x17\xb5\xe6\xd2\x26\xca\x64\x13\xcb\x50\xeb\x01\xc4\x5e\xf7\xf8\xb3\x8c\x53\x12\x45\x8f\xe8\x78\xc0\x19\x35\x53\xd4\xfc\x4f\x84\xec\x8a\xce\x9c\x47\x47\xc1\xd7\x5f\xc7\xd7\x37\xa3\xf1\xd5\xe4\xb7\xcf\xd2\xdb\xf1\xc7\x59\x6e\x05\x3a\x88\x43\xac\x46\xb2\x54\xe0\x7b\xc3\xf2\x2b\xbb\xf1\x2a\x7e\xcd\x9f\x59\x42\xfc\xbf\x3f\xe2\x5d\x21\x0a\x83\xeb\xad\x9b\x71\x8d\xe3\xb5\x42\x2f\xc0\x99\xfb\x93\xa4\x3d\x53\xab\x6c\xda\xf8\xe7\x05\x2c\xb7\xed\xa3\x40\x7a\x4c\xfe\x1f\x07\x98\xa2\x88\xa1\x29\x9e\x86\xe8\x0c\x4d\xa1\x79\x6d\xb9\x92\x8f\x01\xb5\xa3\xf2\xdc\x4b\xf5\x0c\xbe\x08\x68\x8f\xdb\x0f\x55\xcc\x4b\xf0\xc8\xbc\x19\x42\x1c\xc3\x82\x44\x7d\x3c\xcb\x3e\xa0\x4e\xad\x87\xe7\x26\xf2\x42\xf6\x55\x7d\x61\x9c\xaa\xd9\x8c\x4a\x76\xc9\x25\xba\xd2\xad\x7c\xf2\x9b\x24\x4d\x89\xdb\x9b\xe7\x50\x53\x6d\xd0\x37\xd2\xd3\xcb\x91\xdf\x63\x42\x4d\x5d\x3b\x49\x92\xf6\xdb\xcc\x76\x8b\x71\x3d\xa6\xab\x88\xe1\x9e\x56\x71\x85\xf3\xae\x82\x13\xc9\x45\xfa\x64\x3f\xf2\x68\x19\xab\xb9\xac\x92\xce\xa2\x5f\x4a\xff\x61\x7b\xa1\x35\xef\xb2\x2b\x0b\x6e\x74\x5e\xb8\x2c\xa2\xa6\xa0\xa2\x5f\xcb\x27\xd7\xa3\xa4\xe7\x50\xba\xba\x4b\x36\x41\xeb\x84\xb4\xe6\xeb\xcb\x87\x08\x13\x02\xd1\xb3\x0e\x71\x90\x57\x68\x97\xb0\xcd\xb9\x9d\x7a\xd0\xe1\x9e\x8a\x06\x3d\x39\x09\x64\xa0\x1a\x4b\xa2\x83\xa0\xdd\xf4\xb2\x6b\xac\x11\xc3\x12\xf5\xea\x3a\xd3\xc6\x32\x35\x97\x49\x4a\x96\x36\xb3\x53\x25\x4b\x5e\x35\x1a\x9d\x83\x29\x89\x02\xc6\xc7\xc3\x35\x06\xfa\x1e\x93\xf4\xfd\x26\xf4\x51\xb4\x03\xbc\x4b\xa3\x35\x6f\xf5\x89\x6a\xe3\x85\xb2\x49\x57\x7b\xa8\xaa\xbb\xeb\xf1\x41\x79\xb4\x19\x92\x6f\x8f\xe7\x9e\x9b\x89\xd1\x61\x68\x84\xd0\x3f\x16\xec\x5d\xb6\xf5\xb5\xee\xcd\xfa\x3a\x77\xa6\x7c\x91\xeb\x50\x73\x83\xb0\x1e\x9e\x68\xe9\x6a\x4b\x36\x99\x2a\x6d\xfb\x7d\xf7\xbb\x64\xb9\x15\x1c\x97\x4a\x56\x87\xa2\xf1\xdd\x11\xda\x01\xef\xd2\xad\x26\xe4\x3b\x84\xcf\xd8\x52\x69\xf8\x32\x00\x55\x5b\xf3\x41\xab\xa6\x76\xb9\xaa\xa9\xac\xd0\x15\x54\x9f\xcc\xc6\xfe\xf0\x4e\xc9\x84\x5a\xfc\xb2\x2a\xfe\x10\xa6\x13\xc6\xbc\x42\xb2\xb2\xb7\x93\xc8\xbd\xb3\xb6\xa3\xda\x17\x85\xe3\xd2\x25\x5b\xef\xf4\x81\xbd\x9d\xa0\x23\xa5\xdd\x77\xaf\x6b\xb7\x3b\xce\x06\xba\xdd\xe9\xb8\x85\x9b\x5c\x8f\x87\xf0\x8e\x44\x6e\x5f\x89\x03\x50\x77\x6e\x01\xb5\xce\x92\xb7\x5d\xc5\x9e\x6b\xad\x74\xfa\xde\x49\xfc\xeb\xc1\x2b\x66\x37\x0f\x35\xc2\x70\x59\xed\xe7\x5a\xff\x84\xa2\xee\x14\x3a\xb3\x43\xf8\xc1\x7d\xb4\xe1\x25\xa1\x4c\x76\xfe\x95\xdb\xc4\xc9\x7c\x67\x7f\xba\x65\xbf\x2c\x9b\xbf\x10\x9d\x1f\xde\x2d\xf7\x53\xe5\xfa\x0a\x7f\x47\x96\x4f\xbc\x53\xf6\x13\xe6\x1e\xa2\xdc\x57\x3f\xdf\x20\xe1\x6d\x81\xf7\x3a\xd7\xfd\x57\x18\xef\x75\xae\xfb\x17\xe7\xba\xed\xf9\x6d\x82\x76\xdc\xd8\xba\xe9\x45\xa2\xeb\x5b\xdd\xb8\xe6\x6c\x86\x97\x9b\x23\xd3\x83\xe7\xbb\xd7\x01\x6f\x63\x9a\x78\x9d\xef\xb6\xe7\xbb\x3e\x5f\xb5\xe4\xaf\x00\x00\x00\xff\xff\x88\xa0\xc7\x7a\x4d\x17\x00\x00") func templatesServerMainGotmplBytes() ([]byte, error) { return bindataRead( @@ -515,12 +682,12 @@ func templatesServerMainGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/main.gotmpl", size: 5969, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xde, 0x50, 0x3a, 0x42, 0xa1, 0xc1, 0x64, 0xa8, 0x5b, 0xcc, 0x8d, 0xa, 0x1d, 0x38, 0x6b, 0xa7, 0x97, 0x56, 0xae, 0xff, 0xba, 0xbd, 0x52, 0x2c, 0x8a, 0x6d, 0x57, 0xc4, 0x38, 0xcb, 0xfd, 0x7b}} + info := bindataFileInfo{name: "templates/server/main.gotmpl", size: 5965, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x18, 0x3a, 0x5f, 0x4, 0xcb, 0x2, 0x79, 0xa2, 0x38, 0x87, 0x61, 0x77, 0x5c, 0xac, 0x21, 0x9c, 0xa5, 0x9d, 0x1c, 0xa0, 0xc9, 0x41, 0xba, 0x52, 0xc2, 0x20, 0x9f, 0x9b, 0x64, 0x2c, 0xab, 0x8f}} return a, nil } -var _templatesServerOperationGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x57\x4d\x6f\xdb\x46\x13\xbe\xf3\x57\xcc\x2b\xe4\x0d\x48\x41\x26\xef\x0e\x7c\x48\xed\x14\xf1\xa1\x89\xe0\x08\xed\xb1\x58\x2f\x87\xe4\xc2\xe4\x2e\x3d\xbb\xb4\xac\x08\xfc\xef\xc5\x7e\x50\x26\x15\x4a\x2a\x5a\xb4\xe8\xc9\x96\x76\x3e\x9f\x79\xe6\x43\x59\x06\xb7\x2a\x47\x28\x51\x22\x31\x83\x39\x3c\xee\xa0\x54\x57\x7a\xcb\xca\x12\xe9\x03\xdc\x7d\x85\x2f\x5f\x37\xf0\xe9\xee\x7e\x93\x46\x51\xb4\xdf\x83\x28\x20\xbd\x55\xed\x8e\x44\x59\x19\xb8\xea\xfb\x2c\x83\xfd\x1e\xb8\x6a\x1a\x94\xe6\xe8\x6d\xbf\x07\x94\x39\xf4\x7d\x14\x45\x2d\xe3\x4f\xac\x44\x2b\x9c\xae\xc3\xff\xf6\x21\xcb\x60\x53\x09\x0d\x85\xa8\x11\xb6\x4c\x4f\x83\x31\x15\x42\x88\x06\x8c\x52\x75\x6a\xe5\x3f\xe5\xc2\x08\x59\x82\x39\xe8\x35\xce\x63\x4b\xea\x05\xa1\xe8\x8c\x33\x55\xa1\x84\x9d\xea\x80\xf0\x8a\x3a\xe9\x2c\x0d\xa6\x5d\xb8\x4c\xe6\x51\x24\x9a\x56\x91\x81\x38\x02\x58\x70\x25\x0d\xbe\x9a\x85\xfd\x5f\xa2\xc9\x2a\x63\x5a\xf7\x41\x1b\x12\xb2\xd4\xee\xff\xa2\x31\x8b\x28\x02\x40\x22\x45\x1a\x16\xa5\x30\x55\xf7\x98\x72\xd5\x64\xa5\xba\x52\x2d\x4a\xd6\x8a\xcc\xbf\x5a\x85\x46\xe4\x79\x8d\x5b\x46\x78\x4a\x96\x3a\x69\x44\x83\xd9\x9b\xa4\xd5\xd3\xc8\x3b\x12\x66\x77\x49\x6b\x90\x73\x3a\x86\x8a\xc6\x9c\xd2\xf0\xaf\x56\xee\x85\xd5\x22\xb7\x30\x9c\x90\x1c\xde\x9d\xcd\x2d\x2b\x4f\x5a\xdc\xb2\xd2\x81\xb1\xdf\x03\x31\x59\x22\xa4\x77\x58\xb0\xae\x36\xf7\x0e\x56\x0d\x8e\x02\x2d\x09\x69\x0a\x58\xfc\xff\x79\x01\xa9\xad\xb9\x53\x08\xc4\x18\x29\xbf\x7b\xc2\xdd\x0a\xde\xbd\xb0\xba\x43\xb8\xbe\x81\x74\x62\xc5\xbe\x42\xdf\xc3\x91\xc1\x20\x7e\x64\x35\x71\xbc\xb2\xa2\x4c\x73\x56\x8b\xef\x08\xe9\x17\xd6\x58\xb9\xcf\x4c\xe6\x35\xd2\xcf\x9d\xe4\x60\x3a\x92\x1a\x18\x14\x9d\xe4\x46\x28\x09\x5b\x61\x2a\xc7\x14\x4f\x61\x2d\x4a\xc9\x4c\x47\x08\x42\x1a\x05\xcc\x5a\xac\xba\x86\xc9\xb1\x41\xa8\xbc\xc5\xc8\xec\x5a\xbc\xec\xd3\xfa\x8a\x67\xa5\xd6\x8c\x58\xa3\x43\x8f\x7d\xec\x4c\xa5\x48\x7c\x47\x9b\xcf\x0a\xfc\xb7\x52\x19\x88\x01\x9f\x21\x5d\x93\x90\x5c\xb4\xac\x86\x85\x90\x06\xa9\x60\x1c\xf7\xfd\x02\x12\xe8\xfb\xe5\x01\x07\xd7\x6b\x07\xc9\x51\x3f\x26\x23\x5e\xa6\x0f\xa8\x5b\x25\x73\x24\x07\x9a\x8f\x15\xf0\x15\x79\x17\xba\x0c\x81\xf0\xb9\x43\x6d\x80\xc9\x1c\x08\x2d\x6c\xf6\x85\x01\x39\x55\x8d\x91\xcd\x0a\xe2\x42\x5e\xcc\x3f\x09\x0e\xe2\xd6\x65\x3b\x2f\x7f\x0e\x89\xf6\x90\xcf\xbf\x82\x09\xec\x23\x08\x29\x43\x21\x43\xd4\x17\x22\x7b\x33\x19\xf5\x17\x89\x08\x87\x58\xa1\x50\x04\xa6\x62\x06\x38\x93\x81\x55\xbe\x57\xe7\x79\xe7\x63\xb9\x4c\xbb\x91\x07\x9b\x4c\xc0\xff\x3f\x4a\x41\x0f\xd8\x17\xdc\xce\xc6\x07\x9c\x90\x19\xb4\x3d\x2b\x71\x0b\x76\x42\xa7\x43\x96\x1e\x3d\x9c\xc7\x4a\xb5\x76\xf0\x0b\x25\x3d\x53\x4f\xd9\x8f\xb9\x79\x85\xe5\x28\xb0\x5b\xbf\x13\x56\x43\x93\x9f\x05\x3a\x81\xe5\x7c\xd4\x23\x0e\xbd\x9f\x95\xd8\x07\x3f\xd7\xc0\xcd\xeb\x2a\x94\x88\xae\x07\xaf\xbd\x83\xe5\x84\xf1\xb0\x1e\xaf\x49\x75\xc6\xaf\xd7\x5f\xd0\x54\x2a\x0f\xc3\x32\x5d\x33\x53\x79\xe0\xc3\x8c\xde\xb0\x52\x0f\x8f\xe3\x8a\xb8\x3d\xce\x1a\x9c\x98\x3f\x2c\xfd\x6f\x5d\xd3\x30\xda\x85\x92\x4e\x3e\xd9\xe7\x3b\xd4\x9c\x44\xeb\xa6\x68\xd0\x7a\xac\x15\x7f\x3a\x1c\x06\x53\x81\x31\x3f\xb0\xd6\x78\x6c\xc3\x3d\x5c\x32\x60\xf5\xfc\x86\x99\x81\x7c\x8e\x05\x1f\xd7\xf7\xa3\x93\x64\x99\x9d\xe9\x1d\xbb\x4c\x3b\x6e\x5c\xe9\x42\x71\xe6\x88\x71\xe8\xa7\xf3\xcc\xb0\xf5\xf3\x23\xd2\x82\xf7\x80\x1c\xc5\x0b\xd2\xe0\x6a\xbe\xb0\x09\x7c\x43\x7a\xc1\xcf\x9b\xcd\x3a\xa6\xc0\xf5\x87\x30\x6f\x7f\x23\x61\x90\x56\x40\xb0\x0c\xdf\xbb\xf9\x9c\x78\xa6\x59\x22\xac\x80\x6e\x2d\x95\x7e\xb7\x9b\x74\xc6\xe9\x90\x40\xfa\x60\xa5\xef\x65\xa1\x62\x4a\x22\xb0\x75\xb0\x8a\xf0\xbf\x1b\x90\xa2\x76\xf6\x00\x08\x6e\xdc\xb7\x11\x40\xef\xee\x07\x02\x3f\x29\xe0\xe6\x64\x2b\x79\x81\x38\x09\xf7\xc1\x0f\x03\xa5\x73\xe3\x72\x05\xcc\x85\x89\x44\x97\x02\x3d\x68\xc7\x36\x71\x1b\x75\x88\xd7\xea\x4e\xc2\x3d\x9b\xae\x9f\x34\x31\x6d\x57\x30\xd8\x49\xd7\xa4\xf2\x8e\xa3\x5e\x0d\xd8\x21\x39\x30\x86\xae\x0d\x79\x8b\xc2\x45\xfb\x23\x36\x6c\x8a\xcd\xec\x8a\x3a\x33\x32\xcf\x4f\x4c\xef\xd8\xc3\x35\x75\xfd\xe6\xe7\x26\x78\x3a\x37\x97\x07\xc8\xdf\x3a\xc7\x7f\x4e\xe3\xe5\xb1\xcb\x04\xb2\xcc\x5f\xd7\x42\x03\x21\xab\xeb\x9d\x3f\x7e\x26\x52\x2b\xb8\xb7\x27\x77\x23\x34\x8e\xef\xb9\x3e\x3a\x3a\xf0\x42\x89\x2e\x94\xf7\x27\x21\xf3\x5f\xed\xb2\x0b\x5c\x3e\x54\x79\x05\xef\x3d\x97\x92\x0f\x93\x52\xdb\x18\x1f\x85\xcc\x87\x3d\xf8\xcf\x55\xfe\x04\x83\xdd\x50\xd7\xa7\xf2\x0a\x9d\x1f\xfe\xc6\x3e\x85\xd1\x91\xe0\x30\x66\xdc\x74\x0e\xdd\xb0\xed\x47\xb7\x96\x73\x6a\x0b\xf5\x97\x1c\xfd\x29\xeb\x93\x1b\xfc\x6f\xe2\x46\xa8\x93\x28\xf2\x83\x3f\xec\x99\x4f\xaf\x86\xd8\x37\x5e\x61\xc3\xec\xbe\x09\x87\xd0\x78\x42\x1b\x6c\xda\xda\xfd\x10\xc9\x15\xf7\xbf\xb2\xc2\x4f\x84\x2c\x3b\xec\xb5\x46\xe5\x58\x8f\x35\xa3\x89\xa6\x76\x0e\x82\xda\x5b\x4e\x7f\x04\x00\x00\xff\xff\x20\xd3\x86\x3f\xdb\x0e\x00\x00") +var _templatesServerOperationGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x57\x4d\x6f\xdb\x46\x13\xbe\xf3\x57\xcc\x2b\xbc\x08\x28\x43\x26\xef\x0e\x7c\x48\xed\x14\xf1\xa1\x89\x60\x1b\xed\xb1\x58\x93\x43\x72\x11\x72\x97\x99\x1d\x5a\x56\x08\xfe\xf7\x62\x3f\x48\x53\x2e\x25\x05\x2d\x7a\x28\x7a\x92\xc8\x9d\x9d\x8f\xe7\x99\x2f\xa6\x29\xdc\xe8\x1c\xa1\x44\x85\x24\x18\x73\x78\xda\x43\xa9\x2f\xcd\x4e\x94\x25\xd2\x7b\xb8\xfd\x02\x9f\xbf\x3c\xc2\xc7\xdb\xbb\xc7\x24\x8a\xa2\xbe\x07\x59\x40\x72\xa3\xdb\x3d\xc9\xb2\x62\xb8\x1c\x86\x34\x85\xbe\x87\x4c\x37\x0d\x2a\x7e\x73\xd6\xf7\x80\x2a\x87\x61\x88\xa2\xa8\x15\xd9\x57\x51\xa2\x15\x4e\xb6\xe1\xbf\x3d\x48\x53\x78\xac\xa4\x81\x42\xd6\x08\x3b\x61\x0e\x9d\xe1\x0a\x21\x78\x03\xac\x75\x9d\x58\xf9\x8f\xb9\x64\xa9\x4a\xe0\xe9\x5e\xe3\x2c\xb6\xa4\x9f\x11\x8a\x8e\x9d\xaa\x0a\x15\xec\x75\x07\x84\x97\xd4\x29\xa7\x69\x54\xed\xdc\x15\x2a\x8f\x22\xd9\xb4\x9a\x18\xe2\x08\x60\xa5\x90\xd3\x8a\xb9\x5d\x45\xf6\xa9\x94\x5c\x75\x4f\x49\xa6\x9b\xb4\xd4\x97\xba\x45\x25\x5a\x99\x22\x91\x26\xb3\x3a\x2e\x40\x9d\x62\xd9\x60\xda\xc8\x3c\xaf\x71\x27\x08\x7f\x40\xd8\x60\xd6\x91\xe4\xfd\x09\x51\xc3\x54\x34\x7c\x4a\x60\x27\xca\x13\xc7\xcf\xa2\x96\xb9\x60\x74\xc1\x59\x1e\x5d\xe0\x06\x92\x5b\x2c\x44\x57\xf3\x5d\x78\x1e\x86\x37\xe7\xb3\x83\xb5\x63\xab\xef\xa1\x15\x26\x13\xb5\xfc\x8e\x90\x7c\x16\x8d\xe5\xf1\x93\x50\x79\x8d\xf4\x73\xa7\x32\xe0\x8e\x94\x01\x01\x45\xa7\x32\x96\x5a\xc1\x4e\x72\xe5\xf0\xf7\x89\x61\x64\xa9\x04\x77\x84\x20\x15\x6b\x10\x56\x63\xd5\x35\x42\xcd\x15\x42\xe5\x35\x46\xbc\x6f\xf1\xbc\x4d\x6b\x2b\x5e\x94\xda\x0a\x12\x8d\x09\x99\xfb\xa1\xe3\x4a\x93\xfc\x8e\x36\x29\x37\xe0\xdf\x2a\xcd\x10\x03\x7e\x83\x64\x4b\x52\x65\xb2\x15\x35\xac\xa4\x62\xa4\x42\x64\xd8\x0f\x2b\x58\xc3\x30\x5c\x4c\xc9\xec\x32\x78\x92\x9c\x65\xf9\x3a\x28\xfc\x7f\xf2\xc0\x24\x33\xbe\x47\xd3\x6a\x95\x23\x59\xf4\x96\x63\x98\x44\xa0\xef\xb1\x36\x38\x0c\xf0\x9a\x39\xc9\xc1\xa9\xca\x43\xb9\xf8\xb8\x01\x5f\x30\xeb\x42\x1d\x20\x10\x7e\xeb\xd0\x30\x08\x95\x03\xa1\xa5\xc0\x9e\x08\x20\xa7\xc2\x60\x64\x11\x82\xb8\x50\x67\xb1\x5c\x07\x03\x71\xeb\x90\x5b\x96\x3f\x85\x6a\x3b\x61\xf3\xaf\xc3\x17\xfa\x08\x02\x7c\x50\xa8\x80\xc0\x99\x28\x5f\xdd\x8b\x86\xb3\x05\x02\x53\xdc\x50\x68\x02\xae\x04\x43\x26\x54\xc8\x76\x70\x55\xba\x5c\x0f\xde\x97\xf3\xe5\x30\xb3\x60\x83\x09\x5c\xfe\x07\x4a\xc3\x83\xff\x19\x77\x8b\xda\x20\x23\x14\x8c\xb6\x2f\x29\xdc\x81\xed\xf3\xc9\x88\x98\x67\x02\x97\x71\xd7\xad\x1d\x19\x52\x2b\x5f\x41\xc7\xf4\xc7\x19\xbf\xc0\xc5\xcc\xc1\x1b\xad\x18\x5f\x78\x33\x36\xb2\x93\xa4\xad\xe1\x62\xd9\xeb\x59\x3e\xbe\x5b\x94\xe8\x83\x9d\x2b\xc8\xf8\x65\x13\xe8\xa6\xab\xd1\xaa\x87\xe5\x88\xf2\x30\x58\xaf\x48\x77\xec\x07\xf3\x2f\xc8\x95\xce\x03\x25\xc9\x56\x70\xe5\x49\x24\xa1\x4a\x84\xe4\x51\x94\x23\x5f\xc9\x9c\x5d\xb7\x01\x88\x06\x0f\xd4\x4f\xeb\xc2\x43\xd7\x34\x82\xf6\x21\x3d\x0e\x9e\xec\xf1\x2d\x9a\x8c\x64\xeb\x26\x45\xb8\xf5\x54\xeb\xec\xeb\xb4\x52\x1c\x0a\xcc\x73\xcd\xa6\xc5\x5b\x1d\xee\xe0\x9c\x02\x7b\xcf\xfd\x5b\x82\x7c\x29\x0b\x3e\x6c\xef\x66\xcb\xcc\x45\x7a\xa2\x0e\xc1\x30\x75\x19\x3b\xea\x02\x39\x4b\x89\x31\xd5\xe6\xe9\xcc\xb0\xfc\xf9\xd6\x6d\xc1\xbb\xc7\x0c\xe5\x33\xd2\x68\x6a\x99\xd8\x35\x3c\x20\x3d\xe3\xa7\xc7\xc7\x6d\x4c\x21\xd7\xef\xc3\x1c\xf8\x8d\x24\x23\x6d\x80\xe0\x22\xbc\x77\x73\x63\xed\x33\xcd\x26\xc2\x06\xe8\xc6\xa6\xd2\xef\x70\x75\x0d\x0b\x46\xc7\x00\x92\x7b\x2b\x7d\xa7\x0a\x1d\xd3\x3a\x02\xcb\x83\xbd\x08\xff\xbb\x06\x25\x6b\xa7\x0f\x80\xe0\xda\xbd\x8d\x00\xec\x62\xf1\x2c\x08\x7c\xd7\x81\xeb\xa3\xa5\xe4\x05\xe2\xf5\xb8\xa9\xbc\x6d\x4e\x9d\x6b\xbd\x1b\x10\xce\x4d\x24\x3a\xe7\xe8\x74\x3b\xb6\x81\x5b\xaf\x83\xbf\xf6\xee\x81\xbb\x27\xc3\xf5\x1d\x27\xa6\xdd\x06\x46\x3d\xc9\x96\x74\xde\x65\x68\x36\x23\x76\x48\x0e\x8c\xb1\x6a\x43\xdc\xb2\x70\xde\xfe\x19\x1b\x71\x88\xcd\xe2\xe8\x3c\xd1\x7e\x4f\x77\x5f\x6f\xd8\xc3\x75\x68\xfa\xd5\xce\x75\xb0\x74\xaa\xc7\x8f\x90\xbf\x56\x8e\x7f\x4e\xe2\x8b\xb7\x26\xd7\x90\xa6\x7e\x2f\x97\x06\x08\x45\x5d\xef\xfd\x82\x77\x20\xb5\x81\x3b\xbb\xac\x37\xd2\xe0\x6b\x55\x59\x14\x3c\xe3\xd3\x8b\x40\xd1\x19\x7a\x7f\x92\x2a\xff\xd5\x0e\xce\x90\xcb\x13\xcb\x1b\x78\xe7\x73\x69\xfd\xfe\x80\x6a\xeb\xe3\x93\x54\xf9\x38\x53\xff\x39\xe6\x8f\x64\xb0\x6b\xea\xe6\x58\x5c\xa1\xf2\xc3\x6f\xec\x43\x98\x2d\x1c\x0e\x63\x91\x71\xe7\xd0\x0d\x9b\xc3\x6c\x07\x74\x46\xfd\xc4\xfc\x0b\x86\x7e\x48\xfb\x2b\x45\x7f\x1f\x37\x42\xb3\x8e\x22\xdf\xf8\xc3\x9c\xf9\xf8\xc2\x24\x1e\xb2\x0a\x1b\xe1\x3e\x3c\xfc\x52\x35\xef\xd0\x8c\x4d\x5b\xdb\x2f\xb9\x55\xae\x33\xc3\x24\x55\xb9\x72\x33\x29\x4a\x53\x2b\x3e\x8e\xb6\x46\xe7\x58\xcf\x2f\x3b\x97\x2f\x67\xf7\x8d\x33\x13\x2e\xdb\xa3\x10\xda\x1f\x01\x00\x00\xff\xff\x64\x70\xfa\x14\x1c\x0f\x00\x00") func templatesServerOperationGotmplBytes() ([]byte, error) { return bindataRead( @@ -535,12 +702,12 @@ func templatesServerOperationGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/operation.gotmpl", size: 3803, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x49, 0xa, 0xe2, 0x73, 0xf, 0x62, 0x1d, 0x67, 0xb9, 0xa2, 0xb2, 0x1d, 0x7b, 0x4f, 0xe2, 0x8b, 0xca, 0x9, 0x95, 0x33, 0x36, 0x76, 0xe5, 0xc3, 0x28, 0xdb, 0x36, 0x3b, 0xe1, 0x9c, 0xa1, 0xb5}} + info := bindataFileInfo{name: "templates/server/operation.gotmpl", size: 3868, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x93, 0x85, 0xb, 0x19, 0xe8, 0x7d, 0xb, 0xc0, 0x51, 0x86, 0x7d, 0x2d, 0x8b, 0x11, 0xfe, 0x39, 0x17, 0x4f, 0xa3, 0xba, 0xc1, 0x9, 0x51, 0xff, 0x12, 0xcf, 0x4c, 0xde, 0xf5, 0x7d, 0xfb, 0x67}} return a, nil } -var _templatesServerParameterGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xdb\x73\xdb\x36\xba\xf8\xf3\xea\xaf\xf8\xaa\x5f\x9b\x21\x3d\x32\xd5\xdf\x9e\xce\x3e\xb8\x75\x67\x52\xdb\x6d\x3c\x6d\x2e\x27\x49\xfb\x70\xb2\x99\x2d\x2c\x42\x12\xd6\x24\xc1\x00\x90\x1d\x1d\x0d\xff\xf7\x33\xb8\x91\x00\x08\x52\x52\xe2\xa6\xed\x74\xfb\xd0\xb1\x88\xdb\x77\x01\xbe\x3b\x90\xdd\x0e\x72\xbc\x24\x15\x86\xe9\x0d\xa9\xf2\x9a\x91\x92\x08\x72\x87\x6b\xc4\x50\x39\x85\xa6\xd9\xed\xe6\x27\x80\x2a\xc0\x65\x2d\xb6\x20\x30\x17\x7a\x00\x11\x84\x56\x20\xa8\xfe\x24\x70\x59\x17\x48\x60\x60\xb8\xa6\x90\xe3\x1a\x57\x39\xae\x16\x04\x73\x60\x98\xd3\x62\xa3\x7a\x9f\xc2\xe5\x73\x78\xf6\xfc\x35\x5c\x3c\x79\xfc\xec\x87\x2b\x78\xfd\xe4\xfa\x15\x9c\xcc\x9b\x66\xb2\xdb\x01\xae\x72\x68\x9a\xc9\xc4\x85\x88\xe6\xdb\x3b\x54\x90\x1c\x09\xca\x24\x30\x13\x80\xdd\xee\x14\xc8\x12\xb2\x27\x88\x3f\xa5\x39\x2e\xbe\xa3\xf9\xf6\x85\x04\x96\xeb\xf6\xf9\x1c\xcc\x10\x0c\x72\x3c\xd0\x9b\x7f\xe3\x85\x50\x68\xe4\xb8\xc0\x2b\xd9\x60\x7a\x18\x0c\x4a\x39\x8f\xe9\xa7\xc1\x01\xb9\x04\x66\x0c\xce\xce\xd5\x24\xd9\x2f\x66\xca\x84\xd1\x8d\xc0\xd9\xf7\x94\x95\x48\xf0\xf4\x6b\xd5\xe9\xb3\x73\xa8\x48\x01\xbb\x09\x00\x48\x74\xe1\x1c\x50\x2d\x29\x90\x30\xcc\x67\xb2\x4b\x3a\x01\x68\x26\x7a\xda\x02\x57\xf2\x7b\x0a\xe7\xe7\xf0\xa5\x19\xb4\xdb\x41\xf6\x12\x2f\x30\xb9\xc3\xec\x19\x2a\x31\x34\x4d\xb6\xdb\x41\x8d\xf8\x02\x15\xe4\x7f\x31\x64\xe6\x2b\x9c\xcb\xbe\x64\x09\xa8\xca\x21\xa9\xa8\x80\xec\xd5\x62\x8d\x4b\x94\x5d\xf3\xef\x10\xc7\xaf\xb7\x35\x4e\x21\xbb\xe6\xcf\x36\x45\x81\x6e\x0a\x39\xe6\x51\x4b\x5c\x89\x8a\x82\x44\x93\x11\x17\x1c\xdb\xb9\x24\x3d\x5f\x91\xb2\x2e\xb0\x43\x50\x8f\xc8\xd7\x02\x6b\x1a\x1b\x88\x15\x1b\x28\x6b\x01\x90\x13\x14\x64\x81\x7f\x69\x69\xcb\x3b\xe0\xe4\x58\xd9\xc3\x6d\xec\xb1\x0b\x31\x86\xb6\x40\x97\x2e\xdf\x78\xbb\x9a\xd9\x1f\xce\xe2\x63\x2b\x9b\x9e\x9f\x9a\xb4\x66\xc5\xf6\x38\x4c\xb9\x04\x4c\x1d\x26\x67\x23\x67\x2e\x22\x76\xdf\x3b\x88\x29\x86\x8c\x91\x4e\x81\x97\x38\xc4\xd7\xbd\xae\xf9\x75\x25\x30\x5b\xa2\x05\xee\xb5\xbc\x12\x0c\xa3\x32\x4d\xf5\xd2\x4b\xca\x14\x65\xae\xab\x1c\xbf\xff\x05\x31\x89\xff\xd9\x39\x30\x54\xad\xcc\xb1\xd9\xb5\xd8\x78\xb4\xb6\xd3\x39\x44\x50\x1d\x89\xe6\xda\x9b\x60\xd2\xb7\x72\x97\x77\x87\x63\x70\xc2\x97\xf8\xdd\x86\x30\x9c\x77\x7c\x1b\x38\x49\x94\x75\x9d\x13\xb9\xd8\xc5\x9a\x14\x79\xf6\x02\x89\x35\x34\xcd\x4c\x22\x55\x33\x52\x89\x25\x4c\xbf\x78\x37\xb5\xcd\x3f\xd1\x85\x3e\xed\x4d\x93\xa6\xed\x02\x37\x0c\xa3\x5b\x0f\x2e\x75\x22\x5a\x10\x16\xb4\x12\xa4\xda\x60\xbf\x4b\xb7\x0d\x9b\x49\xf4\xb3\x2f\x3a\x7a\x14\x39\x42\x96\x8c\x48\x13\x1f\xfe\xc6\xca\x17\x87\xc0\xee\x0e\x1e\x3c\x21\x7f\x18\x79\x34\x70\xca\x3b\x86\xcc\xe7\x50\x51\x57\x70\xcb\x2d\x4c\x94\x4c\x22\x15\x88\x35\xe1\xa0\xce\xda\xe4\xd3\x1f\x79\xff\x14\x1f\x2f\x59\x9f\xa2\x7a\x4c\x02\xec\x3b\xfb\x8f\xf3\x5c\x29\x63\x54\xbc\x60\xb4\xc6\x4c\x10\x1c\x17\x05\x03\x1d\x7d\xc9\xe0\x0a\xe4\x12\xd5\x11\x71\x6c\x65\xc7\x8f\x78\x7b\x8c\xe4\x88\xae\x1e\x9e\xfb\xee\xec\x58\x20\xbc\xd3\x2e\xa7\xf3\x0e\x7c\x4f\x02\x48\xee\xe8\x3d\x33\x9d\xb6\x9c\x3a\x40\x2c\xcc\xcc\x4e\x50\x9b\xe0\x9a\x3f\xae\x68\xb5\x2d\xe9\x86\x9b\x35\x0c\x0e\x3f\x50\xb9\x25\xa0\x69\x12\x6f\x17\xbc\xf1\xc8\xf1\x76\x70\xa6\xb4\x1d\x35\x74\xda\xc5\x86\x55\xb2\x65\x4c\xbe\x44\x37\xc9\x00\x6f\xdb\x8d\x9b\x18\x70\x9e\xa2\x5a\x7e\x7b\x7e\x87\x19\x23\x39\x4e\x63\xf2\xbb\xc3\x64\xaf\xf4\x3e\x88\xa9\x87\x0b\xf3\x41\x31\xfe\x61\x02\xfc\x63\x44\xf8\x1d\x2a\x60\x06\xf4\x16\xce\xce\x23\x84\xf9\x5a\xb6\xf4\xa8\xa2\x18\x72\x04\xd1\x9d\xa5\x3e\x8b\x11\xda\x63\x7a\x70\x38\x8e\x52\x23\x07\x28\x93\x18\x45\x9b\x87\x40\xb0\x19\xa3\xfd\x1f\xcb\x28\x3e\x48\xe7\x28\x55\x53\xa2\xfa\xf7\x55\x34\xbe\x9e\x89\xea\x18\xdf\x58\xee\x56\xbe\xe6\x8f\xa5\xa1\x9d\xba\xdc\x4b\x87\xb4\x4d\x4f\x27\x90\xaa\x90\xbe\x99\x81\xe9\xd3\x52\xa0\x3b\x00\xb1\x75\x2d\x88\xfe\xfa\xd7\x97\xd0\x34\x92\x2a\x1f\xe5\xba\x79\x7b\xc3\x62\x21\x75\xb0\x21\xe6\xc7\x90\xd1\x10\xa6\x9d\xaa\x69\x94\x23\xd4\x69\xb2\x12\xd5\x9d\x7f\xfc\x17\xa5\xf9\xc0\x81\x64\x56\xd5\xd0\xea\x77\xdd\x99\xed\xd9\xf4\x8f\x66\xa8\xb1\x3d\xb3\x2c\x8e\x11\xad\x60\x85\x2b\xcc\xc8\x02\x88\xed\xfa\x3b\xa0\x13\x91\x35\xfa\x87\x6b\xec\x3a\xa1\x9a\x98\x9f\xab\xe3\x3a\x26\x4a\xf0\x94\x54\x3a\x82\x90\x3d\x45\xef\xdb\x58\x82\x91\xf3\x0b\x54\x62\x0f\x8b\x57\xf2\xc7\xd9\xb9\x24\xc1\x3f\xbe\x4a\xa4\x76\x08\x91\x0a\xa4\xd8\x13\xc4\x2f\x09\x5f\x30\x52\x92\x4a\x2e\xde\x49\xb7\x96\xe0\xdd\x27\x63\xf1\x06\x54\x38\x69\xa9\xd0\xad\xa5\x0d\x45\x63\x73\xaf\x11\x7f\xc1\xf0\x92\xbc\x07\xa9\x7c\x37\xf8\xea\x7d\xcd\x30\xe7\x92\x6b\x53\x9a\x4d\x95\x05\xdd\x19\xa4\x61\x97\xa6\xb9\xe8\x8e\xb4\xec\xd6\xef\xd0\x99\x87\xa9\x13\x11\x33\xe2\xa1\x25\x60\xd3\x4c\xe6\x73\xed\xbd\xcb\xdf\x97\xb8\x56\x46\x53\x69\xda\xcf\x54\x93\xdb\x3b\x62\x54\xdb\xe6\x83\xad\xae\xd9\x20\x9b\x66\xe1\x7a\xfd\x63\xee\xd8\xb5\x4d\x04\x31\x67\x3f\x44\x11\x33\xed\x06\x31\xa7\x77\x0c\x31\xd3\xfc\x40\x88\xb5\xf3\x1d\x8f\xd6\xcf\x15\x79\xb7\xc1\xa3\x98\x6d\xba\x2e\x67\x20\xd8\x06\xc7\x30\x72\xe6\x39\x0e\xa9\xdf\xfb\xb8\xc0\x9e\xf3\x02\x0f\x79\x60\x8e\x64\xce\x55\xb5\x29\x87\xb8\x22\xdb\xf4\x5e\xb3\xbd\x22\x5c\x91\x4d\x89\x91\x8c\x87\xb1\x64\xb2\xdf\x14\x7b\x40\xae\x9c\x7a\xc1\x72\xcd\x96\x53\xdf\x22\x3c\x90\x49\xde\xb0\x31\x56\x59\x0d\x77\xb1\xe1\x82\x96\x5a\xe7\x0b\x2c\xdd\xa5\xec\x95\x60\xa4\x5a\x25\xa9\x07\x9c\xa3\x27\x4f\x3d\x45\xd9\x9b\xfe\x54\x72\xda\xc1\xe4\xf8\x45\x3c\x8a\x98\x5f\x96\x23\x2d\xc7\xfe\xdf\xdd\xd4\xf0\xdc\x8e\x1d\xdd\x56\xd2\x46\xf1\x36\x56\xa7\x16\x4f\x5b\xbd\xb8\x90\xf0\x0e\xe5\x30\x2e\x68\x75\x87\x99\x06\xdf\xe3\x0c\x86\xec\xd5\x3d\x5a\xad\x30\xd3\x18\xc2\x74\xda\x9a\x0b\xbd\xfd\xaa\xbb\x9c\xf5\x36\x9f\x3f\x43\x3f\xe2\xac\x34\xef\x1d\x62\x95\x14\x79\x11\x96\xce\x5c\xc3\xcf\x05\x35\x19\x1f\xf7\x4b\xda\x99\x8d\x81\xad\x67\x69\x27\x1d\xff\xeb\x4a\x91\x45\xda\x23\x47\xc8\xb5\xa9\xec\xda\x86\x61\xa6\xb3\x3d\x38\xa4\x43\xe9\x8e\xfe\x0e\x32\xb6\xd2\x2d\xa9\x5f\x20\xc6\x71\x6a\x73\x5f\x35\x62\x9c\x54\x2b\x20\x1c\xf8\x2d\xa9\x6b\x9c\x2b\x37\x90\x2b\x77\x4b\x1b\xf0\x3a\x0c\x69\x32\x47\x1f\xc9\xa2\x3b\x89\x43\x4b\xfa\xa5\xb6\x9c\x33\x05\x52\xb2\x6f\xf8\xec\x8f\xc4\x18\x85\x88\x6b\xc9\x8f\x81\x26\x71\x3d\x49\xd4\x90\x2c\x39\xd9\xed\xcc\x4c\x26\xda\x13\xe3\x1e\x95\xe4\x7f\xff\x5c\x27\xed\xfa\xee\x96\xc9\xf7\xe5\x64\x81\x04\xce\x41\x50\xa8\x30\x97\x7f\x29\x86\xd5\xda\x43\x36\x1c\xdb\x0f\xda\x1e\xba\xf6\xdc\xa4\x7e\x9f\x2e\x5c\x63\x58\x9a\x42\xc4\x1b\x22\x4b\xb8\xc3\x26\xea\x24\x5b\xb3\xe4\xc4\x30\xa5\xc3\x2e\xf5\x62\x4f\x86\x75\x77\xb8\x5d\x40\x5a\x30\x2e\xdf\x52\x27\xd0\x15\x48\xaf\xbe\xa7\xf2\x10\xa4\x08\x45\x4c\x97\x0c\xab\x75\x8c\x70\x1b\xcd\x87\xf9\x8e\x45\x27\x41\x4b\x54\x87\xfd\x5d\x21\xda\x99\x1d\xc3\x81\x72\xab\x34\x9c\x90\xb8\xfd\xe4\x06\xbf\x3d\x17\x5d\x4d\x21\x0f\xba\x0d\xf5\x74\x84\xd2\xfd\x4a\x54\x4b\xe5\xe9\xbb\x6f\xfc\x0c\x16\xb4\xde\x4a\x79\x81\x8a\x02\x70\x81\x4b\x5c\xa9\xa8\xf9\xa0\xe0\x1d\xd2\xa8\x2f\x25\xb5\x4b\x74\xab\x99\xd9\x9e\xac\x99\x71\x86\x86\x35\xb1\x3a\x32\xbd\x20\xbd\x36\xd3\x87\x06\xfd\xd2\xc5\xf0\x07\xbb\x35\xcd\x45\x1b\x99\xf3\x95\xb1\x8d\x5b\x38\x29\x57\xdd\x34\x08\x63\xb8\x93\x06\xe1\x0a\xfc\xe7\x96\xd1\xc3\x09\x5f\xdd\x79\x5f\x06\x56\x5b\x44\xcd\x68\x88\x3d\x36\xc7\x0d\xa9\x72\xdc\x9b\xc0\x8b\xc5\x59\xaa\x98\xb4\xce\x6f\x48\x13\x07\xc2\xc8\x29\x19\x00\x31\x9a\x45\xb0\x30\x47\xd2\xba\x07\x81\xd4\x4b\x14\xf8\x0c\x8b\x64\x04\x7c\x9d\xf3\x71\x29\x5d\x77\xd1\x7d\x19\x80\xc3\x12\x00\xe1\x06\x08\xcd\xb8\x08\x6d\xdd\xc4\xe5\x01\xa7\xfb\xcd\x6e\x67\x0e\xa7\xca\xb3\x1c\x34\xa8\x8b\xa6\xf8\x27\xcf\xdd\x72\x4d\x73\xfd\x72\xb7\xb3\x91\xa8\x61\xb1\x3a\x24\x8b\x3d\x03\xf5\x9a\xbf\xb0\x05\x41\x0e\x72\x1d\x59\x3a\xc1\xd7\xf6\x6b\xab\x1b\x7a\x01\xa4\x7d\xa6\x57\xe7\xd2\xec\xb5\x86\x6f\xb6\x02\x4f\x07\x3c\x33\xdd\xe7\xf9\x32\xd9\xed\xd4\x1e\x32\xc6\x49\xbb\x61\x94\x71\x22\x3f\x78\x73\x5a\x5b\xb2\x2f\xf4\x5a\xbf\x62\x66\xad\xb1\x3d\xce\x66\x34\x8f\xe0\x43\x9e\xdc\x20\x8e\xff\xf1\x15\x70\x35\x75\x2a\x6d\x4b\x54\x30\x8c\xf2\x6d\x8b\x47\x0e\xf7\x6b\x5c\x29\xeb\x13\xe7\x03\xd1\xff\x80\xba\x8e\x24\x56\xe6\x8f\x92\x5a\x9e\x3e\x33\x06\xcf\x11\x35\x2a\x9e\x64\xf3\x64\xda\xa8\x0e\x3a\x4e\x96\xed\x95\x64\xc7\x47\x21\xad\x9c\x6e\x9a\xc9\x1d\x62\x07\x2a\x5c\x4f\xd1\x4e\x8c\x0a\xf5\x4e\x5c\x60\x62\x58\x91\xde\x3a\x47\x23\xfe\x69\x50\x07\xd2\x85\x36\xfe\xe5\xe7\xa9\x0f\x10\xb6\xae\xae\xde\xdb\x5d\x2b\xed\x21\x95\xad\x36\x0a\xc3\x8b\x0d\xe3\xf2\x90\x3b\xc5\x7a\x74\xa9\x0b\xb2\x54\x7d\x85\x6f\x30\xfb\x35\x26\x7a\xca\xd6\x71\xb2\xfb\xc3\xf8\x41\x66\x41\xd7\x1b\xba\xa0\x45\x81\x17\x72\x11\xc7\x2f\x6a\x49\xe9\xb7\x0d\x8b\xd8\x03\xd5\x69\x87\xb4\x0b\xe1\x41\x74\xee\x58\xc4\xef\xd1\x2a\x7b\x55\x17\x44\x7c\xb7\xd5\x70\x25\x07\xcd\x30\xa4\xbc\x22\x58\xa6\x6e\x8a\xe7\x28\x83\xe7\x68\x73\xc7\xa3\xa5\x49\xbe\xf6\xd1\x19\xb6\x2f\xe1\x5b\x37\x47\x7b\x8c\x95\x74\xc8\x21\x6c\xb3\x41\x07\x75\x3f\xec\xc8\x1c\xa2\x38\xc1\xd1\x9c\xb1\xb0\x41\xd0\x57\x4b\x58\x1d\x04\x90\xae\x00\xa9\x4c\x18\x20\xa9\x29\xe7\x44\xda\x50\xf7\x44\xac\x5d\x7f\x33\x75\xc5\xef\xc3\x5a\x83\xfe\x1e\x38\xc0\x18\xfc\x33\x71\xc2\x51\xa6\x8a\xea\x15\xad\x4e\x75\xad\xe8\xa3\x47\xea\x87\xa4\xbf\x90\x52\xbb\x65\x42\x28\xa8\xe2\x46\xee\x01\x45\x31\x7f\x05\xeb\x37\x52\x77\x77\xb8\xe5\xfb\xa7\xdb\x48\x1a\x51\x37\x60\x3b\x9f\xc3\x05\xcd\xb1\xce\xbb\x2a\xd3\xeb\x66\x0b\x2b\x7a\xca\xb5\x81\xf8\xb5\xad\x5a\xbf\xba\xbc\x7e\x9d\x4d\x26\x36\x87\x70\x41\xeb\x2d\x23\xab\xb5\x80\xd3\xa6\xd1\xda\x6e\x41\x4b\xe9\xef\x07\x6d\x4e\x68\x78\x52\xa3\xc5\x2d\x32\x5e\xf6\x0b\xf3\xb7\x6c\x98\xcf\xe1\xf5\x9a\x70\x58\x12\x29\x38\x10\xf7\x81\x11\x6b\x0c\x06\x1a\x10\x94\x16\x99\xec\x7f\x95\x13\x41\xaa\x95\x2e\x48\x51\xe3\x4a\xb5\x62\xcd\xe8\x1d\x86\xe5\x46\xa8\xa9\xa4\x11\xb9\xa5\x1b\x60\xf8\x94\x6d\x2a\x6f\x26\xbb\x84\x02\x1b\x55\xf9\x64\x42\xca\x9a\x32\x01\xc9\x04\x60\x5a\x61\x31\x5f\x0b\x51\x4f\x27\xf2\xd7\x8a\x88\xf5\xe6\x26\x5b\xd0\x72\xbe\xa2\xa7\xb4\xc6\x15\xaa\xc9\x5c\xef\xdf\xe9\x70\x07\x6b\xcd\x8e\x74\x61\x9b\x4a\x90\xf2\x80\x1e\x73\x2e\xcd\x14\x22\xb6\x07\x74\x2d\x49\x9e\x17\xf8\x1e\xb1\xb1\x79\x25\x1d\x14\x76\x5c\xb0\x65\x29\x06\xbb\xa9\xd6\xa9\xae\xed\x34\x86\x57\x76\x89\x97\x68\x53\x88\x6b\x45\x30\x53\x25\xe8\x9d\x53\x1b\xe7\x71\x63\x3e\x7a\xec\xe7\xb7\x78\x3b\x83\xcf\x55\xb0\x53\x4a\xf9\xcc\x9b\x44\xb6\x42\xd3\x84\xe7\xde\x74\x0f\x66\x4d\xd5\xc6\x79\x86\xef\xa3\xa5\x00\xa6\x0e\x68\xc1\x30\x12\x98\x03\x82\x0a\xdf\xc3\x58\x4f\x5d\xe3\x69\xf7\xb7\xfe\xa8\x6c\x0f\x5a\x62\x83\x30\x57\xb9\x91\xf9\x5c\x2b\x37\xb9\x9b\x72\xdd\xa0\xe3\xbd\xd2\x58\x24\x82\xa8\xd9\xf3\xcc\x1a\x50\x66\x48\x45\xc3\xce\xda\x6e\xcf\xa5\xdc\xe6\x35\x5e\x64\xae\x5d\xbf\xdc\x54\x8b\x3d\xa8\x25\xe9\x28\x3a\xbb\x3d\x98\x98\x78\x3b\x53\xfb\x7d\x3e\x77\x40\xd7\x0a\x1b\x0b\xcc\xb8\x46\xd4\x87\xdb\xdb\x09\x7e\xb5\x15\x58\x9b\xf3\x09\xe2\x66\x21\x27\xbb\xd5\xb5\x1b\xcd\xf3\x3d\x29\xb0\x9a\x20\xb0\x49\xaf\x2f\x9b\xc6\x0e\x3f\xf7\x2a\xf4\x42\x5f\xba\x73\xd0\x87\x1c\xeb\x44\x7b\x99\x17\xb4\x12\x88\x48\xa7\xe5\x7f\x30\xa3\x30\x4d\xfe\x39\x75\x52\xb0\xea\x9b\xb5\x6a\xf4\x71\x30\x1a\xd5\xd2\x84\xd9\x62\x1b\x0e\x3f\x57\x25\x62\x7c\x8d\x8a\xd7\xf8\xbd\x90\x8e\x31\xce\x56\x19\x5c\x22\x81\x67\xea\xff\xf2\x08\xce\xe0\x72\xc3\xb4\x8e\x6a\x95\xb1\x8f\x43\x10\xd1\x1f\x47\x64\x0c\x07\x05\x77\x9b\x31\x48\xfa\x39\x3d\x4b\x49\x65\x65\x8f\x20\x28\xd0\x2d\xe6\xc6\x29\x3f\x1a\x6a\x6b\x4c\x04\xa0\xa7\x5a\x03\x1c\x03\x1e\xc3\xab\x4d\x81\x18\xac\x28\xb4\xf7\xb1\xfa\xc0\xee\x81\xaf\x55\x88\x26\x79\x3a\x3f\x81\x4b\xaa\xb6\x9d\xb3\xcd\x97\x8c\x96\xd0\xda\xab\xb9\x3d\x18\xa4\xb2\xd9\x12\xe3\x01\x9e\xcc\x83\x4d\x1c\xdb\x8b\x56\xf1\x3a\x8c\x1c\xf7\x86\xdd\x3d\xd7\x02\xa5\xb7\x0c\x17\x52\x31\xad\xb6\xfa\xf4\x05\xfb\x2d\x86\x7a\x0f\x7d\xdf\x2a\x38\x3d\x72\xc5\x7f\x73\x5a\x65\xed\xb2\x87\x2d\x39\x40\x84\xc4\x71\x92\xf7\xee\x0e\x39\xdf\x8a\x2a\x5f\xef\xda\xe1\xb5\xb3\x45\x0e\xdf\x21\x67\xd6\x3d\xd1\x71\xa0\x3d\x7b\x27\xb0\x20\x5d\xf5\x13\x6c\x52\x7d\x23\xb0\x28\x80\x8a\x35\x66\xb0\x40\x1c\x73\x48\x94\x08\xe0\xaa\xd2\x2c\x85\x37\x7c\x4d\x37\x45\xae\xb6\x1b\x5d\x2c\x36\xec\xed\xe8\x92\x7e\x99\xf3\xd1\xb0\x48\x08\x6c\x95\xdb\xe0\xb1\x08\xd7\x88\x06\x7c\xe3\xe1\xb5\x54\x99\x7c\xa1\xb8\x8f\xca\x79\x73\xd2\x16\x88\xb1\x2d\xd0\xca\xdf\xb9\x83\x5b\xce\x3b\x5e\x4e\x35\xcd\x47\x4a\x77\x2b\xdc\x63\x5a\x25\xf3\xcf\xd4\x9b\xb7\x37\x5b\xd1\x4f\x30\x3b\x92\x29\xed\xc0\x8b\x89\x98\x9e\x82\xa3\x0c\x92\xa3\xe5\x42\x1a\x39\xb7\xce\xcc\x5d\xb4\x37\x38\x9f\x06\xfc\x5f\x77\xbb\x16\x7c\x3e\x85\x44\xf6\x6a\x91\x48\x9b\xe6\xd7\x74\x06\x8f\x7c\x82\x40\x4b\x91\xb1\xca\xf9\xf9\x1c\x6a\x54\x91\x05\x97\x20\x48\x4b\x85\x2c\x89\x71\xc0\x88\x14\x97\xca\xcc\xf5\x46\x94\x7c\xa5\xf2\xf7\xa5\xc8\x5e\x69\x98\x92\xa9\xe9\xe7\x1b\x13\x2a\x53\xd7\x9a\x1b\xd0\x83\xee\x0c\xbe\xb8\x9b\xce\x7a\x85\xfa\x0a\x9c\xa4\xe4\x2b\xf7\x73\xc0\x05\xb7\x0a\xa6\x9f\x80\xb4\xad\x5e\x54\xb5\xeb\x61\x3c\xd4\x11\xfb\x6a\x17\x33\x82\xfa\xa7\xa2\xf3\x14\xbd\x0a\x61\x89\xd9\x6f\x5f\xa4\xf6\xc8\x2d\x52\x8b\xb2\x7d\xe6\x1a\xd4\xed\x1f\x20\x3d\x44\x53\x1d\x36\x6c\x58\xdb\x33\x27\x85\xa1\x34\x85\x6f\xe8\xa6\xca\x6d\xac\x54\xdf\x15\x50\x9e\xde\x7a\x53\xa2\xca\x2b\xd2\xa5\x35\xd6\xc6\x91\x5c\x43\x6c\x6b\xb2\x40\x45\xa1\xfc\x3c\x8e\x01\x31\x0c\xf4\x46\x4e\x8d\x73\xad\xa2\x11\x48\x4f\x4c\xc5\x09\x30\x17\x93\xf9\x5c\x0e\x33\x6e\xdc\x99\x63\xab\x4a\x1d\x67\x96\x98\x28\x75\x30\x06\x3e\x17\x6c\xb3\x10\xb0\x33\xf9\xec\x27\xaf\x5f\xbf\x00\xb3\x02\xe8\xba\x8a\x09\xa8\xaf\xf6\xe3\x89\x0b\x04\xfc\x2a\x4f\xd7\xd9\xf4\x74\xfa\xeb\x24\x6e\x0f\xcf\x4f\xcc\x66\xb8\xc4\x92\x89\xb5\x68\x1d\xf7\x9b\x82\x2e\x6e\x5b\x5f\xb9\xd7\xec\x56\x15\x06\xc1\x13\xfb\x4b\x97\x4b\x86\x7d\x9f\xa2\xf7\xa4\xd4\x25\x7b\x00\xe6\x87\xdd\x65\xd9\xd5\xfb\x45\xb1\xe1\xe4\x0e\x77\xbd\xbe\xf1\x38\xef\x0c\xef\x4d\x4c\x2a\x67\x62\xfd\x23\x32\x71\xdb\xeb\xdb\x60\xe2\xb6\xa1\x37\xf1\xa6\x10\xa4\x2e\xf0\xf3\xa5\x99\xdb\xfc\x86\xe7\x4b\x53\xee\xea\x76\x88\xe0\xfb\x13\xae\x56\x2a\x52\xa4\x31\x06\xfd\xbb\x2d\x95\x6d\x9b\x23\x18\x79\x43\x49\xe5\x0f\x75\x9a\xc3\xa1\x2f\x94\xac\xae\xf4\x40\xf3\xe3\xcc\x04\x34\x6c\x4b\x04\x52\xa7\xe6\x5b\x02\x1a\x2f\xe9\x8d\x80\xe9\x8e\x23\x15\xc4\x6b\x9c\xc3\x71\x41\xf1\x2d\x80\xfe\x10\xdf\x36\x4e\x30\x6d\x02\x70\x6d\x90\x71\xbe\x86\x03\xe2\x49\x8a\xee\x2b\x78\x79\x8d\x7e\xe7\x70\xbe\x50\x5a\x9a\x1f\x7e\xbd\x58\xcf\xf2\xe9\x64\xf5\xc9\x7c\xe2\xf9\x95\xc6\x14\xd2\x96\x53\x70\x2d\xe3\x13\x57\x06\x3b\x96\xad\x6b\xce\xf5\xaf\x2d\x1c\x79\x69\x21\xe8\xd4\x65\x8e\x07\x17\xf7\x55\x5f\x63\x05\xfc\x77\xa4\xca\xad\x48\xbb\xa1\x62\x0d\x37\xa4\xca\xb9\x02\xc4\x06\xaf\x38\x20\xe5\xfb\x62\x2e\x66\x40\x04\x20\xce\x37\x25\xe6\x20\xd6\x48\xc0\x42\x17\xa2\x81\x58\x93\x6a\xc5\x41\x59\xdc\x4a\xae\x21\x30\xd9\x1a\x09\x6f\xa2\x5d\xce\xec\x25\x5e\x11\x2e\xd8\x36\xd5\xa1\x5f\xe7\x8a\xc7\x7c\xee\x96\x15\xda\x60\x8a\x80\x7b\x52\x14\xb0\xe1\x58\x59\x8b\x2a\xbe\x57\x62\xb1\xa6\x39\x48\x8d\xc1\x33\xa3\x0b\x5e\x53\xc0\x15\xdf\xb0\x30\x1c\x33\xd3\x01\x3f\x2d\xe9\xcb\x0d\x17\xb0\x46\x77\x18\x6e\x30\xae\xdc\x48\x8d\x76\x7a\xf6\x06\x5b\x6e\xf0\x92\x32\xbc\x46\x55\x9e\xe9\xf0\x4c\x12\xb9\x96\x02\x27\x23\x93\xa4\x2e\xbd\x13\xe6\xab\x94\x19\xa8\xeb\x42\x70\xd2\x45\xef\xb2\xa7\x48\x2c\xd6\x38\x7f\x29\x1b\x2c\xd1\x76\x26\x6c\xc3\x30\x87\x37\x6f\xd5\xb7\xc9\xc0\x15\x19\x57\x7d\x9d\x83\xed\x66\xce\xdc\x7f\x6f\x30\xeb\x2e\xcb\xbd\xe3\x2a\xaf\xaa\x03\x88\x3a\xe0\xcc\x13\x96\xfd\xfc\xf2\xa7\x4c\x75\x4c\x52\x27\x45\xe7\xcd\x23\xcf\x75\x3b\x4d\x67\xa3\x32\x5d\xb5\xa9\x25\x38\x62\x42\x76\x4b\xfe\xeb\xef\xf0\xcd\x37\xf0\xf7\x2f\x43\x6b\xf3\x6f\x7f\xeb\x0a\x33\x15\x4d\xae\x18\x7b\x46\x45\x3b\xb8\x77\x95\xd3\xcd\x1f\x3c\xc3\xf7\xc9\x57\x5f\x7e\x39\x9b\xf6\x4c\xc5\xa6\x35\xd6\x7d\xa0\x14\x2c\xe3\x77\x45\x0f\x5c\x60\xf2\xb7\xc6\xa7\x84\xa2\x9c\x1b\x14\x5b\xe6\x71\xca\xca\xce\x69\xd4\xfa\x1a\x30\x28\x26\x41\xf0\xcc\x75\x11\xda\x3b\x74\x1d\x53\x25\x4f\xa3\x5b\x71\x06\xef\xd6\xb7\x03\x2d\xff\x92\xa0\xbe\xe3\xd9\x0f\x58\x3c\xff\x31\x2c\xa3\x1c\xbf\x0b\x27\x05\x47\x44\xe0\x26\xc7\x03\xf1\x71\xb7\xe6\x7c\x0f\x4d\x82\x6f\xc9\xc1\x86\xd6\x1b\x27\x87\x06\xc7\x04\x51\x1f\x90\x30\xc7\x83\xf3\x90\x84\x79\x82\x51\x8e\x99\x25\xcd\x07\x62\x90\xe9\x59\xde\xa8\x23\x7b\x81\x2a\x5a\x49\x4b\x5e\x7f\xfc\x11\x6f\x3d\x3a\xbd\x9d\x29\xeb\xe3\x61\xb1\x68\x65\x8f\x73\xdf\xc1\xb4\xf8\xa1\xe5\xde\x15\xa7\xf8\xc5\x27\x0d\xfa\xac\x13\x17\x72\x01\x39\xd5\x00\xcb\x2d\xdc\xf6\xf8\xb9\xbe\xd7\xa3\x50\xa0\x3d\x25\x9c\x93\x6a\x25\xa7\xeb\x0e\xfd\x30\xc6\xae\xe4\x81\x29\xc3\x28\x27\xd5\x4a\x67\xba\xbe\x78\x07\x4b\x44\x0a\xe9\x08\x48\x91\x14\x66\x4b\x12\x1f\xaf\xd4\xde\x66\x70\xde\x0e\x88\x41\xec\x4b\xcb\xf3\x28\xe0\x86\x45\x2a\x9d\x71\x4a\x6b\x5d\x22\xac\x9b\xe1\x66\x23\x80\xd6\xfa\x3d\x04\x0d\x67\xeb\x9b\x4d\x02\xbf\x3c\x5c\xec\xc8\x8d\x77\x2c\x43\x63\xbb\xac\xef\x60\xcd\xe7\x7d\x07\xcb\x92\xf5\x9f\x95\x7e\x0d\x4c\x03\x3f\xbc\x43\x35\x56\xc7\xdf\xe0\x7f\x64\xf5\x83\xda\x1d\x97\x48\xa0\xb3\x28\x3e\x33\xd0\x18\xc5\x5b\x75\x5b\xe3\xde\x3a\x30\x56\xe7\x32\x1f\x90\x29\xcb\x7c\x5c\xfa\x2d\xf3\x07\x15\x7a\x1f\x02\xc7\xc7\xdf\xa2\x6e\x35\xec\xfc\x44\xfd\x99\x75\xd2\xa1\xbb\x04\x11\xf4\x51\x5a\x56\xeb\x58\xa7\xcf\x50\xec\xef\x3f\x0a\xf8\x3f\x0a\xf8\x2f\xa7\x80\x4d\x94\xbe\x53\xc2\x7f\x65\x39\x13\xb1\xe3\x83\x6c\x46\xfb\x38\x49\x1b\xa2\x38\xb5\x35\x88\x56\xfa\x3f\x41\x5c\x3f\x1c\x91\x06\x77\x4d\x02\x57\xdf\x2d\x04\x3d\x54\xc5\xb0\xec\x3b\xef\xb5\x06\xa7\x56\x2a\xc7\x4b\xcc\x4c\x87\xec\xa2\xa0\x1c\x27\x69\xe4\x9a\x44\x2f\x28\xe1\x7c\xba\x7a\x5f\x53\x26\xba\x2a\xaf\x1b\x9a\x6f\xdd\x2b\x94\x82\x9a\x7a\x1f\x05\x50\xa6\x5e\xff\xe2\x5d\x09\x50\x97\xcd\xd8\xed\x54\x0a\xba\xb6\x6d\xb6\x24\x39\x19\x9b\x21\xed\xa2\x49\x5d\x71\xaf\xca\x23\xb6\xdc\x48\x34\x7a\x96\xcd\x17\xb4\xe2\x9b\x12\x1b\x5f\x2e\x76\x2d\xd0\x25\x7f\xbf\x86\xad\xb3\x92\x08\xcd\xae\x9e\x7f\xef\x0c\x52\xdf\x3f\xfc\x81\xa7\x49\x98\xcd\x08\x72\x75\x23\xef\x18\x85\x7c\xbd\x43\xac\x7d\x63\xc5\x29\xed\x06\x2f\x99\xe4\xd3\xc3\xfe\xd1\x92\xeb\x91\x9c\x60\xc8\x57\xfe\x20\xfa\x1c\xf4\x18\xd6\x5e\x7b\xf6\x90\x37\xb2\x3c\x73\x2c\x42\xca\x71\xcb\x5b\x85\x0a\xae\xe4\xcf\x8f\x05\x68\x06\xd3\x69\xdf\x02\x1f\x22\x5d\x9f\xf3\x03\x69\xac\x1e\x82\x7e\xed\x62\xf0\x7e\x6c\x36\x52\xf6\xe8\x57\x5d\x3b\x20\xb9\xf3\x7f\x1a\xbe\x45\xa0\x1b\xfe\xe1\xbe\x9d\xd5\x95\x65\xfb\xd1\x9b\x0b\x5a\xd6\x94\x13\xe1\x94\x8f\x6b\xa6\x32\xcc\xb3\x2c\xb3\x6b\x9a\x41\x15\x29\x26\xe6\xae\xd0\xe7\x8b\x02\x71\xae\xa4\xcd\xd9\x39\x24\x81\x50\x4d\x4d\xca\x30\x1a\xa6\xb1\x17\x52\x5c\x2f\x74\x32\x9f\xc3\x80\xba\x32\x51\x57\xdf\x67\x52\x87\x56\x35\xb7\x61\xce\x35\x06\x5a\x15\x5b\xe0\x9b\xda\x48\x5b\xf7\x7a\x0b\xad\xd4\x0c\x5c\x65\xd0\xba\x14\x86\x14\xdd\x6d\x2e\x64\x4f\xe0\xd2\x41\xb9\x8b\x59\x0e\xea\x58\x55\x74\x69\x43\x74\xca\xa6\x9e\xc1\x5a\xd9\x1e\x70\xe2\x7f\x37\x6e\x98\x13\xc1\x6c\xa9\x64\x5e\xc7\x31\xc0\x86\x49\x1d\x00\xae\xde\x22\xd1\x36\x02\x29\x70\xf6\x0a\xe3\xdb\xe4\xcb\x99\x14\x2b\xf2\xcf\xab\x2a\xd7\x67\x2a\xd6\xf8\x4a\x20\x26\xd2\xa1\x2a\x5f\x2f\x11\xd4\x89\x45\xb9\x20\x7c\xa3\x5e\x3f\xe9\x1a\x3d\xf1\xe5\xee\xae\xab\xf7\x0b\x8c\x73\x6e\x72\x5c\xc7\x3d\x51\xe2\xe5\x99\x66\xb0\x44\x05\xc7\xe9\x78\x65\xb2\x97\xf7\x0a\x60\xfe\xd6\xbc\xd8\x72\x30\xcc\x3a\xe1\x77\x2c\xcc\x0e\x83\xf6\xc3\xec\x9d\x2a\xbf\x60\xc8\x84\x31\x3b\xab\xc8\x47\x53\x3f\x2f\x36\x5a\x01\x72\xc8\x99\xf2\x33\x19\x91\xc3\xa5\x53\xcc\x41\xca\x6b\x5f\x80\xff\xa8\x73\xc2\xd0\xbd\x74\xe8\xe1\xcd\x5b\x5d\xac\x32\x83\x35\xe2\x3f\xe2\x2d\xdc\x50\x5a\xb4\xd7\xea\x60\x20\x47\xb2\xeb\x1b\x62\x36\xff\xd4\xfa\x56\x69\x5f\x8d\x90\x25\x7c\x66\x96\x19\xda\x06\x1f\x68\x9a\x0c\xa8\x22\x95\x92\x40\xf7\xa6\x7e\xd0\xc2\xa0\xa4\xb3\xc6\xdf\x95\xd0\x0a\x18\x74\x2f\xad\x52\xdd\xf8\xc6\xed\x78\xfa\xff\xdf\x9a\x95\x74\x6e\xbe\x8b\xca\x68\x7e\x84\x0a\x33\xee\x7c\xcf\xe7\xf0\xb8\x28\xe8\xfd\x55\x59\x8b\xad\x0a\xbb\xeb\xf1\xc1\xc7\x48\x42\xd2\xf7\x5a\xe7\x73\x78\xd1\x6e\x1b\xc2\x55\x81\x39\xc9\x75\x65\xfa\x82\x56\x3a\xbb\xa4\x9e\x47\x94\x1b\x49\xac\xb1\xb6\xa8\xfc\x0b\x4d\x10\x49\x3c\x46\xd9\xa7\x1b\x03\x18\xd3\xce\x53\x18\x7a\x1f\xd6\x5c\xd3\x3c\xfc\x2c\x33\x74\x1f\xf7\x71\x82\x37\x12\x00\x7a\x3e\x5f\x02\x21\x06\x90\xaa\xa7\x06\x34\xf0\x16\xa4\x74\x0c\x0f\xc5\xfd\x73\x98\x4e\x61\x27\x59\xac\xdf\xd7\x37\x79\xbf\x1a\x71\xee\x94\xd8\x39\x3a\x6e\xb0\xbe\x66\x3e\xb7\x69\x63\x3b\x49\x97\xe9\xab\x19\xbe\x23\x74\xc3\x8b\xad\x97\xf4\xbb\xd9\x9a\x94\x5f\xe4\x30\x27\xc1\x7d\x34\x47\x8c\xf9\x54\xe9\x73\xd8\x7b\x2b\xc6\x7f\xce\xa4\xf7\x92\x8c\xe4\xc1\x6f\xf8\x28\x49\xd8\xd8\xbd\xa2\x00\x66\x65\xe3\xa3\xc6\x1e\xbb\x38\x8f\x47\xb5\x5b\xa4\x15\x6a\xd1\xaa\xb8\xbe\x98\x6e\x6f\x00\xeb\x13\xf8\xd0\xef\xbe\xc0\x9f\x81\x8e\x1f\x50\x72\xd0\x5a\x8f\xfd\x92\x03\xfb\xdb\xb2\xc6\xcf\xfd\x3b\x4f\xc9\x38\xd0\x3a\x45\x8c\x92\x5b\x43\xaf\x8a\xed\xe5\x3c\x43\xf7\x83\x27\xc0\x9c\x4e\xff\xa6\xe6\x07\x3f\xa2\x99\x0c\x5e\x39\x1f\x11\x54\x41\x09\x9f\x35\x3d\x06\xea\xc3\x8f\xb7\x21\xf4\xdd\xbb\xc3\x2d\x09\x6d\xbb\x3f\xd6\xa5\xe4\xd2\x34\xd7\x97\xda\x01\x2d\x16\x94\xa9\x9c\x8e\xa0\xd0\xbf\x14\x3c\x1d\xa8\x9e\x99\x42\xd2\x56\xaa\x0b\x0a\xd3\x05\xbf\x9b\xea\x7b\x4e\x4a\x86\xa6\x7f\x48\xd3\x25\xf0\x2a\x7b\xc6\xc9\x03\x18\x26\xe3\x52\x19\xbf\x8b\x10\x73\xaa\x9c\x94\xa9\x51\x4a\xea\x1e\x5c\xf4\x6a\x76\xb4\xde\xe9\xb0\xcb\xe7\x67\xad\x85\x13\x88\xca\xd3\xf6\xfa\xcd\xbb\xbb\x78\xc4\xae\x35\xa4\x86\xcd\xa8\xa1\xa1\x71\xb3\x0a\x4e\x41\x19\x56\xd6\xac\xfa\x4d\xb0\x8d\xdc\x15\x1f\x80\x32\x72\xb9\x73\xef\xbd\x70\xb3\x97\x54\x34\x72\x9f\xc9\x34\x7e\xbf\x3b\x7a\xb3\xdb\x79\x7e\xfb\x81\x77\xa4\x0e\xca\x7d\x08\x34\x91\x1b\x55\xbf\x87\xcd\x13\xbf\x33\x30\x7e\xfd\xbd\xdd\x3a\x83\x5a\x66\xff\x75\x58\xdf\xfb\x19\xfd\xa7\x3c\x3e\x99\x8e\x71\xff\xbd\x8b\x88\x96\x09\x5e\x6a\x30\xb7\x01\x22\xfa\x3f\xd0\x94\xa9\xee\xd4\xdd\xe5\x8d\x20\x9b\x1a\x85\x35\x82\x90\xba\x7e\x41\xb0\x8a\x07\x85\xaf\x79\x45\xb4\xd6\x87\xa8\x8b\x03\xc8\x39\xa6\x13\x0e\x7f\x15\x6d\x0f\x7d\x03\x8d\xee\x86\x12\x54\x1e\xd7\x79\x58\xda\x94\x0d\xaa\x7f\x36\xc5\x79\x7c\x3c\xbc\xe9\x38\xf0\x5c\x4c\x97\x03\x89\x3d\x35\xdf\xda\x71\xfe\xbf\x16\x95\x46\x1a\xd4\x2b\xe9\x5e\x34\xd7\xff\x97\x9c\x82\x7d\x3d\xce\x69\x39\xa1\x6b\x98\x54\x71\xd4\x1e\x98\xc3\x2a\x41\x75\xa0\xe6\x87\xc8\xe3\x3c\xde\x2d\x8d\x3d\xa7\xda\xfd\xef\x90\x87\x3e\xf6\x5c\x72\x82\xd8\xd3\x22\x23\x8b\x1e\xac\xf5\xe2\x32\x2e\x9c\xeb\x00\x61\xe9\xf5\xff\x78\xb1\x39\x40\x85\xe1\x67\x8d\x7e\x73\xcc\x87\xdf\x37\x7a\x70\xd4\x63\x2f\x42\x1c\x27\x7c\x22\x04\xec\xc9\xa3\x68\x98\x36\xfe\x74\xbc\xfd\xeb\xff\x02\x00\x00\xff\xff\xb6\xf1\x7d\x50\x76\x70\x00\x00") +var _templatesServerParameterGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x3d\x5b\x73\xdb\x36\xba\xcf\xab\x5f\xf1\xad\xce\xd9\x0c\xe9\x91\xc9\x9e\x3d\x9d\x7d\x70\xeb\xce\x24\xb6\xdb\x78\xda\x5c\x4e\x92\xf6\xe1\x64\x33\x5b\x58\x84\x24\x6c\x48\x82\x01\x20\x3b\x3a\x1a\xfe\xf7\x33\xb8\x91\x00\x09\x52\x54\xec\xa6\xed\xb4\xfb\xb0\xb5\x88\xdb\x77\x01\xbe\x3b\x90\xfd\x1e\x32\xbc\x22\x25\x86\xf9\x0d\x29\xb3\x8a\x91\x82\x08\x72\x8b\x2b\xc4\x50\x31\x87\xba\xde\xef\xd3\x13\x40\x25\xe0\xa2\x12\x3b\x10\x98\x0b\x3d\x80\x08\x42\x4b\x10\x54\x7f\x12\xb8\xa8\x72\x24\x30\x30\x5c\x51\xc8\x70\x85\xcb\x0c\x97\x4b\x82\x39\x30\xcc\x69\xbe\x55\xbd\x4f\xe1\xf2\x05\x3c\x7f\xf1\x06\x2e\x9e\x3e\x7e\xfe\xdd\x15\xbc\x79\x7a\xfd\x1a\x4e\xd2\xba\x9e\xed\xf7\x80\xcb\x0c\xea\x7a\x36\x73\x21\xa2\xd9\xee\x16\xe5\x24\x43\x82\x32\x09\xcc\x0c\x60\xbf\x3f\x05\xb2\x82\xe4\x29\xe2\xcf\x68\x86\xf3\x27\x34\xdb\xbd\x94\xc0\x72\xdd\x9e\xa6\x60\x86\x60\x90\xe3\x81\xde\xfc\x1b\x2f\x85\x42\x23\xc3\x39\x5e\xcb\x06\xd3\xc3\x60\x50\xc8\x79\x4c\x3f\x0d\x0e\xc8\x25\x30\x63\x70\x76\xae\x26\x49\x7e\x32\x53\x46\x8c\x6e\x05\x4e\xbe\xa5\xac\x40\x82\xc7\x5f\xa9\x4e\x7f\x3d\x87\x92\xe4\xb0\x9f\x01\x80\x44\x17\xce\x01\x55\x92\x02\x11\xc3\x7c\x21\xbb\xc4\x33\x80\x7a\xa6\xa7\xcd\x71\x29\xbf\xc7\x70\x7e\x0e\x5f\x98\x41\xfb\x3d\x24\xaf\xf0\x12\x93\x5b\xcc\x9e\xa3\x02\x43\x5d\x27\xfb\x3d\x54\x88\x2f\x51\x4e\xfe\x0f\x43\x62\xbe\xc2\xb9\xec\x4b\x56\x80\xca\x0c\xa2\x92\x0a\x48\x5e\x2f\x37\xb8\x40\xc9\x35\x7f\x82\x38\x7e\xb3\xab\x70\x0c\xc9\x35\x7f\xbe\xcd\x73\x74\x93\xcb\x31\x8f\x1a\xe2\x4a\x54\x14\x24\x9a\x8c\x38\xe7\xd8\xce\x25\xe9\xf9\x9a\x14\x55\x8e\x1d\x82\x7a\x44\xbe\x16\x58\xd3\xd8\x40\xac\xd8\x40\x59\x03\x80\x9c\x20\x27\x4b\xfc\x53\x43\x5b\xde\x02\x27\xc7\xca\x1e\x6e\x63\x8f\x5d\x88\x31\xb4\x03\xba\x72\xf9\xc6\x9b\xd5\xcc\xfe\x70\x16\x1f\x5b\xd9\xf4\xfc\xdc\xa4\x35\x2b\x36\xc7\x61\xce\x25\x60\xea\x30\x39\x1b\x39\x71\x11\xb1\xfb\xde\x41\x4c\x31\x64\x8c\x74\x0a\xbc\xc8\x21\xbe\xee\x75\xcd\xaf\x4b\x81\xd9\x0a\x2d\x71\xaf\xe5\xb5\x60\x18\x15\x71\xac\x97\x5e\x51\xa6\x28\x73\x5d\x66\xf8\xe3\x4f\x88\x49\xfc\xcf\xce\x81\xa1\x72\x6d\x8e\xcd\xbe\xc1\xc6\xa3\xb5\x9d\xce\x21\x82\xea\x48\x34\xd7\xde\x76\x26\x7d\x27\x77\x79\x7b\x38\x06\x27\x7c\x85\x3f\x6c\x09\xc3\x59\xcb\xb7\x81\x93\x44\x59\xdb\x39\x92\x8b\x5d\x6c\x48\x9e\x25\x2f\x91\xd8\x40\x5d\x2f\x24\x52\x15\x23\xa5\x58\xc1\xfc\x6f\x1f\xe6\xb6\xf9\x07\xba\xd4\xa7\x5d\x76\x09\xc2\x19\xc7\xcd\xba\x37\x0c\xa3\xf7\x1e\xb8\xea\xa0\x34\x90\x2d\x69\x29\x48\xb9\xc5\x7e\x97\x76\x77\xd6\xb3\xe0\x67\x5f\xa2\xf4\x00\x38\x42\xc4\x8c\x08\x19\x1f\xfe\xda\x8a\x1d\x87\xee\xee\xc6\x1e\x3c\x38\xbf\x19\x31\x35\x70\xf8\x5b\x86\xa4\x29\x94\xd4\x95\xe7\x72\x67\x13\x25\xaa\x48\x09\x62\x43\x38\xa8\x23\x38\xfb\xfc\x92\xc0\x3f\xdc\xc7\x0b\xdc\x67\xa8\x1a\x13\x0c\x87\x44\xc2\xe3\x2c\x53\x3a\x1a\xe5\x2f\x19\xad\x30\x13\x04\x87\x25\xc4\x40\x47\x5f\x60\xb8\x72\xba\x40\x55\x40\x4a\x5b\x91\xf2\x3d\xde\x1d\x23\x50\x82\xab\x77\xc5\x41\x7b\x76\x2c\x10\x9e\x10\x90\xd3\x79\x72\xa0\x27\x18\x24\x77\xf4\x9e\x99\xcf\x1b\x4e\x4d\x92\x16\x7a\x7a\xb5\x09\xae\xf9\xe3\x92\x96\xbb\x82\x6e\xb9\x59\xc3\xe0\xf0\x1d\x95\x5b\x02\xea\x3a\xf2\x76\xc1\x5b\x8f\x1c\xef\x06\x67\x8a\x9b\x51\x43\xa7\x5d\x6c\x59\x29\x5b\xc6\xe4\x4b\x70\x93\x0c\xf0\xb6\xd9\xb8\x91\x01\xe7\x19\xaa\xe4\xb7\x17\xb7\x98\x31\x92\xe1\x38\x24\xd6\x5b\x4c\x0e\x0a\xf5\x49\x4c\x9d\x2e\xe3\x07\xa5\x7b\x58\xae\xb7\x80\x1e\x21\xd5\xef\x23\xd7\x6f\x51\x0e\x0b\xa0\xef\xe1\xec\x3c\x00\xc4\x57\xb2\xa5\x47\x2a\xc5\xa5\x23\x38\xe1\x2c\xf5\xd7\x10\xf5\xbd\x9d\xd0\x39\x31\x47\xe9\x96\x09\x1a\x26\x44\xd1\xfa\x21\x10\xac\xc7\x68\xff\xdb\x32\xa0\x27\x29\x22\xa5\x7f\x0a\x54\xfd\xba\xda\xc7\x57\x3e\x41\xc5\xe3\x1b\xd6\xed\xca\xd7\xfc\xb1\x34\xca\x63\x97\x7b\xf1\x90\x0a\xea\x29\x0a\x52\xe6\xd2\x8f\x33\x30\x7d\x5e\x0a\xb4\x07\x20\xb4\xae\x05\xd1\x5f\xff\xfa\x12\xea\x5a\x52\xe5\x5e\x6e\x9e\xb7\x37\x2c\x16\x52\x31\x1b\x62\xde\x87\x8c\x86\x30\xcd\x54\x75\xad\x9c\xa6\x56\xbd\x15\xa8\x6a\x7d\xe9\x3f\x28\xcd\x07\x0e\x24\xb3\xfa\x87\x96\xbf\xea\xce\x6c\xce\xa6\x7f\x34\xbb\x6a\xdc\xb3\xd5\xc2\x18\xd1\x12\xd6\xb8\xc4\x8c\x2c\x81\xd8\xae\xbf\x02\x3a\x01\x59\xa3\x7f\xb8\x16\xb0\x13\xd6\x09\xf9\xc4\x3a\x06\x64\x22\x0a\xcf\x48\xa9\xa3\x0d\xc9\x33\xf4\xb1\x89\x3b\x18\x39\xbf\x44\x05\xf6\xb0\x78\x2d\x7f\x9c\x9d\x4b\x12\xfc\xe3\xcb\x48\x6a\x87\x2e\x52\x1d\x29\xf6\x14\xf1\x4b\xc2\x97\x8c\x14\xa4\x94\x8b\xb7\xd2\xad\x21\x78\xfb\xc9\x98\xc1\x1d\x2a\x9c\x34\x54\x68\xd7\xd2\xd6\xa3\x31\xc4\x37\x88\xbf\x64\x78\x45\x3e\x82\x54\xbe\x5b\x7c\xf5\xb1\x62\x98\x73\xc9\xb5\x39\x4d\xe6\xca\xac\x6e\xad\xd4\x6e\x97\xba\xbe\x68\x8f\xb4\xec\xd6\xef\xd0\xda\x8c\xb1\x13\x3d\x33\xe2\xa1\x21\x60\x5d\xcf\xd2\x54\x7b\xfa\xf2\xf7\x25\xae\x94\x25\x55\x98\xf6\x33\xd5\xe4\xf6\x0e\x58\xda\xb6\xf9\x08\x53\x6c\x88\x4d\x8b\xee\x7a\xfd\x63\xee\x18\xbb\x75\x00\x31\x67\x3f\x04\x11\x33\xed\x06\x31\xa7\x77\x08\x31\xd3\xfc\x40\x88\x35\xf3\x1d\x8f\xd6\x8f\x25\xf9\xb0\xc5\xa3\x98\x6d\xdb\x2e\x67\x20\xd8\x16\x87\x30\x72\xe6\x39\x0e\xa9\x5f\xfb\xb8\xc0\x81\xf3\x02\x0f\x79\x60\x8e\x64\xce\x55\xb9\x2d\x86\xb8\x22\xdb\xf4\x5e\xb3\xbd\x02\x5c\x91\x4d\x17\x88\xe3\xc8\x48\xc7\x69\x6c\x99\x1d\x36\xc7\x1e\x90\x33\xa7\x5e\x70\x5d\xb3\xe6\xd4\xb7\x0a\x27\x32\xca\x1b\x36\xc6\x2e\xab\xe5\x2e\xb6\x5c\xd0\x42\xeb\x7d\x81\xa5\xcb\x94\xbc\x16\x8c\x94\xeb\x28\xf6\x80\x73\x74\xe5\xa9\xa7\x2c\x7b\xd3\x9f\x4a\x6e\x3b\x98\x1c\xbf\x88\x47\x11\xf3\xcb\x72\xa4\xe1\xd8\x7f\xdc\xce\x0d\xdf\x4f\xdb\x63\x94\x5c\x73\xc5\xef\x6b\xa8\xeb\x15\xca\x39\x6e\xf7\xa5\x3c\xb5\xd3\x76\xa1\x34\x69\xbc\x7d\xd8\x6a\xd1\xd3\x46\x8d\x2e\x25\x6a\x43\xe9\x91\x0b\x5a\xde\x62\xa6\x31\xf5\x98\x88\x21\x79\x7d\x87\xd6\x6b\xcc\x34\x31\x60\x3e\x6f\xac\x8b\xde\xf6\xd6\x5d\xce\x7a\xfb\xd4\x9f\xa1\x1f\xcc\x56\x8a\xfa\x16\xb1\x52\x4a\xc8\x00\xf7\x17\xae\x9d\xe8\x82\x1a\x8d\x8f\xfb\x29\x6e\xad\xcc\x8e\x69\x68\x69\x47\x19\x4f\xae\x4b\x45\x16\x69\xbe\x1c\x21\x06\xe7\xb2\x6b\x13\xca\x99\x2f\x0e\xe0\x10\x0f\x65\x52\xfa\x9b\xcd\x98\x56\xef\x49\xf5\x12\x31\x8e\x63\x9b\x56\xab\x10\xe3\xa4\x5c\x03\xe1\xc0\xdf\x93\xaa\xc2\x99\xf2\x1a\xb9\xf2\xce\xb4\xbd\xaf\x43\x99\x26\x29\x75\x4f\x16\xdd\x4a\x1c\x1a\xd2\xaf\xb4\xa1\x9d\x28\x90\xa2\x43\xc3\x17\xbf\x25\xc6\x28\x44\x5c\xc3\x7f\x0c\x34\x89\xeb\x49\xa4\x86\x24\xd1\xc9\x7e\x6f\x66\x52\x86\x53\x98\x7b\x54\x92\xff\xe3\x0b\x9d\x0f\xec\x7b\x67\x26\x95\x98\x91\x25\x12\x38\x03\x41\xa1\xc4\x5c\xfe\xa5\x18\x56\x69\x87\xda\x70\xec\x30\x68\x07\xe8\xda\xf3\xaa\xfa\x7d\xda\xe8\x8e\x61\x69\x0c\x01\xe7\x89\xac\xe0\x16\x9b\x20\x95\x6c\x4d\xa2\x13\xc3\x94\x16\xbb\xd8\x0b\x55\x19\xd6\xdd\xe2\x66\x01\x69\xf0\xb8\x7c\x8b\x9d\xb8\x58\x47\x7a\xf5\x1d\x9b\x87\x20\x45\x57\xc4\xb4\x79\xb6\x4a\xc7\x19\x77\xc1\x54\x9b\xef\x87\xb4\x12\xb4\x40\x55\xb7\xbf\x2b\x44\x5b\x2b\x65\x38\xd8\x6e\xf5\x8b\x13\x56\xb7\x9f\xdc\x00\xba\xe7\xd1\xab\x29\xe4\x41\xb7\x91\xa1\x96\x50\xba\x5f\x81\x2a\xa9\x67\x7d\x6f\x8f\x9f\xc1\x92\x56\x3b\x29\x2f\x50\x9e\x03\xce\x71\x81\x4b\x15\x79\x1f\x14\xbc\x43\xca\xf7\x95\xa4\x76\x81\xde\x6b\x66\x36\x27\x6b\x61\x7c\xa7\x61\xa5\xad\x8e\x4c\x2f\xd0\xaf\xad\xfa\xa1\x41\x3f\xb5\x79\x80\xc1\x6e\x75\x7d\xd1\x04\xf2\x7c\xbd\x6d\xc3\x1c\x4e\x36\x57\x37\x0d\xc2\xd8\xdd\x49\x83\x70\x75\xdc\xed\x86\xd1\xc3\xb9\x64\xdd\xf9\x50\x72\x57\x1b\x4f\xf5\x68\x98\x3e\x34\xc7\x0d\x29\x33\xdc\x9b\xc0\x0b\xdd\x59\xaa\x98\xd4\xd0\x2f\x48\x13\x07\xc2\xc0\x29\x19\x00\x31\x98\x89\xb0\x30\x07\x32\xc6\x93\x40\xea\x25\x1b\x7c\x86\x05\xb2\x0a\xbe\xce\xb9\x67\xb6\x78\x12\x8c\xb1\x0b\xdb\xa1\xbc\xc2\xb4\xb4\x42\x77\x9f\x74\xad\xbd\x00\x0b\xdc\x1c\xe9\x04\x21\xf0\x76\xbf\x37\x67\x58\xa5\x74\x26\x0d\x6a\x63\x34\xfe\x01\x75\x77\x66\x5d\x5f\xbf\xda\xef\x6d\x7c\x6b\x58\xfa\x0e\x89\x6c\xcf\x8e\xbd\xe6\x2f\x6d\x49\x92\x83\x5c\x4b\x96\x56\x3e\x36\xfd\x9a\xfa\x8a\x5e\x58\xea\x90\x85\xd6\x3a\x49\xf6\xf7\x13\xc4\xf1\x3f\xbe\x8c\x07\x1c\x3b\x3d\xfe\xc5\x2a\xda\xef\xd5\x9e\x32\xc6\x4a\xb3\x81\x94\xb1\x22\x3f\x78\xd6\x94\xb5\x2d\xfb\x42\xb0\x71\x49\x16\xd6\x3a\x3b\xe0\xab\x86\x71\x74\xc4\xa6\xb2\x55\x94\x88\xf1\x94\x8f\xb1\x4e\x8e\xa8\x55\xf1\xc4\x90\x27\x80\x46\x15\xc6\x71\x82\xe7\xa0\xd8\x39\x3e\xc2\x68\x85\x6a\x5d\xcf\x6e\x11\x9b\xa8\x1d\x3d\xad\x38\x33\xfa\xae\x15\x39\xcf\x31\xce\xb8\xaa\xdd\x30\xc1\x06\xa7\x8e\xa3\xf5\xf6\xfe\xe5\xe7\x99\x27\x08\x3a\x57\x4f\x1e\xec\xae\x15\xe6\x90\xba\x54\x7c\x67\x78\xb9\x65\x5c\x9e\x1c\xa7\x06\x8f\xae\x74\x9d\x95\xaa\x8f\xf0\x8d\x55\xbf\x46\x44\x4f\xd9\x38\x2d\x96\xdd\xc6\x07\x31\x0b\xba\x9e\xc8\x05\xcd\x73\xbc\x94\x8b\x38\x3e\x89\xd5\x4c\x9d\xb6\x61\xb9\x35\x51\x95\xb5\x48\xbb\x10\x4e\xa2\x73\xcb\x22\x7e\x87\xd6\xc9\xeb\x2a\x27\xe2\xc9\x4e\xc3\x15\x4d\x9a\x61\x48\x71\x04\xb0\x8c\xdd\x6c\xcc\x51\xc6\xc6\xd1\xa6\x86\x47\x4b\x93\x27\xed\xa3\x33\x6c\xdb\xc1\x37\x6e\x3a\xf5\x18\x0b\x65\xca\x99\x6a\x12\x37\x93\xba\x4f\x3b\x32\x53\xb4\x11\x38\xea\x28\xe4\xb2\x77\xfa\x6a\x81\xa9\x1d\x70\x69\x86\x93\xd2\xb8\xe0\x51\x45\x39\x27\xd2\x7e\xb9\x23\x62\xe3\xfa\x7a\xb1\x2b\x4d\x1f\xd6\x12\xf3\xf7\xc0\x04\x43\xec\xf7\xc4\x09\xc7\x56\x52\x54\x2f\x69\x79\xaa\x4b\x40\x1f\x3d\x52\x3f\x24\xfd\x85\x14\xc2\x0d\x13\xba\x82\x2a\x6c\x60\x4e\x28\x6a\xf9\xd3\xf2\x04\x2f\x6d\xea\x4b\xa8\xe9\x56\xe7\xef\x6e\xbf\x69\x44\xdd\x98\x6a\x9a\xc2\x05\xcd\xb0\xce\xa4\xaa\x88\xce\xcd\x0e\xd6\xf4\x94\x6b\x9b\xed\x2b\x5b\xb3\x7e\x75\x79\xfd\x26\x99\xcd\x6c\x56\xe0\x82\x56\x3b\x46\xd6\x1b\x01\xa7\x75\xad\x95\xe2\x92\x16\xd2\x25\xef\xb4\x39\xd1\xdb\x59\x85\x96\xef\x91\x71\x84\x5f\x9a\xbf\x65\x43\x9a\xc2\x9b\x0d\xe1\xb0\x22\x52\xbe\x20\xee\x03\x23\x36\x18\x0c\x34\x20\x28\xcd\x13\xd9\xff\x2a\x23\x82\x94\x6b\x5d\x62\xa2\xc6\x15\x6a\xc5\x8a\xd1\x5b\x0c\xab\xad\x50\x53\x6d\x70\x09\x3b\xba\x05\x86\x4f\xd9\xb6\xf4\x66\xb2\x4b\x28\xb0\x51\x99\xcd\x66\xa4\xa8\x28\x13\x10\xcd\x00\xe6\xab\x42\xcc\xe5\x7f\x09\x55\xff\x29\xb1\x48\x37\x42\x54\xf3\x99\xfc\xb5\x26\x62\xb3\xbd\x49\x96\xb4\x48\xd7\xf4\x94\x56\xb8\x44\x15\x49\xf5\xae\x9f\x0f\x77\x60\xdb\x52\x90\x02\x1f\xee\x91\x72\x69\xb9\x10\xb1\x9b\xd0\xb5\x20\x59\x96\xe3\x3b\xc4\xc6\xe6\xe5\x82\x59\x84\x06\x3a\xdc\xa1\xf5\x48\xb3\xb5\xf8\xe7\xba\x92\x13\x34\xa5\x38\x24\x97\x78\x85\xb6\xb9\xb8\x36\xbf\x6d\x04\xa6\x69\x77\x1a\x62\xc5\xe6\xe7\xf8\x2e\x98\x8a\x37\x75\x38\x4b\x86\x91\xc0\x1c\x10\x94\xf8\x0e\xc6\x7a\xea\xc2\x4b\xbb\x1b\xf5\x47\x65\x50\xd0\x02\x1b\xa8\xb8\xca\x61\xa4\xa9\xd6\x58\x92\xf7\x99\x6e\xd0\x01\x54\x69\x01\x12\x41\xd4\xec\x59\x62\xad\x22\x33\xa4\xa4\xdd\xce\xda\xb6\xce\xa4\x30\xe6\x15\x5e\x26\xae\xed\xbd\xda\x96\xcb\x03\xa8\x45\xf1\x28\x3a\xfb\x03\x98\x98\x00\x36\x53\xbb\x33\x4d\x1d\xd0\xb5\x16\xc6\x02\x33\xae\x11\xf5\xe1\xd6\x0c\xd1\x76\x75\xe2\x57\x3b\x81\x35\x24\x9f\x22\x6e\x16\x72\x32\x4b\x6d\xbb\x51\x27\xdf\x92\x1c\xab\x09\x3a\x86\xe6\xf5\x65\x5d\xdb\xe1\xe7\x5e\x85\x5c\xd7\xeb\x6c\x5d\xd9\x21\x17\x34\xe2\xca\x03\xbc\xa0\xa5\x40\xa4\xe4\x90\xfc\x2f\x66\x14\xe6\xd1\x3f\xe7\x4e\x0a\x54\x7d\xb3\xa6\x8a\xda\xd9\x56\x4d\x5a\x9a\x30\x5b\xec\xc2\xe1\xc7\xb2\x40\x8c\x6f\x50\xfe\x06\x7f\x14\xd2\xb3\xc4\xc9\x3a\x81\x4b\x24\xf0\x42\xfd\xbf\x3c\x44\x0b\xb8\xdc\x32\xad\x78\x1a\x0d\xeb\xe3\xd0\x09\x91\x8f\x23\x32\x86\x83\x82\xbb\x09\xc1\x47\xfd\x7c\x9a\xa5\xa4\x32\x9d\x47\x10\x14\xe8\x3d\xe6\xa0\x97\x3a\x1a\x6a\x6b\x21\x74\x40\x8f\xb5\xbc\x3e\x06\x3c\x86\xd7\xdb\x1c\x31\x58\x53\x68\xee\x4e\xf5\x81\x3d\x00\x5f\xa3\xbe\x4c\xe2\x32\x3d\x81\x4b\xaa\xb6\x9d\xb3\xcd\x57\x8c\x16\xd0\x18\xa1\x99\x3d\x18\xa4\xb4\xe9\x07\xe3\xd6\x9d\xa4\x9d\x4d\x1c\xda\x8b\x56\x4d\x3a\x8c\x1c\xce\x94\x76\xf7\x5c\x03\x94\xde\x32\x5c\x48\x35\xb2\xde\xe9\xd3\xd7\xd9\x6f\x21\xd4\x7b\xe8\xfb\x3a\xfc\xf4\xc8\x15\xff\xcd\x69\x99\x34\xcb\x4e\x5b\x72\x80\x08\x91\xe3\xf9\x1e\xdc\x1d\x72\x3e\x45\xf3\x6b\x87\xd3\xce\x06\x99\xbe\x3f\xce\xac\xc7\xa1\x23\x35\x07\x76\x4e\xc7\xda\x73\x2d\xc9\xce\x16\xd5\x77\xf7\xf2\x1c\xa8\xd8\x60\x06\x4b\xc4\x31\x87\x48\x09\x00\xae\xea\xbc\x62\x78\xcb\x37\x74\x9b\x67\x6a\xb3\xd1\xe5\x72\xcb\xde\x8d\x2e\xe9\x17\x19\x1f\x0d\x8b\x84\xc0\xd6\x98\x0d\x1e\x8a\xee\x1a\xc1\xc0\x68\xa8\xdc\x0c\x20\x56\xe6\x59\x57\xd8\x07\xa5\xbc\x39\x67\x4b\xc4\xd8\x0e\x68\xe9\xef\xdb\xc1\x0d\xe7\x1d\x2e\xa7\x96\xe5\x9e\xb2\xdd\x8a\xf6\x90\x4e\x49\xfc\x13\xf5\xf6\xdd\xcd\x4e\xf4\xf3\xb5\x8e\x5c\x8a\x5b\xf0\x42\x02\xa6\xa7\xde\x28\x83\xe8\x68\xa9\x10\x07\x4e\xad\x33\x73\x1b\x2c\xed\x9c\x4e\x03\xfe\xcf\xfb\x7d\x03\x3e\x9f\x43\x24\x7b\x35\x48\xc4\x75\xfd\x73\xbc\x80\x47\x3e\x41\xa0\xa1\xc8\x58\xdd\x7a\x9a\x42\x85\x4a\xb2\xe4\x12\x04\x69\xa7\x90\x15\x31\x3e\x15\x91\xc2\x52\x59\x72\xde\x88\x82\xaf\x55\x3a\xbc\x10\xc9\x6b\x0d\x53\x34\x37\xfd\x7c\x53\x42\x25\xbe\x1a\x63\x03\x7a\xd0\x9d\xc1\xdf\x6e\xe7\x8b\x5e\x99\xbc\x02\x27\x2a\xf8\xda\xfd\xdc\xe1\x82\x5b\x7f\xd2\xcf\xe7\xd9\x56\x2f\xee\xd9\xf6\x30\x4e\xe7\x88\x75\xb5\x0f\x99\x40\xfd\x53\xd1\x7a\x75\x5e\x7d\xae\xc4\xec\x97\x2f\x11\x7b\xe4\x96\x88\x05\xd9\xbe\x68\xa9\xe1\x78\x55\x20\xbd\x39\x53\x9b\x35\x6c\x56\xdb\x33\x27\x85\xa1\x34\x84\x6f\xe8\xb6\xcc\x6c\xf8\x53\x57\xea\x2b\xaf\x6c\xb3\x2d\x50\xe9\x95\xc8\xd2\x0a\x6b\xd3\x48\xae\x21\x76\x15\x59\xa2\x3c\x57\x3e\x19\xc7\x80\x18\x06\x7a\x23\xa7\xc6\x99\x56\xd0\x08\xa4\x9b\xa4\x5c\x7f\xcc\xc5\x2c\x4d\xe5\x30\xe3\x72\x9d\x39\x96\xaa\xd4\x70\x66\x89\x99\x52\x07\x63\xe0\x73\xc1\xb6\x4b\x01\x7b\x93\x1e\x7e\xfa\xe6\xcd\x4b\x30\x2b\x80\x2e\x53\x98\x81\xfa\x6a\x3f\x9e\xb8\x40\xc0\xcf\xf2\x74\x9d\xcd\x4f\xe7\x3f\xcf\xc2\xd6\x70\x7a\x62\x36\xc3\x25\x96\x4c\xac\x44\xe3\x64\xdf\xe4\x74\xf9\xbe\xf1\x6b\x7b\xcd\x6e\x4d\x5f\x27\x1e\x62\x7f\xe9\x62\xc5\x6e\xdf\x67\xe8\x23\x29\x74\xc1\x1c\x80\xf9\x61\x77\x59\x72\xf5\x71\x99\x6f\x39\xb9\xc5\x6d\xaf\xaf\x3d\xce\x3b\xc3\x7b\x13\x93\xd2\x99\x58\xff\x08\x4c\xdc\xf4\xfa\xa6\x33\x71\xd3\xd0\x9b\x78\x9b\x0b\x52\xe5\xf8\xc5\xca\xcc\x6d\x7e\xc3\x8b\x95\x29\x36\x75\x3b\x04\xf0\xfd\x01\x97\x6b\x15\xfc\xd1\x18\x83\xfe\xdd\x14\xaa\x36\xcd\x01\x8c\xbc\xa1\xa4\xf4\x87\x3a\xcd\xdd\xa1\x2f\x95\xac\x2e\xf5\x40\xf3\xe3\xcc\x04\x1f\x6c\x4b\x00\x52\xa7\xe2\x5a\x02\x1a\x2e\xa8\x0d\x80\xe9\x8e\x23\x25\x84\x2b\x8c\xbb\xe3\x3a\xa5\xaf\x00\xfa\x43\x78\xdb\x38\xf1\xb1\x19\xc0\xb5\x41\xc6\xf9\xda\x1d\x10\xce\x3b\xb4\x5f\xc1\x4b\x55\xf4\x3b\x77\xe7\xeb\x4a\x4b\xf3\xc3\x2f\xbf\xea\x59\x3e\xad\xac\x3e\x49\x67\x9e\x57\x69\x4c\x21\x6d\x39\x75\x2e\x45\x7c\xe6\xba\x5c\xc7\xae\x75\xcd\xb9\xfe\xa5\x81\x23\xaf\x0c\x74\x3a\x59\x40\x46\x16\xf7\x55\x5f\x6d\x05\xfc\x13\x52\x66\x56\xa4\xdd\x50\xb1\x81\x1b\x52\x66\x5c\x01\x62\xe3\x33\x1c\x90\xf2\x7c\x31\x17\x0b\x20\x02\x10\xe7\xdb\x02\x73\x10\x1b\x24\x60\xa9\xeb\xba\x40\x6c\x48\xb9\xe6\xa0\x2c\x6e\x25\xd7\x10\x98\x04\x8c\x84\x37\xd2\x0e\x67\xf2\x0a\xaf\x09\x17\x6c\x17\xeb\x68\xae\x73\xc1\x22\x4d\xdd\x2a\x3d\x1b\x4a\x11\x70\x47\xf2\x1c\xb6\x1c\x2b\x6b\x51\xc5\xe2\x0a\x2c\x36\x34\x03\xa9\x31\x78\x62\x74\xc1\x1b\x0a\xb8\xe4\x5b\xd6\x0d\xc6\x2c\x74\x70\x4e\x4b\xfa\x62\xcb\x05\x6c\xd0\x2d\x86\x1b\x8c\x4b\x37\x4e\xa3\x5d\x9e\x83\xa1\x96\x1b\xbc\xa2\x0c\x6f\x50\x99\x25\x3a\x38\x13\x05\x2e\x85\xc0\xc9\xc8\x24\xb1\x4b\xef\x88\xf9\x2a\x65\x01\xea\xb2\x0e\x9c\xb4\xd1\xb7\xe4\x19\x12\xcb\x0d\xce\x5e\xc9\x06\x4b\xb4\xbd\x09\xda\x30\xcc\xe1\xed\x3b\xf5\x6d\x36\x70\x41\xc5\x55\x5f\xe7\x60\xbb\x99\x33\xf7\x3f\x5b\xcc\xda\xab\x6a\x1f\xb8\x4a\x95\xea\x00\xa0\x0e\x0e\xf3\x88\x25\x3f\xbe\xfa\x21\x51\x1d\xa3\xd8\xc9\xba\x79\xf3\xc8\x73\xdd\x4c\xd3\xda\xa8\x4c\x17\x41\x6a\x09\x8e\x98\x90\xdd\xa2\xff\xfe\x3b\x7c\xfd\x35\xfc\xfd\x8b\xae\xb5\xf9\x97\xbf\xb4\x75\x8e\x8a\x26\x57\x8c\x3d\xa7\xa2\x19\xdc\xbb\x48\xe9\xa6\x04\x9e\xe3\xbb\xe8\xcb\x2f\xbe\x58\xcc\x7b\xa6\x62\xdd\x18\xeb\x3e\x50\x0a\x96\xf1\x9b\x9a\x13\x17\x98\xfd\xa5\xf6\x29\xa1\x28\xe7\x86\xc4\x56\x59\x98\xb2\xb2\x73\x1c\xb4\xbe\x06\x0c\x8a\x59\x27\x74\xe6\xba\x08\x4d\x99\x74\xcb\x54\xc9\xd3\xe0\x56\x5c\xc0\x87\xcd\xfb\x81\x96\x7f\x49\x50\x3f\xf0\xe4\x3b\x2c\x5e\x7c\xdf\xad\x4a\x1c\xbf\x89\x26\x05\x47\x40\xe0\x46\xc7\x03\x71\xbf\x3b\x6b\xbe\x87\x26\xc1\xb7\xe4\x60\x43\xeb\x8d\x93\x43\x83\x63\x42\xa8\x0f\x48\x98\xe3\xc1\x79\x48\xc2\x3c\xc5\x28\xc3\xcc\x92\xe6\x13\x31\x48\xf4\x2c\x6f\xd5\x91\xbd\x40\x25\x2d\xa5\x25\xaf\x3f\x7e\x8f\x77\x1e\x9d\xde\x2d\x94\xf5\xf1\xb0\x58\x34\xb2\xc7\xb9\x69\x60\x5a\xfc\xc0\x72\xef\x82\x51\xf8\xda\x91\x06\x7d\xd1\x8a\x0b\xb9\x80\x9c\x6a\x80\xe5\x16\x6e\x7b\xfc\x5c\xdf\xeb\x51\x57\xa0\x3d\x23\x9c\x93\x72\x2d\xa7\x6b\x0f\xfd\x30\xc6\xae\xe4\x81\x39\xc3\x28\x23\xe5\x5a\x67\xa5\xfe\xf6\x01\x56\x88\xe4\xd2\x11\x90\x22\xa9\x9b\xf8\x8c\x7c\xbc\x62\x7b\x39\xc0\xb9\xb9\x1f\x82\xd8\x97\x96\xe7\x41\xc0\x0d\x8b\x54\x32\xe3\x94\x56\xba\xe2\x56\x37\xc3\xcd\x56\x00\xad\xf4\x13\x05\x1a\xce\xc6\x37\x9b\x75\xfc\xf2\xee\x62\x47\x6e\xbc\x63\x19\x1a\xda\x65\x7d\x07\x2b\x4d\xfb\x0e\x96\x25\xeb\x3f\x4b\xfd\x6e\x97\x06\x7e\x78\x87\x6a\xac\x8e\xbf\x3f\xff\xc8\xea\x07\xb5\x3b\x2e\x91\x40\x67\x41\x7c\x16\xa0\x31\x0a\xb7\xea\xb6\xda\x2d\xe2\x37\x56\xe7\x2a\x1b\x90\x29\xab\x6c\x5c\xfa\xad\xb2\x07\x15\x7a\x9f\x02\xc7\xfd\xef\x30\x37\x1a\x36\x3d\x51\x7f\x26\xad\x74\x68\xef\x14\x74\xfa\x28\x2d\xab\x75\xac\xd3\x67\x28\xf6\xf7\xa7\x02\xfe\x53\x01\xff\xe1\x14\xb0\x89\xd2\xb7\x4a\xf8\x8f\x2c\x67\x02\x76\x7c\x27\x9b\xd1\x3c\x0d\xd2\x84\x28\x4e\x6d\x59\xa1\x95\xfe\x4f\x11\xd7\xcf\x36\xc4\x9d\xab\x1b\x1d\x57\xdf\xad\xed\x9c\xaa\x62\x58\xf2\xc4\x7b\x2b\xc1\xa9\x6b\xca\xf0\x0a\x33\xd3\x21\xb9\xc8\x29\xc7\x51\x1c\xb8\x75\xd0\x0b\x4a\x38\x9f\xae\x3e\x56\x94\x89\xb6\x70\xeb\x86\x66\x3b\xf7\x46\xa2\xa0\xa6\x36\x47\x01\x94\xa8\x07\xb9\x78\x5b\xae\xd3\x66\x33\xf6\x7b\xc8\x18\xad\x6c\x53\x5b\x33\xdc\x7b\xa5\x43\x95\x79\x36\xd4\x8e\x34\xf8\x96\x8d\x17\xb4\xe4\xdb\x02\x1b\x5f\x2d\x74\x8b\xce\x25\x6f\xbf\xec\xac\xb5\x82\x08\x4d\xae\x5e\x7c\xeb\x0c\x52\xdf\xef\xf1\xa6\xd2\x7c\x6e\x89\xeb\xdf\x81\x71\xf2\x71\x23\x2f\x05\x75\x79\x77\x8b\x58\xf3\x8a\x89\x53\x60\x0d\x5e\xc2\xc8\xa7\x89\xfd\xa3\x21\xd9\x23\x39\xc1\x90\x3f\xfc\x49\x34\x9a\xf4\x06\xd5\x41\x9b\xf5\x10\x19\x1b\x3a\xba\x66\x57\x80\x9c\xe3\x16\xb6\x0a\x09\x5c\xc9\x9f\x0f\x01\x54\xdf\xd2\x1e\x22\x5f\x9f\xfb\x03\xe9\xaa\x1e\x82\x7e\x3d\x61\xe7\x45\xd7\x64\xa4\x14\xd1\x2f\x98\x76\x40\x72\xe7\xff\x7c\xbc\x0b\x40\x38\xfc\xc3\x7d\xa5\xaa\xad\xaa\xf6\x23\x35\x17\xb4\xa8\x28\x27\xc2\xa9\xfe\xd6\x8c\x65\x98\x27\x49\x62\xd7\x34\x83\x4a\x92\xcf\xcc\xfd\x99\xff\x5c\xe6\x88\x73\x25\x9b\xce\xce\x21\xea\x08\xd0\xd8\xa4\x07\x83\x21\x19\x7b\x3d\xc4\xf5\x38\x67\x69\x0a\x03\xaa\xc9\x44\x58\x7d\xff\x48\x1d\x5e\xd5\xdc\x84\x34\x37\x18\x68\x99\xef\x80\x6f\x2b\x23\x59\xdd\xcb\x26\xb4\x54\x33\x70\x95\x2d\x6b\xd3\x15\x52\x4c\x37\x79\x8f\x03\x41\x4a\x07\xe5\x36\x3e\x39\xa8\x4f\x55\x31\xa4\x0d\xc7\x29\xfb\x79\x01\x1b\x65\x67\xc0\x89\xff\xdd\xb8\x5c\x4e\xb4\x12\xdc\x97\x6d\x5b\x60\xbb\x09\x1c\x00\xae\x5e\xfd\xd0\xf6\x00\xc9\x71\xf2\x1a\xe3\xf7\xd1\x17\x0b\x29\x5e\xe4\x9f\x57\x65\xa6\xcf\x55\xa8\xf1\xb5\x40\x4c\xc4\x43\xd5\xb7\x5e\xd2\xa7\x15\x8f\x72\x41\xf8\x5a\xbd\x33\xd2\x36\x7a\x62\xcc\xdd\x5d\x57\x1f\x97\x18\x67\xdc\xe4\xb3\x8e\x7b\x0c\xc4\xcb\x29\x2d\x40\xbd\x62\xb0\x50\xeb\xc7\xe3\x75\xc3\x5e\xa6\xab\x03\xf9\x37\xe6\x85\x94\xc9\x90\xeb\x14\xdf\xb1\x90\x3b\x6c\x9a\x0a\xb9\x77\xc2\xfc\x32\x21\x7b\x0b\xac\xb1\x86\x7c\x64\xf5\xa3\x5e\xa3\x95\x1f\x53\xce\x97\x9f\xc1\x08\x1c\x34\x9d\x5a\xee\xa4\xba\x0e\x05\xf6\x8f\x3a\x33\x0c\xdd\x49\x47\x1e\xde\xbe\xd3\x45\x2a\x0b\xd8\x20\xfe\x3d\xde\xc1\x0d\xa5\x79\x73\x1b\x0d\x06\x72\x23\xfb\xbe\x01\x66\xf3\x4e\x8d\x4f\x15\xf7\xd5\x0a\x59\xc1\x5f\xcd\x32\x43\x9b\xe1\x13\x4c\x16\x83\x8a\xcb\xf0\x1e\xcb\x55\x4e\x02\xdd\x99\xf2\x41\x0b\x8c\x12\xd9\x66\xb4\x23\xb6\x15\x54\xe8\x4e\x9a\xa5\xba\xf1\xad\xdb\xf1\xf4\xbf\xde\x99\x95\x74\x72\xbe\x0d\xcb\x68\xc6\x74\x35\x69\xd8\xfb\x4e\x53\x78\x9c\xe7\xf4\xee\xaa\xa8\xc4\x4e\xc5\xdd\xf5\xf8\xce\xc7\x40\x46\xd2\x77\x5b\xd3\x14\x5e\x36\xfb\x87\x70\x55\x0d\x4e\x32\x5d\x46\xbe\xa4\xa5\x4e\x2f\xa9\xd7\x09\xe5\x8e\x12\x1b\xac\xcd\x2d\xff\x92\x12\x04\x32\x8f\x41\x3e\xea\xc6\x0e\x8c\x71\xeb\x2a\x0c\xbd\xd9\x6a\xae\x39\x1e\xc5\xd3\xb0\x93\xd3\x79\x73\x00\xa0\xe7\xf4\x45\xd0\xc5\x00\x62\x75\x75\x5f\x03\x6f\x41\x8a\xc7\xf0\x50\xdc\x3f\x87\xf9\x1c\xf6\x92\xc5\xfa\x29\x7c\x93\xf8\xab\x10\xe7\x4e\x8d\x9d\xa3\xf8\x06\x0b\x6c\xd2\xd4\xe6\x8d\xed\x24\x6d\xaa\xaf\x62\xf8\x96\xd0\x2d\xcf\x77\x5e\xd6\xef\x66\x67\x72\x7e\x81\x53\x1d\x75\xee\x98\x39\xf2\xcc\xa7\x4a\x9f\xc3\xde\xdb\x2b\xfe\xf3\x20\xbd\x97\x59\x24\x0f\x7e\xc1\x47\x3e\xba\x8d\xed\xab\x04\x60\x56\x36\x4e\x6a\xe8\xf1\x88\xf3\x70\x58\xbb\x41\x5a\xa1\x16\x2c\x8b\xeb\xcb\xeb\x34\xf5\x8a\x02\x1e\xfa\x1d\x15\xf8\x3d\xd0\xd1\x7b\xad\xb2\x5b\x67\xe0\x1b\x90\xad\x9f\x6f\x45\x85\xe5\x80\x9f\xe3\x77\x5e\x60\x71\x80\x72\x8a\x15\x25\x53\x86\xde\xee\x3a\xc8\x60\x86\xee\x06\x37\xba\x39\x84\xfe\x25\xcb\x4f\x7e\xaa\x32\x1a\xbc\x99\x3d\x22\x8f\x3a\xa5\x7a\xd6\xd4\x18\xa8\x02\x3f\xde\x66\xd0\xd7\xe6\xa6\x5b\x0e\xda\x6e\x7f\xac\x0b\xc6\xa5\x59\x5e\xc9\xcd\x9b\x01\x5a\x2e\x29\x53\xb9\x1b\x41\xa1\x7f\x9f\x77\x3e\x50\x25\x33\x87\xa8\xa9\x47\x17\x14\xe6\x4b\x7e\x3b\xd7\x77\x8f\x94\xa8\x8c\x7f\x93\xa6\x4a\xc7\xab\xec\x19\x23\x0f\x69\x88\x8c\x4b\x61\xfc\x21\x40\xd5\xb9\xf2\x54\xe6\x46\x09\xa9\x4b\x6a\xc1\xeb\xd5\xc1\x02\xa7\x69\x17\xc8\xcf\x1a\x8b\xa6\x23\x1a\x4f\x9b\xdb\x36\x1f\x6e\xc3\x21\xba\xc6\x70\x1a\x36\x9b\x86\x86\x86\xcd\x28\x38\x05\x65\x48\x59\x33\xea\x17\xc1\x36\x70\xdf\x7b\x00\xca\xc0\x05\xcd\x83\x77\xbb\xcd\xa6\x52\xe1\xc7\x43\x26\xd2\xf8\x1d\xed\xe0\xed\x6c\xe7\xb5\xeb\x7b\x6f\xcd\x69\x4b\x06\x8c\x2a\x75\x4e\x8e\x06\x3a\x70\xcf\xea\xd7\x30\x85\xc2\x77\x09\xc6\x6f\xba\x37\x3b\x6c\x50\x2b\x1d\xbe\xd2\xea\x7b\x47\xa3\xff\xea\xc6\x67\xd3\x49\xee\x3f\x4d\x11\xd0\x4a\x9d\x47\x19\xcc\x2d\x81\x40\x29\x62\x47\xb3\xc6\xba\x93\x67\x3c\x74\x91\x8d\x8d\x82\x1b\x41\x48\x5d\xcb\x20\x58\xc5\x8e\xba\x8f\x66\x05\xb4\xdc\xa7\xa8\x97\x09\xe4\x1c\xd3\x21\xd3\x1f\x1f\x3b\x40\xdf\x8e\x05\xe0\x86\x1a\x54\x7e\xd7\x79\xee\xd9\x94\x13\xaa\x7f\xe1\xc4\x79\x12\xbc\x7b\xff\x71\xe0\xa1\x97\x36\x37\x12\x7a\x00\xbe\x29\x29\xf5\xff\xbd\xa7\x38\xd0\xa0\xde\x2e\xf7\xa2\xbf\xfe\xbf\xc5\xd4\xd9\xd7\xe3\x9c\x96\x13\xba\x86\x4c\x19\x46\xed\x81\x39\xac\x12\x57\x13\x2d\x05\x08\x3c\xab\xe3\xdd\xde\x38\x70\xaa\xdd\xff\x4d\x79\xd3\xe3\xc0\xe5\x27\x08\xbd\x22\x32\xb2\xe8\x64\xe5\x18\x96\x71\xdd\xb9\x26\x08\x4b\xaf\xff\xfd\xc5\xe6\x00\x15\x86\x1f\x24\xfa\xc5\x31\x1f\x7e\x99\xe8\xc1\x51\x0f\xbd\xea\x70\x9c\xf0\x09\x10\xb0\x27\x8f\x82\xc1\xdc\xf0\x83\xee\xf6\xaf\xff\x0f\x00\x00\xff\xff\xf1\xc0\x2a\x5b\x38\x70\x00\x00") func templatesServerParameterGotmplBytes() ([]byte, error) { return bindataRead( @@ -555,12 +722,12 @@ func templatesServerParameterGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/parameter.gotmpl", size: 28790, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x37, 0x9f, 0x40, 0x42, 0xd3, 0x19, 0xb5, 0xaa, 0xd7, 0x86, 0x7, 0xb2, 0x39, 0x79, 0x9a, 0xee, 0x52, 0x8f, 0x51, 0x65, 0x98, 0xa2, 0xbd, 0xd5, 0x1a, 0xb5, 0x94, 0x4a, 0x4f, 0x3e, 0xb0, 0x2f}} + info := bindataFileInfo{name: "templates/server/parameter.gotmpl", size: 28728, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4b, 0x53, 0xb9, 0xa3, 0xe8, 0xc6, 0x71, 0x82, 0x7a, 0xd6, 0x71, 0xb9, 0x4e, 0x13, 0x9f, 0xe, 0x59, 0x1c, 0x98, 0xc, 0x37, 0x19, 0xbf, 0xc4, 0x84, 0x11, 0x3c, 0x3e, 0x24, 0x20, 0x65, 0x31}} return a, nil } -var _templatesServerResponsesGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x4f\x93\xdb\x36\xb2\xbf\xf3\x53\x74\xf4\x9c\x94\x34\x25\x91\x7e\x87\x77\x99\x44\xa9\x7a\xf1\x78\x37\xb3\xb5\xb1\xa7\x3c\x93\xdd\xaa\xf5\xba\x62\x0c\xd9\x92\x10\x93\x00\x0d\x80\x1a\x6b\x55\xfc\xee\x5b\xf8\x43\x12\xe0\x1f\x8d\xc6\x49\x7c\x4a\x0e\xf1\x10\x40\x37\xba\x1b\xbf\x6e\x74\x37\x74\x3c\x42\x86\x1b\xca\x10\x66\x12\xc5\x1e\xc5\x0e\x49\x86\xe2\xbe\xa2\x79\x86\x62\x06\x75\x1d\x1d\x8f\x40\x37\xc0\xb8\x82\xf8\x5a\xfe\xbf\x10\xe4\x00\x75\x7d\x3c\x82\xc2\xa2\xcc\x89\xd2\x94\xb4\x28\x73\x1c\xa5\x8f\xed\x5a\xcc\x25\x0e\xa8\x72\x9a\x9e\x26\x62\x99\xdd\x7f\xd5\xfd\xd9\x49\x3b\xbd\x67\x2b\x73\x7c\x2d\x5f\x55\x79\x4e\xee\x73\x84\x55\x5d\x47\x7b\x22\xe0\x78\x84\x3d\x11\x8c\x14\x08\xf1\xf5\x15\xd4\x35\x48\x25\x28\xdb\x46\x74\xa3\xe7\xe2\x37\x98\x22\xdd\xa3\x78\xa5\x57\xd4\x75\x7c\x3c\x42\x49\x64\x4a\x72\xfa\x9f\x96\xe2\xab\x35\x30\x9a\xc3\x31\x82\x11\x76\x6b\x70\x9b\xff\x85\x8b\x82\x28\x85\xc2\x6a\x13\x7c\xcf\x2f\xce\xdc\x6b\x11\x18\xaf\x3b\x87\x17\x95\x54\xbc\xf0\x59\x5e\xb4\x16\x3b\x93\x75\x6b\xa3\x21\xaf\xf8\xd6\xd8\x64\xbe\x38\x1e\x91\x65\x7a\xa9\xf9\x27\x32\x86\xed\xc4\xe9\x69\x7e\x79\x9e\xea\x9f\xa5\xf9\x1f\xa4\x90\xb3\x99\x06\x87\x3d\xff\x9e\x4a\x5f\xad\x61\x36\x33\x07\x2d\x1e\xe2\x1f\x0d\xcc\xe6\x8b\xf8\x16\x95\xd6\xa2\x14\x94\xa9\x0d\xcc\xbe\xfe\x38\x83\xd8\xc9\xb5\x1c\x32\x59\x44\xed\x3e\x3d\x08\x6b\x07\xa0\x0a\x8b\xcf\x42\x71\xfc\x0f\x92\x57\xf8\xf2\x53\x29\x50\x4a\xca\x19\xd4\xf5\x6d\x0f\xcb\xc3\x15\x3d\xe8\x8e\xf2\x78\x02\x80\x87\xe4\xde\xa9\x4d\xac\xf8\x4d\xb0\x5b\x59\xab\x8c\xca\xfd\x04\xf8\x9d\x94\xfb\x77\x13\x7b\x00\xae\x51\xb1\x3b\x88\x8d\xaf\x78\x03\x6b\x20\x65\x89\x2c\x9b\x10\xfd\xcd\x72\x8a\x77\x1f\x79\x01\xf0\xa6\x40\xd7\x0f\x92\x2f\x76\x34\xcf\x46\xe5\x7a\xfb\xce\xc1\x6d\xc3\x05\xfc\xb2\x3c\x8b\x4a\x9f\x92\x20\x6c\x8b\x53\x00\xb5\x86\x58\xb5\xa1\xce\x32\x9a\xba\x78\x4e\x7a\x90\xa5\xfd\xac\x0b\xc8\xa7\x74\x47\x18\x5c\x84\x56\xaa\x1b\x22\x90\xa9\x06\x94\xc3\x68\x28\x1f\xc8\x36\xfe\x1b\xa7\xec\x87\x83\xc5\xcb\xfc\x2c\xc3\x1a\x4b\x06\xc1\xe5\x05\xcf\x73\x4c\x15\xe5\xcc\xf2\x31\x51\x85\x6e\x20\x47\x36\x1f\xc6\x1b\xf8\x1e\x9e\x1b\x3b\xee\xf6\xce\x29\xc2\x05\x6f\x9f\xbf\x8b\x40\xab\xb2\xdb\x7b\xe8\x7b\x42\x88\xdb\xed\x17\x11\xc0\x13\xfc\xf2\x4b\x19\x62\xd4\x09\x5a\x73\x4c\x2c\x90\xce\x48\x63\x73\xad\xa9\x26\x69\x7d\x03\xfe\xee\x0e\x2c\x7d\x3b\x3b\x1c\x86\x7f\x86\xc9\x9b\x40\x59\x72\x26\xd1\xcf\xdb\xb4\x81\x79\x86\xb0\xfa\x5f\xa8\xeb\x24\x81\xe3\xd1\xbb\x37\xf5\x91\xd6\xb5\x99\xa7\x12\xd4\x0e\xe1\xc7\xbb\xbb\x1b\x48\xf5\x80\x40\x55\x09\x86\x19\x68\xf7\x56\x87\xd2\xb8\xec\x80\x36\x4a\x39\x93\x6a\x74\xca\xb2\x65\xca\xde\x28\x56\x0a\x3f\xb1\x8b\x92\x0b\x17\x55\xaf\x50\xa6\x82\x96\xaa\x0d\xb5\x3d\x5e\x26\x30\x1c\xe1\x3e\xe7\xe9\x87\x94\x17\x85\xf6\xba\x01\x91\x06\xe2\x09\xe2\x5d\x55\x10\xe6\x0f\x36\x61\x3a\xd2\xe8\xdc\xa2\xb8\x6c\xac\xa7\x57\xa7\xa4\xc0\x80\x45\x74\x91\x44\x13\x46\x70\x49\x64\x95\xaa\x06\x66\x74\x03\xf8\xd1\xb7\x7b\x04\xf0\x8b\x54\x44\x55\xb2\x31\x8a\x5d\xd8\x26\x6c\x36\x26\x3a\xff\x93\xfa\xa4\x2e\x8e\xc7\x51\xd3\x9c\x36\x42\x63\xdb\x46\x8c\xf8\x27\xf2\x89\x16\x55\x61\xc7\xdc\xc7\x65\x33\xf9\xf2\x53\x9a\x57\x92\xee\xb1\x5b\xf5\x5d\x20\x96\x47\xee\x0f\x1b\xc6\x94\x79\x8c\xed\xc7\x08\xe3\x76\xd5\xf7\x3d\xc6\xed\xc4\x80\x71\x95\x2b\x5a\xe6\xf8\x7a\xe3\x78\xbb\x6f\x78\xbd\x31\xfc\xc3\x05\x03\x6a\xf2\xe9\xef\xc8\xb6\x6a\xd7\x6a\x0c\xf6\xdb\xd1\x7a\xd3\x23\x1a\x05\xa4\x94\x85\xa4\xde\x74\x9f\xf4\xc6\xe4\x02\xcc\x12\xba\x0f\x4b\xd5\xcd\x8c\x48\x7a\xad\xaf\xae\x4e\x50\xf3\xd9\xca\xd9\x4c\x8e\x88\xe9\xd3\x51\x16\xd0\x75\x93\x7d\xba\x9f\x19\xfd\x58\xa1\x47\x6a\x07\x2e\x41\x89\x0a\xfb\x8b\x7f\x24\xf2\x0a\x37\xa4\xca\x95\x5d\xeb\x3e\x2e\x83\x88\xfc\x3f\xfb\x99\x46\x60\xb3\xcc\x47\xdf\x45\x62\x21\x38\xee\x8b\xf1\x5f\xf9\x9d\xf6\xa5\xba\x86\xf7\xbf\x4a\xce\x2e\x67\xc7\xa3\x0b\x1a\xde\x25\xfb\x06\x3f\x56\x54\xa0\xe6\xb8\xe4\x85\xbe\xe6\x4b\x75\x68\x37\x99\xbd\xf7\x5d\xa8\x03\xfc\x6d\xba\xc3\x82\x58\x71\x1e\xa8\xda\x79\x23\x11\xc0\x6f\x73\xab\x3f\x7d\xea\x4f\x9f\xfa\x0c\x9f\x8a\x00\xae\xd9\x25\xfc\xc0\xb3\x83\x71\x0d\x7f\xe2\x86\x1c\x72\x4e\x32\x77\xc8\x84\x65\x30\x37\xe0\xb7\xa0\x8d\xaf\xe5\x0f\x44\xa2\x76\x96\x85\x37\xf6\x82\x17\x65\x8e\x9f\x5e\xdf\xff\x8a\xa9\x1a\xd4\xfe\x6e\xd9\xc0\xc7\xee\x79\x76\xe8\x1c\xa9\xe7\x3f\xfa\x3a\x4e\xe0\x15\x3e\x8c\x3b\x6d\x2a\x90\x28\x94\x13\x2e\x6d\xfc\x2c\x73\x81\x60\xe7\xee\xb0\xbd\xce\x67\x64\xb4\xa9\x58\x3a\xc9\x77\x3e\x76\x59\xa6\xee\x8a\x6c\x85\x5b\xc0\xc5\x44\x28\x19\xbf\x6c\xe9\xc6\x66\x30\xdf\xad\x5d\xe6\x07\xf6\x7b\x0d\xff\xf7\xfc\xb9\xc9\xa8\x82\x7a\xdc\xc4\x3b\x2b\xb4\x8e\x7b\xb7\xbc\x40\x17\xd4\xdc\xa1\xea\x92\x68\xae\x83\x47\x02\x94\x51\x45\xad\x14\x8d\x9e\x81\xf2\x4e\x69\x63\xd9\xc1\x9d\x6e\x24\x69\x03\x95\x17\x62\x57\xed\x9c\x9b\xf7\x12\xf6\xba\x6e\x56\xad\xbd\x35\x76\xdd\xaa\xc1\x4c\x7c\x2d\x6f\x04\x2d\xa8\xa2\x7b\x1c\x2b\x52\x0d\xa6\xe6\xb6\x5c\x7b\xc1\x99\x22\x94\x49\x88\xff\x85\x82\xc3\x6c\xfe\xef\xd9\x0c\x16\x0b\x07\x1e\x33\xa6\xff\x4c\x2e\x74\x52\xb3\x29\x94\xcd\xfd\x3a\xc5\x05\x08\x1b\x98\x25\xfc\xcc\x0a\x22\xe4\x8e\xe4\x77\xf8\x49\xcd\x17\x4b\xc0\x78\x1b\xc3\x15\x51\xb8\x34\xff\x57\xb4\xd0\x7f\x55\x82\x98\x48\x7a\x91\x04\x7a\x36\x3a\x98\x0a\xe2\x5c\x45\x4e\xe9\x60\xe4\x76\xb8\x37\xd8\x5a\x4d\xde\x55\x8b\x93\x0a\x2a\xf2\x01\xa5\x6b\xa6\x3c\x59\xea\xf9\x78\x8b\x6e\xa1\x4f\xf9\x69\xe2\x09\xdc\x56\x39\x11\xb0\xe5\x7a\xa1\x63\x3f\x10\xf6\x11\xf9\xda\xda\xd9\x6c\xbf\x82\xe4\x02\xae\xb8\xb9\x60\x3d\x2c\x6f\x04\x2f\xa0\xe4\x52\xd2\xfb\x1c\x1b\x30\x4b\xa0\x0c\x18\x4a\x85\x19\x10\xcd\x42\xc2\x45\xd2\xc3\xea\x18\x16\x9b\x92\xdd\x3b\xc8\x66\x68\xd8\x3c\xe9\x63\xae\x15\xca\x42\x46\x2a\x41\x14\x6e\x0f\xd6\xcb\x7a\x78\x1b\x53\x7d\xa0\x7e\xd8\x40\x58\x3d\x71\x47\x1d\x39\xe3\x76\xdb\xf3\xb6\x9c\x30\xc2\x3c\xe8\x67\x3c\x82\x0e\xcd\x6f\xcb\x6f\x73\x9a\xe2\xb5\x77\xd6\x41\xb6\x75\x2e\x42\x2e\xc1\x36\xcb\xc1\x34\x3c\x1e\xc3\x4e\xa0\x8d\xad\xa7\x26\xf3\xbd\xe4\x02\x48\x9e\x03\x57\x3b\x14\x90\x12\x89\x12\xe6\x26\x04\x48\x73\x05\x2d\xe0\xad\xdc\xf1\x2a\xcf\x0c\xdc\x78\x9a\x56\xe2\xdd\xc9\x2d\x9b\x4b\xf1\x33\x65\xd1\x12\xb4\xe9\xde\x94\x5b\xf8\x7b\x04\x03\xc1\xc7\x22\x8a\xc6\x22\xf8\x68\xe8\x76\x5e\x95\x12\x21\x0e\xc0\x59\x88\xd2\x49\x78\x05\xae\xd4\xdd\xfe\xbf\x35\x92\x37\x81\x7c\xec\x06\x89\x43\xff\x79\xfb\xee\xfe\xa0\x70\xd0\xe6\xf1\xa2\xd0\xa2\x13\x6f\x2c\x9c\x84\x77\x16\xdd\x00\x17\x30\x7f\x72\x0c\x58\x8c\xf8\xa8\xc7\x59\x5f\xef\x42\xc0\xe5\xba\xef\x8b\x4e\xfc\xf7\xc7\x63\x2b\xbe\x9c\xc1\x5c\xaf\x6a\x95\x58\xd4\xf5\xfb\xc5\x12\xbe\x19\xf4\xc0\x9a\xf9\x6f\x0d\x73\xaf\x2b\xde\xfd\x97\x24\x50\x12\x46\x53\xa9\x45\x90\x25\xa6\x74\x43\x53\x7b\x88\x54\x87\xc6\x3d\xc9\x69\x16\x50\x14\x72\xab\xe5\xdc\x14\x2a\xbe\xb5\x32\xcd\x67\x6e\x5d\x98\x20\x98\x96\x8a\xcd\x1f\x86\xed\xb9\x4b\xf8\x7a\x3f\x5b\xa2\x10\x8b\x80\xb9\x91\x65\x5e\xc8\xad\x3f\xdc\x3b\x82\xa6\x31\x74\x1a\xdd\xe1\x83\x5a\xbb\xc2\xf6\x7b\x8c\xad\x86\xa9\x56\xdb\xe0\x1a\x64\x5b\x5e\x5f\xe3\xd2\xa4\x59\x4b\x9f\xe9\x78\x22\x34\x51\x64\x8e\x55\x8c\xda\x1e\xfd\xdc\xd8\x01\x65\xe1\x3e\x35\x1b\xaa\xeb\xb5\x82\x32\xa2\xb8\x58\xb4\xcb\xae\x99\x42\xb1\x21\x29\x76\x43\xb7\x4a\x20\x29\x16\xc1\xab\x4a\x5d\x7f\xe3\x27\xd0\xa3\x48\x59\x46\x9e\x8d\x9b\x7a\xb3\xb3\xb7\x49\xa0\x47\x93\xd1\x24\x81\x7f\x52\xb5\xbb\xed\xba\x3f\x24\xcb\x6c\xaf\xcd\x5a\x0e\x14\x37\x5f\x63\x3d\x2a\x68\x7a\x52\x36\x8d\x1e\x7b\x3b\x9b\xc8\x8d\x17\xbd\x5d\xe7\x4d\x56\x3d\x9d\x4c\xbb\x16\x69\xff\xa5\xcd\x6f\x5c\xad\xcd\x09\x77\x60\x19\x59\xef\x2a\x89\x5b\x54\x9e\xca\x12\xd5\x97\x50\x39\xd8\xd4\xd3\xf8\x09\xaa\x79\x3e\x31\x9a\xc2\xbb\xe3\x1c\x37\x61\x7b\xb2\xc3\x0e\xa2\x9e\x1e\xd1\xfa\xd9\x09\xb5\x9f\x3d\xa2\xf7\xb3\xf0\xac\x27\x0b\xac\x16\xcf\xad\x20\x5d\x0b\x66\x58\x5c\x3d\xeb\x03\x62\x20\x46\x3c\xae\x7c\xf8\xd2\xd0\xec\x75\x26\x56\x26\xba\xaa\x0d\x6c\xbe\xb4\x3d\xa7\x24\x3a\xc7\x9c\xbf\x8f\xd9\x42\x1c\x06\x8d\xad\x06\x83\x4d\xeb\xa0\x45\x5d\xe9\x06\xfe\xc0\x80\xe2\xf6\x9c\x97\x83\xb6\xc5\x54\x77\x62\xb2\x9d\xf1\x58\xdb\xe2\xc9\x81\xaa\xb1\xc7\xba\x31\xc4\x99\xd8\x6b\xe8\x5a\xb4\xfd\xc1\x76\xec\xb6\xfc\x32\x66\x3c\xdf\x5e\x7e\x42\x60\x50\x26\xa8\xc2\x37\xcd\xb3\x88\x33\x47\x9a\x53\x64\xea\x73\xf0\xe3\x73\x9b\x8b\x07\xd8\x29\x55\xc6\xcd\x80\x99\x15\x4b\x28\x05\xcf\xaa\x14\x05\x88\x8a\x29\x5a\x60\x7c\xe3\x06\x5a\x45\xc6\xfa\x2a\x49\xd2\x9e\x48\x97\x58\x35\x4f\x54\xee\xe6\xf6\x5e\x7e\xc7\x7f\x75\xb4\xf2\xef\x75\xaf\xa7\xec\x99\xde\x45\x34\xef\xa5\xf4\x0a\xf3\x79\x23\xaa\x1d\xd4\x69\x39\x32\x65\x8f\x27\x49\xde\x60\xc1\xf7\x08\x6e\x74\x65\x8e\x85\x33\x30\x4d\xb8\x56\x68\xd9\xdb\x58\x3c\xc4\xc6\x20\x6e\x9b\xb1\xcc\xe2\x91\x0b\x2d\xfc\x41\x43\xff\xf1\x6d\xd1\x3d\xb3\x07\x9a\xf5\x47\x47\x9a\x8d\xdd\x83\xe8\x14\xa0\x82\x74\xba\x57\x74\x35\x88\x77\x6f\xae\x13\x2c\x7c\x49\x46\x7a\xa2\x7e\x5e\xc7\x85\x37\x61\x0b\x88\xee\xfb\x27\x52\x2e\x9a\x9d\xe9\xa6\xdd\x7c\x1d\xe6\xfb\x06\x3c\x26\x4e\xd8\x43\x09\x02\xae\xf7\xdb\x03\xd3\x04\xf1\x6b\x21\x7f\x1f\xa8\xeb\x82\x94\x61\xee\xdb\xa9\xbb\xf6\x72\x72\x5b\x28\x79\xec\x73\x4a\x24\x4e\xbb\xbe\x57\x0e\x4d\x9b\xe4\x9c\x36\x71\x93\xe5\x8e\x46\x8a\x95\x8e\xac\x41\xe9\x60\xd1\x13\xec\xdd\xd0\xb8\xfe\xc9\x58\xa1\xd1\x14\x25\xa1\x25\xba\x2a\xae\xf1\xef\xc6\xaf\xe7\xe2\x61\xd9\x98\x69\xbc\x1c\xb3\x95\x8f\x2e\x88\xf4\x49\xe5\xa8\x4c\x18\x12\x98\xf2\x3d\x8a\x03\x14\x34\xcb\x72\x7c\x20\x02\x21\x43\x92\xdb\xbe\x8d\xda\x51\x19\x08\xf3\x38\xa8\xeb\x21\x5c\xbd\x0f\x2f\x34\x26\x09\x18\x77\xda\x22\x43\x5d\xcc\x67\x70\x7f\x80\x2d\x5f\xb9\x77\xe4\x6f\xe1\xea\x35\xbc\x7a\x7d\x07\x2f\xaf\xae\xef\xe2\xa8\x29\x0b\xe2\x17\xbc\x3c\x08\xba\xdd\x99\x9e\x81\x79\x88\x87\xf6\xbd\x29\x98\xf3\x62\x70\x54\x92\xf4\x03\x71\xbf\x96\xb9\x71\x7f\xbb\xe0\x7c\xb7\xa3\x12\x36\x34\x47\x78\x20\x32\x14\xc6\x64\xda\x56\x1a\x50\x9c\xe7\xb1\x5e\xff\x32\xa3\x8a\xb2\xad\x31\x8d\xa5\x2b\xcc\x8e\xa5\xd0\xe1\x69\x53\x29\xc3\x6a\x87\x0c\x0e\xbc\x02\x81\x2b\x51\xb1\x80\x53\xb3\x85\x11\x9b\xb0\x2c\x8a\x22\x5a\x94\x5c\x28\xd3\x1c\x9f\x31\x54\x89\x8e\xe8\x33\xfd\xb1\xa5\x6a\x57\xdd\xc7\x29\x2f\x92\x2d\x5f\xf1\x12\x19\x29\x69\xa2\x39\x9d\x98\x46\x21\xb8\x90\x27\x16\x98\x52\x9a\x28\x3c\xb1\xc4\x85\xe2\xc7\x57\x24\x12\xd3\x4a\x50\x75\x98\x45\xc1\xb5\xe2\xea\xbd\x6b\xa3\x99\xec\x75\x9d\x3e\xce\x20\x1e\xbb\x24\x2c\xed\xb3\x0f\x78\x58\xc2\x33\x5b\xe2\x5f\xae\x21\x0e\x98\xe8\x59\x97\x2d\xfa\xfc\xdc\xf2\x1e\xd7\xa0\xff\xd4\x5c\x91\xd2\x95\xec\xfd\x8b\xac\xfb\xd9\x47\x1c\x16\xf5\xed\xcf\x2b\x8c\x4a\xed\x45\xfe\x28\x97\x71\x02\xc7\xf4\xbf\x01\x00\x00\xff\xff\xce\x58\xee\xc7\x33\x2c\x00\x00") +var _templatesServerResponsesGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xdf\x73\xdb\x36\xf2\x7f\xd7\x5f\xb1\xd5\x37\xed\x88\x1e\x89\xcc\xf7\xe1\x5e\xdc\xba\x33\xd7\x38\x77\x75\xe7\x1a\x7b\x62\xf7\x6e\xe6\x72\x99\x06\x26\x57\x12\x5a\x12\x64\x00\x50\x8e\x4e\xc3\xff\xfd\x06\xbf\x48\x80\x3f\x64\xd9\x6d\xf3\xd4\x3c\xc4\x22\x80\x5d\xec\x2e\x3e\xfb\x03\x4b\x1e\x0e\x90\xe1\x9a\x32\x84\xb9\x40\xbe\x43\xbe\x45\x92\x21\xbf\xaf\x69\x9e\x21\x9f\x43\xd3\xcc\x0e\x07\xa0\x6b\x60\xa5\x84\xf8\x4a\xfc\x95\x73\xb2\x87\xa6\x39\x1c\x40\x62\x51\xe5\x44\x2a\x4a\x5a\x54\x39\x8e\xd2\xc7\x66\x2d\xe6\x02\x07\x54\x39\x4d\x8f\x13\xb1\xcc\xec\xbf\xea\x7e\x76\xd2\x4e\xef\xd9\xca\x1c\x5f\x89\x37\x75\x9e\x93\xfb\x1c\x61\xd5\x34\xb3\x1d\xe1\x70\x38\xc0\x8e\x70\x46\x0a\x84\xf8\xea\x12\x9a\x06\x84\xe4\x94\x6d\x66\x74\xad\xe6\xe2\xb7\x98\x22\xdd\x21\x7f\xa3\x56\x34\x4d\x7c\x38\x40\x45\x44\x4a\x72\xfa\xdf\x96\xe2\x8b\x0b\x60\x34\x87\xc3\x0c\x46\xd8\x5d\x80\xdd\xfc\x6f\x25\x2f\x88\x94\xc8\x8d\x36\xc1\xf3\xe2\xec\xc4\xbd\xa2\xc0\x78\xdd\x39\xbc\xaa\x85\x2c\x0b\x9f\xe5\x59\x6b\xb1\x13\x59\xb7\x36\x1a\xf2\x8a\x6f\xb5\x4d\x16\xd1\xe1\x80\x2c\x53\x4b\xf5\x9f\x99\x36\x6c\x27\x4e\x4f\xf3\xf3\xd3\x54\x7f\x96\xe6\x7f\x90\x42\xd6\x66\x0a\x1c\xe6\xfc\x7b\x2a\x7d\x71\x01\xf3\xb9\x3e\x68\xfe\x10\x7f\xaf\x61\xb6\x88\xe2\x5b\x94\x4a\x8b\x8a\x53\x26\xd7\x30\xff\xf2\xe3\x1c\x62\x2b\xd7\x72\xc8\x24\x9a\xb5\xfb\xf4\x20\xac\x1c\x80\x4a\x2c\x9e\x85\xe2\xf8\x9f\x24\xaf\xf1\xf5\xa7\x8a\xa3\x10\xb4\x64\xd0\x34\xb7\x3d\x2c\x0f\x57\xf4\xa0\x3b\xca\xe3\x09\x00\x1e\x92\x7b\xa7\x36\xb1\xe2\x37\xc1\x6e\x65\xac\x32\x2a\xf7\x13\xe0\x77\x54\xee\xdf\x4d\xec\x01\xb8\x46\xc5\xee\x20\x36\xbe\xe2\x2d\x5c\x00\xa9\x2a\x64\xd9\x84\xe8\x6f\x97\x53\xbc\xfb\xc8\x0b\x80\x37\x05\xba\x7e\x90\x7c\xb5\xa5\x79\x36\x2a\xd7\xbb\xf7\x16\x6e\xeb\x92\xc3\xcf\xcb\x93\xa8\xd4\x29\x71\xc2\x36\x38\x05\x50\x63\x88\x55\x1b\xea\x0c\xa3\xa9\xc4\x73\xd4\x83\x0c\xed\xb3\x12\x90\x4f\x69\x8f\x30\x48\x84\x46\xaa\x1b\xc2\x91\x49\x07\xca\x61\x34\x14\x0f\x64\x13\xff\x50\x52\xf6\xdd\xde\xe0\x65\x71\x92\x61\xb5\x25\x83\xe0\xf2\xaa\xcc\x73\x4c\x25\x2d\x99\xe1\xa3\xa3\x0a\x5d\x43\x8e\x6c\x31\x8c\x37\xf0\x2d\xbc\xd4\x76\xdc\xee\xac\x53\x84\x0b\xde\xbd\x7c\x3f\x03\xa5\xca\x76\xe7\xa1\xef\x09\x21\x6e\xbb\x8b\x66\x00\x4f\xf0\xcb\xcf\x65\x88\x51\x27\x68\xcd\x31\xb1\x40\x58\x23\x8d\xcd\xb5\xa6\x9a\xa4\xf5\x0d\xf8\xbb\x3b\xb0\xf0\xed\x6c\x71\x18\xfe\x0c\x8b\x37\x8e\xa2\x2a\x99\x40\xbf\x6e\x53\x06\x2e\x33\x84\xd5\xff\x43\xd3\x24\x09\x1c\x0e\x5e\xde\x54\x47\xda\x34\x7a\x9e\x0a\x90\x5b\x84\xef\xef\xee\x6e\x20\x55\x03\x1c\x65\xcd\x19\x66\xa0\xdc\x5b\xee\x2b\xed\xb2\x03\xda\x59\x5a\x32\x21\x47\xa7\x0c\x5b\x26\x4d\x46\x31\x52\xf8\x85\xdd\x2c\x39\xb3\x51\xf5\x12\x45\xca\x69\x25\xdb\x50\xdb\xe3\xa5\x03\xc3\x01\xee\xf3\x32\xfd\x35\x2d\x8b\x42\x79\xdd\x80\x48\x01\xf1\x08\xf1\xb6\x2e\x08\xf3\x07\x5d\x98\x9e\x29\x74\x6e\x90\x9f\x3b\xeb\xa9\xd5\x29\x29\x30\x60\x31\x3b\x4b\x66\x13\x46\xb0\x45\x64\x9d\x4a\x07\x33\xba\x06\xfc\xe8\xdb\x7d\x06\xf0\xb3\x90\x44\xd6\xc2\x19\xc5\x2c\x6c\x0b\x36\x13\x13\xad\xff\x09\x75\x52\x67\x87\xc3\xa8\x69\x8e\x1b\xc1\xd9\xd6\x89\x11\xff\x48\x3e\xd1\xa2\x2e\xcc\x98\x7d\x38\x77\x93\xaf\x3f\xa5\x79\x2d\xe8\x0e\xbb\x55\xdf\x04\x62\x79\xe4\xfe\xb0\x66\x4c\x99\xc7\xd8\x3c\x8c\x30\x6e\x57\x7d\xdb\x63\xdc\x4e\x0c\x18\xd7\xb9\xa4\x55\x8e\xd7\x6b\xcb\xdb\x3e\xc3\xf5\x5a\xf3\x0f\x17\x0c\xa8\xc9\xa7\x7f\x20\xdb\xc8\x6d\xab\x31\x98\x67\x4b\xeb\x4d\x8f\x68\x14\x90\x52\x16\x92\x7a\xd3\x7d\xd2\x1b\x5d\x0b\x30\x43\x68\x1f\x0c\x55\x37\x33\x22\xe9\x95\x4a\x5d\x9d\xa0\xfa\xb1\x95\xd3\x4d\x8e\x88\xe9\xd3\x51\x16\xd0\x75\x93\x7d\xba\x9f\x18\xfd\x58\xa3\x47\x6a\x06\xce\x41\xf2\x1a\xfb\x8b\xbf\x27\xe2\x12\xd7\xa4\xce\xa5\x59\x6b\x1f\xce\x83\x88\xfc\x7f\xbb\xb9\x42\xa0\x5b\xe6\xa3\xef\x2c\x31\x10\x1c\xf7\xc5\xf8\xef\xe5\x9d\xf2\xa5\xa6\x81\x0f\xbf\x88\x92\x9d\xcf\x0f\x07\x1b\x34\xbc\x24\xfb\x16\x3f\xd6\x94\xa3\xe2\xb8\x2c\x0b\x95\xe6\x2b\xb9\xef\x0b\x7a\x25\x7e\xb8\xbd\x7e\x63\x2a\x30\xb5\xd0\x94\x24\xed\xaa\xf9\x07\xdf\xd1\x3a\xb7\xb8\x4d\xb7\x58\x10\xc3\xe6\x81\xca\xad\x37\x32\x03\xf8\x6d\xce\xf7\xa7\xe7\xfd\xe9\x79\xcf\xf0\xbc\x19\xc0\x15\x3b\x87\xef\xca\x6c\xaf\x1d\xc8\x9f\xb8\x21\xfb\xbc\x24\x99\x3d\x64\xc2\x32\x58\x68\x17\x31\xa0\x8d\xaf\xc4\x77\x44\xa0\x72\xa9\xc8\x1b\x7b\x55\x16\x55\x8e\x9f\xae\xef\x7f\xc1\x54\x0e\x3a\x04\x76\xd9\xc0\x13\xef\xcb\x6c\xdf\xb9\x5b\xcf\x7f\x54\xd2\x4e\xe0\x0d\x3e\x8c\xbb\x76\xca\x91\x48\x14\x13\x8e\xaf\xfd\x2c\xb3\xe1\x62\x6b\x33\xdd\x4e\x55\x3d\x62\xb6\xae\x59\x3a\xc9\x77\x31\x96\x52\x53\x9b\x48\x5b\xe1\x22\x38\x9b\x08\x38\xe3\x29\x99\xae\x4d\x9d\xf3\xcd\x85\xad\x0f\xc1\x3c\x5f\xc0\x5f\x5e\xbe\xd4\x75\x57\x70\x6b\xd7\x51\xd1\x08\xad\xa2\xe3\x6d\x59\xa0\x0d\x7d\xf6\x50\xd5\xc5\x69\xa1\x82\x47\x02\x94\x51\x49\x8d\x14\x4e\xcf\x40\x79\xab\xb4\xb6\xec\x20\xf3\x6b\x49\xda\x40\xe5\x05\xe2\x55\x3b\x67\xe7\xbd\xb2\xbe\x69\xdc\xaa\x0b\x6f\x8d\x59\xb7\x72\x98\x89\xaf\xc4\x0d\xa7\x05\x95\x74\x87\x63\x57\x59\x8d\xa9\x85\x89\xa0\xaf\x4a\x26\x09\x65\x02\xe2\x7f\x23\x2f\x61\xbe\xf8\xcf\x7c\x0e\x51\x64\xc1\xa3\xc7\xd4\xcf\xe4\x4c\x95\x3e\xeb\x42\x9a\x0a\xb1\x53\x9c\x03\x37\xe1\x5b\xc0\x4f\xac\x20\x5c\x6c\x49\x7e\x87\x9f\xe4\x22\x5a\x02\xc6\x9b\x18\x2e\x89\xc4\xa5\xfe\x5f\xd2\x42\xfd\xaa\x39\xd1\x91\xf4\x2c\x09\xf4\x74\x3a\xe8\x7b\xc6\xa9\x8a\x1c\xd3\x41\xcb\x6d\x71\xaf\xb1\xb5\x9a\xcc\x68\xd1\x51\x05\x25\xf9\x15\x85\x6d\xb9\x3c\x59\xea\xc5\x78\x23\x2f\x52\xa7\xfc\x34\xf1\x38\x6e\xea\x9c\x70\xd8\x94\x6a\xa1\x65\x3f\x10\xf6\x11\xf9\xda\x1b\xb6\xde\x7e\x05\xc9\x19\x5c\x96\x3a\x0d\x7b\x58\x5e\xf3\xb2\x80\xaa\x14\x82\xde\xe7\xe8\xc0\x2c\x80\x32\x60\x28\x24\x66\x40\x14\x0b\x01\x67\x49\x0f\xab\x63\x58\x74\x17\x7b\xef\x20\xdd\xd0\xb0\xc5\xd2\xc7\x5c\x2b\x94\x81\x8c\x90\x9c\x48\xdc\xec\x8d\x97\xf5\xf0\x36\xa6\xfa\x40\xfd\xb0\xcd\xb0\x7a\xe2\x8e\x2a\x72\xc6\xed\xb6\xa7\x6d\x39\x61\x84\x45\xd0\xf5\x78\x04\x1d\x8a\x9f\xb6\xf9\x95\x77\xd2\x41\x45\x76\x2a\x3e\xce\xc1\x34\xd4\x41\x37\x45\x1e\x43\x4e\xa0\x8b\xb9\x73\x4d\xd6\x84\xc9\x19\x90\x3c\x87\x52\x6e\x91\x43\x4a\x04\x0a\x58\xe8\x00\x20\x74\x02\x8a\xe0\x9d\xd8\x96\x75\x9e\x69\xb0\x95\x69\x5a\xf3\xf7\x47\xb7\x74\x29\xf1\x99\xb2\x28\x09\xda\x62\x6f\xca\x29\xfc\x3d\x82\x81\xe0\x21\x9a\xcd\xc6\xe2\xf7\x68\xe0\xb6\x3e\x95\x12\xce\xf7\x50\xb2\x10\xa3\x93\xe0\x0a\x1c\xa9\xcb\xfd\xbf\x35\x8e\xbb\x30\x3e\x96\x3f\xe2\xd0\x7b\xde\xbd\xbf\xdf\x4b\x1c\xb4\x82\xbc\x18\x14\x75\xe2\x8d\x05\x93\x30\x63\xd1\x35\x94\x1c\x16\x4f\x8e\x00\xd1\x88\x87\x7a\x9c\x55\x72\xe7\x1c\xce\x2f\xfa\x9e\x68\xc5\xff\x70\x38\xb4\xe2\x8b\x39\x2c\xd4\xaa\x56\x89\xa8\x69\x3e\x44\x4b\xf8\x6a\xd0\x27\x73\xf3\x5f\x6b\xe6\x5e\xe7\xbc\xfb\x97\x24\x50\x11\x46\x53\xa1\x44\x10\x15\xa6\x74\x4d\x53\x73\x88\x54\x05\xc6\x1d\xc9\x69\x16\x50\x14\x62\xa3\xe4\x5c\x17\x32\xbe\x35\x32\x2d\xe6\x76\x5d\x58\x1e\xe8\xb6\x8b\xa9\x1e\x86\x2d\xbc\x73\xf8\x72\x37\x5f\x22\xe7\x51\xc0\x5c\xcb\xb2\x28\xc4\xc6\x1f\xee\x1d\x81\x6b\x1e\x1d\x47\x77\xf8\xd2\xad\x5d\x61\x7a\x42\xda\x56\xc3\x42\xab\x6d\x82\x0d\x6a\x2d\xaf\xf7\x71\xae\x8b\xac\xa5\xcf\x74\xbc\x0c\x9a\xb8\x88\x8e\xdd\x2a\x95\x3d\xfa\x95\xb1\x05\x4a\x64\x1f\x15\x1b\xaa\x6e\x6b\x05\x65\x44\x96\x3c\x6a\x97\x5d\x31\x89\x7c\x4d\x52\xec\x86\x6e\x25\x47\x52\x44\xc1\x9b\x97\xa6\xf9\xca\x2f\x9f\x47\x91\xb2\x9c\x79\x36\x76\xb7\xcd\xce\xde\xba\x7c\x1e\x2d\x45\x93\x04\xfe\x45\xe5\xf6\xb6\xeb\x10\x91\x2c\x33\xfd\x38\x63\x39\x90\xa5\x7e\x1a\xeb\x63\x81\xeb\x5b\x99\x22\x7a\xec\xfd\xda\x44\x65\x1c\xf5\x76\x5d\xb8\x9a\x7a\xba\x94\xb6\x6d\xd4\xfe\xdb\x38\xbf\xb9\x75\xa1\x4f\xb8\x03\xcb\xc8\x7a\x7b\x8f\xb8\x45\xe9\xa9\x2c\x50\x7e\x0e\x95\x83\x4d\x3d\x8d\x9f\xa0\x9a\xe7\x13\xa3\x05\xbc\x3d\xce\x71\x13\xb6\x27\x3b\xec\x32\xaa\xe9\x11\xad\x5f\x1c\x51\xfb\xc5\x23\x7a\xbf\x08\xcf\x7a\xf2\x7a\xd5\xe2\xb9\x15\xa4\x6b\xd3\x0c\xaf\x56\x2f\xfa\x80\x18\x88\x11\x8f\x2b\x1f\xbe\x8d\x70\x7b\x9d\x88\x95\x89\xce\xab\x83\xcd\xe7\xb6\xe7\x94\x44\xa7\x98\xf3\xf7\x31\x5b\x88\xc3\xa0\xad\xe5\x30\xe8\x1a\x07\x2d\xea\x2a\x3b\xf0\x07\x06\x14\xbb\xe7\xa2\x1a\x34\x2d\xa6\x7a\x13\x93\xcd\x8c\xc7\x9a\x16\x4f\x0e\x54\xce\x1e\x17\xce\x10\x27\x62\xcf\xd1\xb5\x68\xfb\x83\xed\xd8\x6d\xf9\x79\xcc\x78\xba\xbd\xfc\x82\x40\xa3\x8c\x53\x89\x6f\xdd\xab\x13\x6b\x8e\x34\xa7\xc8\xe4\x73\xf0\xe3\x73\x5b\xf0\x07\xd8\x4a\x59\xc5\x6e\x40\xcf\xf2\x25\x54\xbc\xcc\xea\x14\x39\xf0\x9a\x49\x5a\x60\x7c\x63\x07\x5a\x45\xc6\xba\x2a\x49\xd2\x9e\x48\x57\x58\xb9\xd7\x58\x36\x73\x7b\x6f\x87\xc7\xbf\x4c\x5a\xf9\x79\xdd\xeb\x28\x7b\xa6\xb7\x11\xcd\x7b\x9b\x7a\x89\xf9\xc2\x89\x6a\x06\x55\x59\x8e\x4c\x9a\xe3\x49\x92\xb7\x58\x94\x3b\x04\x3b\xba\xd2\xc7\x52\x32\xd0\x2d\xb8\x56\x68\xd1\xdb\x98\x3f\xc4\xda\x20\x76\x9b\xb1\xca\xe2\x91\x84\x16\x7e\xf4\xd0\x7f\x41\x17\x75\xaf\xe2\x03\xcd\xfa\xa3\x23\xad\xc6\xee\xa5\xe9\x14\xa0\x82\x72\xba\x77\xe9\x72\x88\xb7\xef\x65\x27\x58\xf8\x92\x8c\x74\x44\xfd\xba\xae\xe4\xde\x84\xb9\x40\x74\xcf\x3f\x92\x2a\x72\x3b\xd3\x75\xbb\xf9\x45\x58\xef\x6b\xf0\xe8\x38\x61\x0e\x25\x08\xb8\xde\xf7\x09\xfa\x3a\xee\xdf\x85\xfc\x7d\xa0\x69\x0a\x52\x85\xb5\x6f\xa7\xee\x85\x57\x93\x9b\x8b\x92\xc7\x3e\xa7\x44\xe0\xb4\xeb\x7b\xd7\xa1\x69\x93\x9c\xd2\x24\x76\x55\xee\x68\xa4\x58\xa9\xc8\x1a\x5c\x1d\x0c\x7a\x82\xbd\x1d\x8d\xed\x9e\x8c\x5d\x34\xdc\xa5\x24\xb4\x44\x77\x8b\x73\xfe\xed\xfc\x7a\xc1\x1f\x96\xce\x4c\xe3\xd7\x31\x73\xf3\x51\x17\x22\x75\x52\x39\x4a\x1d\x86\x38\xa6\xe5\x0e\xf9\x1e\x0a\x9a\x65\x39\x3e\x10\x8e\x90\x21\xc9\x4d\xd7\x46\x6e\xa9\x08\x84\x79\x1c\xd4\xcd\x10\xae\xde\x43\x5b\xde\xbf\xd0\x9f\x04\xa5\xd2\xc4\x2d\x17\x81\x9e\x1e\x0d\xc3\xe1\xeb\x0a\x4d\x8b\xd4\xce\xb7\xdc\x17\x91\x3a\x95\xb1\x2b\x5b\x92\x80\xf6\xea\x0d\x32\x45\x8b\x19\xdc\xef\x61\x53\xae\xec\x2b\xef\xaf\xe1\xf2\x1a\xde\x5c\xdf\xc1\xeb\xcb\xab\xbb\x78\xe6\xc4\x8f\x5f\x95\xd5\x9e\xd3\xcd\x56\xb7\x2e\xf4\x37\x03\xd0\xbe\xf4\x0a\xe6\xbc\x54\x30\xab\x48\xfa\x2b\xb1\x1f\xf6\xdc\xd8\xdf\x36\x47\xdc\x6d\xa9\x80\x35\xcd\x11\x1e\x88\x08\x85\xd1\x05\xbf\x91\x06\x64\x59\xe6\xb1\x5a\xff\x3a\xa3\x92\xb2\x8d\x3e\x21\x43\x57\xe8\x1d\x2b\xae\xa2\xe4\xba\x96\x9a\xd5\x16\x19\xec\xcb\x1a\x38\xae\x78\xcd\x02\x4e\x6e\x0b\x2d\x36\x61\xd9\x6c\x36\xa3\x45\x55\x72\xa9\x3b\xf4\xf3\x75\x21\xe7\xea\x2f\x43\x99\xa8\x04\x33\x9f\xa9\xa7\x0d\x95\xdb\xfa\x3e\x4e\xcb\x22\xd9\x94\xab\xb2\x42\x46\x2a\x9a\x20\xe7\x25\x17\xf3\xe9\x05\x36\xb0\x3f\xbe\x22\x11\x98\xd6\x9c\xca\xfd\x91\xa5\x4a\x81\x23\xd3\xba\x4f\x40\xe4\x29\x9b\x75\x90\xd7\xda\xa9\x93\xd5\x16\x10\x6d\xe3\xe3\xca\x3e\xb7\x59\xcc\xcd\x7b\x13\x41\x8f\xcb\xa5\x61\x61\x31\xd6\x4f\x96\xdd\xe7\x27\x71\xd8\x38\x68\x3f\xf3\xd0\xfb\xb6\xc5\xc2\xa3\x5c\xc6\x09\x1c\xe2\x8e\xf9\xda\xf4\xa7\x1a\x6f\x4a\xa5\x78\x8e\x0a\xcd\x98\xb5\x54\xfe\x17\x1c\x9d\xe9\xe2\x76\x5e\x39\xb7\x71\xe0\x71\x67\x9d\x60\xdb\xf7\xe1\x71\xd7\x35\x9c\x4f\xe0\xbb\x78\x8c\x9f\xf9\x56\xf5\x58\x97\x66\x42\x50\x13\x48\x3d\xcd\x7b\x1b\xdb\x38\x3b\x2f\x5d\x10\x02\x52\xcb\x2d\x32\x69\xfb\x5d\x13\x37\x97\x2d\x11\xba\x34\xda\xa3\x84\x7b\x44\x06\xb4\xe3\x39\x5f\x5a\xa6\xd1\xd2\x75\x47\xa6\x8f\xad\xd3\x90\xba\xc4\x3e\x7d\x56\x13\x9f\x1e\x78\x56\x0f\xca\xd8\xff\x05\x00\x00\xff\xff\xb9\x14\xb8\x74\x05\x2f\x00\x00") func templatesServerResponsesGotmplBytes() ([]byte, error) { return bindataRead( @@ -575,12 +742,12 @@ func templatesServerResponsesGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/responses.gotmpl", size: 11315, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x29, 0xae, 0x2a, 0x6c, 0xf8, 0x44, 0x5b, 0x94, 0x6e, 0x4b, 0xd2, 0xa4, 0xb, 0x7c, 0xac, 0xcf, 0xe, 0x6e, 0x81, 0x70, 0x4e, 0x55, 0x6b, 0x15, 0x47, 0xf1, 0x9d, 0x52, 0xcf, 0xab, 0xdb, 0x5d}} + info := bindataFileInfo{name: "templates/server/responses.gotmpl", size: 12037, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb5, 0x1d, 0x82, 0x1f, 0x70, 0xed, 0x78, 0x0, 0x19, 0xe2, 0xd, 0xe5, 0x9b, 0xa9, 0x6, 0x88, 0xd9, 0x2, 0x7a, 0xca, 0x1, 0x6c, 0x8c, 0xb3, 0x34, 0xf1, 0xd3, 0x69, 0xd6, 0x1a, 0x43, 0x81}} return a, nil } -var _templatesServerServerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x3c\x7f\x73\xdb\xb8\xb1\x7f\x8b\x9f\x62\x4f\x6d\x7d\x54\x46\x22\xf3\xa3\xb9\x69\xdd\xf3\x9b\xf1\x39\x4e\xe2\xc6\x49\x34\x91\xee\xee\x75\x6e\x6e\x7c\x30\x09\x49\x78\xa6\x00\x16\x80\x2c\xeb\x3c\xfa\xee\x6f\x16\x3f\x48\x90\xa2\x6c\xc7\xcd\xf5\x5a\xcf\x24\x12\xc1\x05\xb0\xbb\xd8\x5d\xec\x2e\x16\x4a\x53\x38\x11\x39\x85\x39\xe5\x54\x12\x4d\x73\xb8\xdc\xc0\x5c\x8c\xd4\x9a\xcc\xe7\x54\xfe\x0d\x5e\x7d\x84\x0f\x1f\xa7\x70\xfa\xea\x6c\x9a\x44\x51\x74\x7b\x0b\x6c\x06\xc9\x89\x28\x37\x92\xcd\x17\x1a\x46\xdb\x6d\x9a\xc2\xed\x2d\x64\x62\xb9\xa4\x5c\xb7\xde\xdd\xde\x02\xe5\x39\x6c\xb7\x51\x14\x95\x24\xbb\x22\x73\x8a\xc0\xc9\xf1\xf8\x6c\xec\x1e\xf1\x1d\x5b\x96\x42\x6a\x88\xa3\x5e\x3f\x13\x5c\xd3\x1b\xdd\xc7\xaf\x72\x53\x6a\x91\xea\x42\xe1\x13\x95\x52\x48\xf3\xad\x10\x73\xfc\xe0\x54\xbb\x8f\x74\xa1\x75\x89\xdf\x85\xb2\xff\xa7\x8a\xcd\x39\x29\xf0\x41\x69\x99\x09\x7e\x6d\xbe\x6e\x78\xe6\x3f\x53\xa2\xc5\x92\xb9\x47\x95\x91\xc2\x00\x6b\xb6\xa4\xfd\x28\x8a\x00\xfa\x73\xa6\x17\xab\xcb\x24\x13\xcb\x74\x2e\x46\xa2\xa4\x9c\x94\x2c\x45\xbe\xf4\x23\x00\xc7\x87\xef\x15\x7d\x23\x26\x5a\xae\x32\xfd\xba\x20\x73\x05\xdb\xed\xcc\x7c\x86\xdd\xff\x8f\x2a\x45\xaf\xf3\x2b\x1c\xc7\xbc\x75\x03\x20\x63\x46\xdb\xed\xfe\xc9\xe4\x8a\x23\x42\x29\x76\x32\x2c\x09\xe7\x1d\x87\x13\x36\x46\x50\xe5\xec\xd9\x8b\xb4\xc4\xf6\x9d\x99\xea\xfe\xbe\x7b\xdf\xc3\x21\xa7\x18\xef\xc4\x4e\x14\x84\xcf\x13\x21\xe7\xe9\x4d\x8a\xec\xe6\x54\xaf\x34\x2b\xfa\x91\x05\x95\x84\xcf\x29\x24\xaf\xe8\x8c\xac\x0a\x7d\x66\xd6\x12\x87\xbe\xbd\x85\x52\x32\xae\x67\xd0\xff\xd3\x3f\xfb\x90\x80\x47\xc1\x89\x44\xd0\xf9\x8f\x57\x74\x33\x84\x3f\x5e\x93\x62\x45\xe1\xf0\x08\x92\xc6\x28\xf8\x16\xb6\x5b\x68\x0d\xe8\xc0\x5b\xa3\x0e\xa2\x28\x13\x5c\x19\x69\x52\xd9\x82\x2e\xe9\xdb\xe9\x74\x0c\x70\x04\x7d\x27\x26\x75\xeb\xc4\xb7\xaa\xaa\xf9\x7b\xce\x6e\x0c\xf0\x8a\xb3\x9b\x3e\x8e\x76\x4d\x24\xe4\x96\xb6\x89\x01\x51\xf0\xd3\xcf\x96\x59\x51\x34\x5b\xf1\x0c\x18\x67\x3a\x1e\xc0\x6d\xd4\x6b\xc1\x1d\x55\x90\xb7\x8e\xf5\xf1\x82\xa8\x33\xae\x68\xb6\x92\x14\x12\x07\x37\x40\xbc\x7b\x01\x5e\x43\x4b\x8e\x21\xde\x75\x9a\xdc\xd3\x65\x32\xac\x58\xe0\x3a\xa1\x26\x11\xc6\x15\x24\xa7\x37\x5a\x12\x8f\x93\x25\xac\xd1\x1f\x69\xae\xbb\x47\xbd\x6d\xb4\xf5\xaa\xce\x85\xde\x15\xf3\xed\xd6\x30\x25\x76\xd2\x74\x7a\x93\x15\xab\x9c\x4e\x4a\x9a\xd9\xc5\x50\x25\xcd\x5e\xb3\x82\x82\xff\x73\xdc\x0a\x96\x89\x72\x72\x59\xd0\xfc\x9c\x29\x8d\xa6\x27\x60\x29\x40\x56\x50\xc2\x57\xe5\x94\x2d\xa9\x58\x69\x00\x40\x2d\x48\x5e\xad\x24\xd1\x4c\xf0\x08\x60\x2e\x49\x46\x67\xab\xa2\x82\x68\x03\x2c\xc9\xcd\x5b\x4a\x72\x2a\x27\xec\x57\x83\x85\x53\xa1\xe4\xbb\x8d\xa6\xd8\x86\x92\xab\x44\x76\x45\xf5\x98\xe8\x85\xc7\x2f\x02\x58\x08\xa5\x77\xd1\x36\xd6\xc9\xff\x31\xae\x23\x80\xc2\x60\x7e\xce\x96\x4c\xfb\xa6\x2b\x4a\xcb\xe3\x82\x5d\x9b\x19\xdb\x28\x49\x4a\xf2\xbd\xf8\xae\x25\xd3\xd4\xbf\x6d\xbe\x8c\x00\x74\xa1\xde\x86\x68\x05\x88\xe9\x42\x8d\x43\xdc\x3c\x2a\xba\x50\xe7\x21\x82\x41\xfb\xbb\x10\xcb\x5d\x54\x74\xa1\x3e\x85\xa8\x76\x42\xfc\x18\xe2\xdb\x09\x71\x42\xa5\x66\x33\x96\x11\x4d\xdb\x08\x07\xaf\xde\xd1\x4d\xf3\xd5\x71\xa3\x9f\x7b\x35\xa8\xf6\x1d\x6f\xb7\xb6\xdb\x28\x4d\x61\x62\x5e\x4f\x0a\x96\xd1\x1f\x88\x04\xb5\x2a\xcd\x3a\xcd\x84\x34\xeb\x1d\xe9\x4d\x49\x41\xd9\xd7\x68\x28\x5a\x5a\xcb\xe9\x7a\x52\xbd\x8c\xaf\x49\x51\x0b\xe1\x10\x4a\x78\xe2\x1f\x06\xf0\x24\x18\xe4\x36\xea\x3d\x29\xe1\x08\x10\x3e\xea\x49\xaa\x57\x92\x43\x1c\x40\x0c\xe2\x72\x80\xfa\x63\xe6\x88\x55\xd8\x79\x00\x13\xaa\x71\x26\xf0\x23\x9b\x4d\xcd\x8c\x89\xc6\xa2\x86\x8c\x9d\x31\x4e\x26\x65\xc1\x4c\x97\x21\xf4\x87\xfd\xc1\xa0\x9a\x92\xb3\x62\xef\x2c\x6f\x28\x9a\x23\xc6\x35\x95\x33\x92\xd1\xdb\x2d\xdc\x82\xeb\xe6\x89\x8a\x9f\xa0\x09\xd9\x87\xa5\x05\x19\x38\x34\xeb\xde\x1e\xab\xbf\x0b\xc6\xe3\x70\x28\x8b\x1d\x98\x65\x41\x05\xbf\x6f\x69\x02\xbf\xa0\x69\x41\xdb\xba\x7b\xb4\xa3\xba\xf1\xb3\xa7\xe6\x6f\xb0\xcf\xfa\x60\x87\xc4\x22\xf0\x03\x91\xe3\xf8\xc0\x9b\xa3\x21\xf4\xf1\x6b\x7f\x08\x7d\xff\x4f\x2f\x28\x38\x5f\xc7\x58\x2d\x2b\x7a\x4c\x70\xd0\x02\x14\x95\xd7\xb4\x3f\xd8\xdd\xb3\x5a\x5b\x68\xd4\x33\x53\xfe\x40\x64\xdc\x94\xa9\xe6\x6e\x30\x84\x83\xb6\xd5\x43\xbe\x19\x13\x4c\x3c\x32\x45\x65\x10\xb5\x00\x0b\x3e\x04\xbd\x60\x0a\x32\xc2\xe1\x92\x82\xa4\x25\x35\x8e\x1a\xe1\xb9\xdf\x96\x0c\xb0\x21\xc5\xd9\x78\xc6\xa1\x4d\x59\x7f\x10\xf5\x02\x13\xdf\xe1\x48\x38\x32\x9a\x4b\x17\xef\xe0\xec\x51\xa6\xfd\x21\xb4\x09\xfc\xb7\x92\x60\xb0\xf5\x56\xc7\xa0\xda\xdc\x38\x86\xd0\x77\x0d\x23\x6d\x5b\xfa\x43\x78\xf6\xf4\x89\xb1\x56\x13\x9a\x09\x9e\x0f\xa1\x6f\xf6\x12\x28\xa9\x64\x22\x37\xf2\xb9\x5e\xb0\x6c\x81\xd8\xac\x09\xd3\x70\x49\x67\x42\x52\xb8\x62\x45\x81\x9a\xc0\xf2\x82\x42\x26\x38\xa7\x19\xce\xaa\x10\xa5\x5d\x3c\x5a\xfb\x93\x9f\x65\xb6\x2a\x42\x4c\x5e\x3e\x0a\x13\xb5\x58\x69\x8d\xa8\xe4\x62\xed\x58\x84\x62\x2a\x2b\x4c\x0c\x06\x0d\x25\x1a\x42\x7f\x49\x6e\x46\x0b\xd3\x30\x52\xec\x57\x5c\x3a\xe3\x68\x4b\x51\x28\x33\xc6\x92\xdc\xb0\xe5\x6a\x09\x7c\xb5\xbc\xa4\x12\xc4\x0c\x2e\x37\x9a\xaa\x60\x7c\x58\xb3\xa2\x30\xbb\x18\x94\x44\x2a\xc4\x00\x5f\x4a\xfa\xcf\x15\x55\x1a\xec\xe0\x5f\x2b\xb8\xa2\x1b\x65\x16\xd6\x38\x67\x6a\x08\x8c\xa3\x7e\xb6\xe1\x0b\xc6\x69\x02\x67\x1a\x72\x41\x95\xf1\x32\x0a\xb3\x53\x99\x09\x51\xf1\xc5\xac\x01\x7f\x29\xf2\x4d\x7f\x10\x35\x64\xd4\x50\x5a\xef\xe2\x28\x98\xe6\x61\x54\x12\xbd\x40\x12\xd3\x6b\x22\xd1\x8b\x4e\xb5\xc8\xc5\x08\xe5\x32\x41\x08\xaf\x6b\xe8\x08\x39\x2f\x00\xb9\x6c\xe5\x16\x04\xef\x9c\x07\x1d\x83\x21\xf4\xf1\x03\xfb\x17\x22\x23\x85\x7f\xc0\xc1\xce\xc6\xed\x31\xec\x10\x67\x5c\x9b\xfe\x68\xff\x86\xd0\xc7\x8f\xfe\x10\x9e\xba\x5e\xc6\x2a\x86\xfd\xcc\xc2\x33\xef\x20\x06\x92\x36\x6c\x68\x0a\x41\xbf\x39\x17\x4b\xcb\xe5\x9d\xc9\x02\xe7\x04\x71\x35\x4f\x23\xc3\x60\x37\x77\xcd\xec\x7a\xc5\xc5\x4a\x2b\x4d\xb8\x59\x2a\xc7\xf6\x3d\xf2\x5d\x39\x3a\x43\xe8\xe3\xf7\x11\xc1\x87\xfe\x10\x5e\x58\x91\x7e\xcf\xf8\x4a\x1b\x73\x4b\xb5\x95\xa1\xe9\xc9\x18\x6a\x48\x70\x5a\xa0\x90\x60\x92\x65\xb4\x44\x6b\x10\x10\x6b\x24\xa3\x94\x2b\x4e\x15\xe4\x28\x72\xd8\x3f\x78\x0f\x31\xd0\x64\x9e\x40\x56\x08\x23\x89\x05\x29\xb5\x28\x61\xc9\xf2\x11\xaa\x45\x21\x48\x3e\xe8\x46\x3d\x70\xc3\x86\xd0\xc7\xa7\x40\x25\x5f\xb4\x8d\x83\x57\x8b\xdc\x0d\xe1\x95\x50\xb3\x25\x4e\x8b\xde\x8f\xd1\x88\xa6\xb0\x76\xcf\x1c\xfa\x78\x43\xe8\x9b\xc7\x7f\x71\x6e\x33\x46\x3d\xb9\x2a\x05\x57\xb4\x53\x7a\x9d\x0b\x89\x52\x57\xa8\xd1\xa3\x85\xd8\xb9\x9b\x6e\x98\x07\xc9\xf2\x23\x25\xb9\x89\x7b\xe0\x15\xba\xb9\xb3\xba\x25\xdc\xcb\x83\x66\x98\x61\x04\xa2\x05\xac\x14\xdd\x83\xc9\xfd\xb3\xbd\xc3\xb0\xd4\x4c\x78\x45\x37\xe1\x44\xa5\x64\xd7\x38\x09\x46\xa6\xf7\x4f\x04\xf1\x9a\xe9\x05\x2e\x59\x49\x94\x2a\x17\x92\x28\x3a\xd8\x37\xfb\x71\x07\xb5\x64\x1f\x91\x64\xa5\x17\x42\x32\xbd\xe9\x24\xfd\x92\x22\x52\x39\xe0\xec\xb0\x5c\xe9\x15\x29\xd0\xcd\x36\xbd\xba\x16\xf7\xbc\x61\x37\x70\xe6\x2f\x6e\x3b\xc2\x08\xa4\x62\xed\x7f\x95\x09\x69\x46\x48\x8e\x86\x7f\xa7\x25\x69\x05\x60\x0e\x83\xdf\xd2\xa0\x78\x37\xdd\x3a\xfc\xa7\xfc\xfa\xe3\x35\x95\x92\xe5\x34\x16\x92\xcd\xc1\x07\x4d\x39\x9d\x55\xdf\x8d\x1f\x90\x24\x89\x8f\x74\x7c\x28\x11\xf5\x50\x45\x2e\x86\x70\x05\x87\x47\x2e\xfb\x63\x60\x6f\xa3\x5e\x8f\xcd\x40\xa8\xe4\x0d\xd5\x94\x5f\xc7\x57\x03\xf8\xea\x08\xfa\x7d\xf3\xc6\x87\x3d\xe1\xeb\xa8\xd7\x33\xc9\x0a\xec\x86\x53\x5b\xe8\x83\x03\x30\x48\x1d\x55\x7d\x5d\xd7\x9c\xce\x0c\xb4\x1f\x49\xb2\x79\x54\xc7\x1f\x7a\x87\x2a\xc6\xb5\x25\xc9\x7c\x69\xd3\xc3\xb8\x7e\x3c\x31\xd7\x43\x8c\xfc\xb0\x8f\x4b\x4f\x26\xc7\x5a\xb0\x38\x04\x47\xea\x70\x08\x84\xfb\xea\x08\xc3\x3d\xdb\xb5\x37\x5b\xea\xe4\xb5\x49\x83\x15\x1c\x7b\x4c\x74\x4e\xa5\x1c\xc2\xd5\x10\xfa\xcc\xba\x52\x04\x8d\x29\xcb\x9d\x7e\xf6\xcd\x50\x3d\xa1\x92\xd3\x1b\xa6\xe3\x67\xe6\x71\x1b\xf0\xf4\xba\x83\x91\x4f\x43\x3e\x3e\xbd\x9f\x8d\x41\x40\x97\xa6\xf0\x81\xae\x27\xd6\x6b\xcc\x24\xba\xfa\x0a\x08\x86\xdb\x40\x4a\x86\xf1\xd3\x62\xb5\x24\x1c\x9d\xbc\xe4\x03\x59\x52\xd8\x6e\xbd\x8f\x79\xb9\x0a\x1c\xc2\x4c\xf0\x19\x9b\xa3\x25\x65\xda\xae\x52\x35\x6c\x8c\x03\x3d\xb9\xbd\x85\xa4\xce\x22\x27\xb7\xb7\x68\x5d\x33\x52\x84\x23\x1f\x8f\xcf\x06\xf0\xc4\x21\x73\x1b\xf5\x14\x32\x9d\xd3\x75\x6c\x9b\x06\x55\x40\xd7\x99\xe8\x32\x71\x86\x4a\x4e\xdb\xc9\xaa\x23\x68\x47\x45\x08\x76\xd2\xcc\x5b\x1d\xb5\x12\x59\x08\xf2\xa6\x95\xb9\x3a\x6a\xe7\xb2\x10\xe8\x7d\x2b\x02\x6e\x38\xf3\x08\x30\xa9\x33\x57\x47\x41\x1a\x0b\x5f\x99\x44\xd1\x51\x87\xa2\x3a\xff\x15\xf7\x90\xb7\x1f\x27\x53\x14\x0a\x95\x98\xdc\xd1\x51\x5b\xfa\xad\xab\x8a\xa6\x7e\xfc\xf1\x93\x83\x0c\xb3\x49\x47\x61\xf2\x0b\x5f\xd6\x29\xa5\xa3\x3a\x09\x86\x2f\xc2\x4c\xd2\x51\x98\x02\xc3\x97\x8d\x24\xd2\x51\x23\x07\x86\xaf\xa7\xe7\x93\xbd\xc4\x54\xee\x8c\x25\x78\x08\xfd\xe9\xf9\xe4\xc2\xd0\xd5\xa0\x6f\x7a\x3e\xe9\x26\xb1\x72\x64\x9e\xba\xbe\x35\xa5\xd3\xf3\x49\x98\x84\xda\x33\x7d\x73\x8f\xee\xbb\x51\x4e\x4e\x3f\x4d\xcf\x5e\x9f\x9d\x1c\x4f\x4f\xbb\x06\x7b\x47\x37\x0f\x18\xcf\xfa\x1c\x7e\xc8\xf1\xa7\xb3\x1f\x8e\xa7\xa7\x17\xef\x4e\xff\x51\x0f\x79\xfc\x10\x0c\x8f\xf7\xe0\x78\xdc\x89\x66\x73\x81\x9b\xbe\x80\x03\x09\x97\x39\xdc\xc6\xdd\xeb\xe6\x62\x37\x77\x49\x07\xd2\x5a\xf2\xd6\x46\x16\x01\xa0\x36\x8e\xba\xd3\x3a\x00\x2a\x31\x4f\x47\x55\x7e\xb9\xea\x10\x24\x67\xaa\x87\x9e\x4a\x30\x56\x36\x61\x32\xea\xd0\x15\x8d\xb3\x05\x31\x39\xac\x55\xa6\x6f\xb7\x86\x70\xb4\x23\x47\x68\x96\xf0\xc1\x24\xcc\xe4\xaa\xd4\x0d\x78\x34\xb1\xe6\x34\x69\x08\xcf\xea\xf4\x9b\x8a\xac\xa5\x3b\xf1\x46\xea\x78\x7c\x56\x5b\x2c\xeb\xb1\x60\x13\x46\xc2\x0b\xc2\xf3\x82\x4a\x95\xd4\xd9\x36\x67\x7d\x1a\xdd\x5d\xfe\x0b\x90\x7c\x8b\x59\x65\xf7\xab\xbc\x6f\xe2\xc6\x42\xe3\x12\x76\x35\xf0\x03\x03\xb7\x6d\x63\x66\x2d\x59\x0b\x37\x92\xe7\x0c\x9d\x00\x52\x80\x3d\xb1\xca\xe9\x8c\x71\x7b\xfe\x87\xef\x2b\x9c\xe1\x03\xa5\xb9\x72\xce\x64\x46\x8a\x02\x61\x9c\xe3\x80\x7e\x30\x91\x8a\xca\x64\x8c\x1f\x77\x90\x67\x70\xb8\x9f\xc0\xac\x09\xdf\x41\x95\xb3\xe4\xb8\xed\xe2\xf4\x9d\x9b\xc9\xf1\xf8\xcc\xe6\x7e\x1d\xb0\x5d\x71\xb4\xfe\x3b\x86\xbc\x3a\x9e\xd9\x7b\x9e\x07\xbf\x14\x82\xcf\x0f\x7d\xce\x0b\x72\xaa\x32\xc9\x4a\xe4\xdd\xe1\x6f\x9c\xee\xfa\x25\x48\x76\x9d\xdc\x79\x26\x72\x07\xfa\x00\x9e\x82\x76\x32\xac\x49\xca\xbf\x98\x07\xf3\x84\x1d\xf6\x9f\x3d\x55\x0d\xcc\xdb\x5b\xde\x23\x30\xdf\xc9\x9e\x3d\x06\xf5\xbd\x89\xb3\x00\xf5\x97\x4d\xd4\xdf\xdf\x77\x8c\x74\xbf\xd8\xb4\x13\x6f\x4d\xcc\xff\xfb\x72\x70\x49\xc8\xae\xf7\xec\xbb\x90\x5f\x51\x2f\x70\x4c\xee\xf6\xaa\x2a\xad\xa3\x85\xa2\xfe\xd4\x3c\x41\x9b\xce\x51\x89\xbd\xce\x05\xe9\xbc\x5d\xc5\xdb\x9b\xbe\xab\x31\xac\x12\x80\xb7\xb7\x90\x13\xb5\xa0\x32\x34\x14\x36\x19\x18\x2e\x78\x2e\x96\x84\x71\x4b\xc5\x39\x70\xaa\x13\x6f\x2a\xa2\xa8\x67\xbc\x91\x87\x9a\x0b\x93\x55\xd9\xc5\xb9\x9d\x60\xa9\x51\xad\x73\x31\x40\xf9\xf5\xa1\x75\x62\x42\xdc\x8c\x23\xc3\xb8\x7e\x90\xc6\x98\xd4\xcc\xee\xf4\x5f\x28\xdd\x68\x31\x34\x2e\x53\x88\xe1\x79\xeb\x48\xf4\x6e\x4c\xdd\x9f\x43\xb8\x91\x67\x68\x22\xfe\xe0\x7c\x43\x88\xcb\xbb\xbd\x67\xb1\xf7\xaf\x5d\x90\x8f\x68\x62\xf2\xbb\xe6\x22\x6a\x51\x79\xb1\x6c\x90\xfa\x69\xef\xc9\xf2\xfd\xa4\x36\xd2\x16\x4d\x62\x1f\x99\xb1\x08\xd0\x6c\x6d\x04\x3f\xee\x3d\xe4\xbe\x1f\xcf\x66\x72\xe3\xb3\x11\xed\xce\x6b\xd4\xa8\x7e\xd3\x42\x75\xa1\x75\x69\x9d\x87\x73\x80\xb6\x1d\xf0\x81\x49\xfb\x38\xfe\x01\xe2\xee\xa8\xa9\x72\xb0\xf7\x1a\x08\xeb\xe8\x14\x6a\x08\xeb\x05\xe5\xc6\x9c\xba\x63\x4a\x9a\x03\xd3\x5f\xbb\xdd\x01\xed\x19\x51\x30\x1a\x05\x06\xa4\x8a\x88\x42\xc2\x7c\x40\xd4\xa8\x17\x78\x90\x9e\x86\xb8\x7f\x96\x75\x79\x94\x6d\xa9\x42\xb2\x16\xf2\xad\xb2\x82\x2f\xb1\xc9\xb4\xb3\xc9\xbb\x74\x85\x99\xd5\xbb\xf3\xc9\x35\xf2\x61\x88\xb5\x9f\x06\x0c\x08\xbf\x14\x0d\x57\x74\xd3\xb5\x26\x41\x9e\xfa\xa1\xb8\x87\x21\x67\x1b\xf7\x66\x81\xc6\x17\xe3\x3f\xb9\x87\xed\x75\x9a\xfb\x41\xa9\xed\x60\x1d\x8e\xef\x5a\x8a\xdd\x1a\x99\xcf\xd6\x85\x2f\xbd\x71\x35\xe2\xec\xdd\x0a\x9d\xbb\xf0\x6b\x08\xc3\x7f\xe2\x16\xd6\xa2\xf3\xae\x3a\xa3\x07\xd2\xf9\xe5\xf7\xaf\x16\x8e\x77\x55\x3a\x3d\x10\xc7\xdf\x64\xef\x6a\xef\x56\xaa\xda\xae\x5a\xbb\x55\x67\x95\x8c\xf9\xf8\x22\x1e\x3a\xc6\xa9\xbb\xaa\x7b\x4f\x49\xcd\x2f\x61\xa9\xa2\xa7\x82\x94\x0c\x9a\x7f\x0f\x4d\xf0\x46\x3d\x9f\x15\xa9\xff\x90\x27\xc9\x5b\xdb\x8c\xef\x55\x1d\xf3\x9b\xbf\x4b\x21\x8a\xa8\x57\x25\x88\xaa\xbf\x46\x8a\xc8\x02\x60\xd0\xf8\xaa\x02\x62\x5c\xbf\x78\x1e\xf5\xaa\x5c\x11\xcd\x21\x1c\xb1\xce\x21\x35\x46\xac\x92\x48\x2e\x8d\x71\x2e\xe6\x33\x28\xc4\x5c\xc1\x92\x2a\x85\xf4\x51\xa6\x17\x54\xc2\x35\x23\x55\x2a\x66\xa5\xa8\x44\x20\xe4\xa4\xb0\xaf\xd4\x46\x69\xba\x04\xc1\xa9\x5d\xbb\x06\x0c\xab\xb2\x38\x1d\x99\x26\x9c\x31\xae\x8f\x67\x88\x9c\x9b\xe3\x8c\xa0\x48\xcc\x14\xb0\xb6\x53\x33\x07\x07\xf6\x39\x39\xb7\x73\x04\x47\x11\x61\x7b\x3c\xb3\x43\x26\x49\x32\x88\x7a\x5b\x2b\x34\x08\x54\x88\x79\x32\x36\x35\xbb\x2d\x10\xc7\x88\xd7\x44\x93\xe2\xb7\x65\x45\x9a\xc2\xe9\x0d\xd3\xca\x6e\x15\x5c\xf0\xd1\xaf\x54\x0a\x50\x9a\xe8\x95\x02\x32\xd3\x54\xda\xb2\x62\xc6\xe7\xbb\x7c\xb3\x08\xfe\xbb\x38\xd7\x38\xa5\x69\xb1\xd1\x63\xd2\xc5\xc6\x09\xd5\x1d\x09\xc8\x2a\x6b\xa0\x17\xf6\xb9\x72\x1d\x8f\xc7\x67\x77\x65\xf6\x0c\xf1\xbb\xbc\xb0\xb3\x7c\xe6\xe1\x8b\x65\x8d\x49\xb4\xb6\x38\x00\xe6\xd9\x3c\xd5\x69\x4d\xdb\x62\xb3\xac\x48\xdf\x4e\x96\x76\x4f\x06\xd4\x64\x0a\xc3\x82\x46\x8f\xf4\x82\x28\x5b\x9f\x16\xdb\x5c\x5b\x55\x7b\x89\x0a\x6b\x8e\x84\x5c\x0a\xee\xf0\x08\x76\x8f\x7a\x0c\xf2\x05\xe5\xae\xb3\x1a\xd4\xe7\x61\xaa\x2a\xf2\x6e\x96\xc1\x59\xac\xdd\xc1\xe0\x75\x7d\x30\xe8\xe1\xdd\xd9\xe0\x35\x8e\xe4\x50\x0a\x4f\x38\xb5\x5c\xd1\xea\x40\xce\xb5\xcd\x48\xa1\x68\x98\x01\xb5\x39\xdc\x92\x75\xad\x91\xbc\xa6\xf1\x00\x62\x2a\xa5\x2d\x2f\xf5\x4b\xf0\x15\xf2\x2e\xb0\x83\x0e\x0f\x84\x43\xca\xed\x8b\x78\xf0\xb7\xf6\x91\x23\xf8\xea\x4f\x2a\xa5\x47\x2c\xea\xa5\x29\x28\xaa\x3d\xe9\x3e\x5f\x3c\xb4\xba\x88\x3a\xa9\xf0\xbd\x53\x8b\x6a\xcd\xea\x51\x2b\x75\x09\xda\x7a\xf5\x44\x42\xaa\xe4\x03\x5d\xc7\xfd\x8c\xf0\xaf\xb5\x3b\x46\x34\x54\xef\xcc\x48\x14\x6a\x3f\x0e\x65\xe7\xec\xdb\x83\x61\x23\x57\x13\xaa\xdd\x26\x60\x93\xc9\x89\x65\x0f\x67\xc5\x60\x60\xe9\x58\xcf\xfd\x89\xa0\xda\xf0\x2c\xf9\x91\x30\xfd\x46\x8a\x55\x39\x88\x7a\x82\x67\xb4\xf1\xf2\x23\xcf\xe8\x20\xea\xd9\xcb\x25\x1f\x84\x66\xb3\x4d\x1c\x1c\x1b\x0c\xa2\xde\x5c\x38\xbc\xce\x7c\x63\x8c\xa3\x0c\x41\x0d\x50\x92\xcd\x1a\x19\x49\xfb\xe9\xe7\x27\x66\x8b\xb2\xcb\x86\x5b\xcd\x7a\x9e\x1c\xe7\xb9\x51\xfc\xb9\xa8\x78\x36\x71\x3b\x54\xbc\x9e\x0f\xe1\xc0\x0d\x80\x63\x39\xbe\x36\x65\xfb\x7b\xce\x6e\xcc\x72\x37\x32\x59\x9e\x86\x60\xc2\x41\x0b\xa4\x3e\x73\xfc\xce\xe4\x1c\xcd\x81\x59\xdc\x3a\x8a\xdc\xe9\xf4\xb6\x52\xc5\x6a\x89\xed\xca\x32\xae\xbf\xf9\x73\xdc\x3e\x11\x1d\xc0\xff\x38\xd5\x69\x0e\x73\x96\x17\xc1\xa1\x50\xbb\x97\x5f\xcc\x4a\xdb\xdd\x11\x70\x38\xc4\xd0\xdd\x6a\x18\x3a\xe5\x8e\xc3\x33\xd2\xc1\xc0\xc8\x82\xe3\x3d\xda\x91\x92\xf2\x3c\x76\x0d\x43\x08\x07\x42\x12\x83\x85\xe8\xa9\xc4\xec\x9b\x7d\x9c\xd3\x94\x2f\x74\x9d\x37\x10\x6d\x72\x91\x87\x69\xfa\x27\x85\x28\x84\x73\x47\x3d\x5c\x4d\xd4\xd2\xb8\x68\xb8\x66\x03\xab\x5a\x39\x9d\xa1\x85\x9e\x27\xaf\x04\xa7\xf1\xc0\xb4\x39\xa5\x3c\x3c\x6a\xa0\xe6\x44\xb7\x68\x2a\xe8\xc1\x81\x7f\x32\xab\x7b\x2a\xa5\x65\xcf\x49\x21\x30\x3a\x32\xcc\x56\x7e\xeb\xe8\xff\xe9\xba\x6f\x2a\x0f\xec\x3c\x5b\xf3\x7f\x45\xa2\x16\x65\x49\x73\xb3\x69\x3c\x96\xd4\x6d\xac\x92\x46\x0e\xd5\x29\x59\xa7\xb0\xbe\x9d\x4e\xc7\x56\x58\xeb\x74\xcb\x1e\x51\xad\x01\x1e\x2c\xa8\x41\x97\xe6\xc1\x64\xe3\x54\xba\x09\xd8\x3a\x9e\x6c\x1e\x51\x37\x41\x27\x54\x57\x61\x9a\x72\x9b\x46\xec\xc5\xbe\x7a\x63\x24\x7e\xe0\xad\x5d\x18\x6d\x56\x9a\xa0\x92\x30\xd9\x84\xd4\x9b\xbb\x55\x89\x01\xf3\xc2\x12\x37\xa0\x86\xcd\xb1\x2a\x73\xf7\x10\xc5\x0b\x48\x78\x98\xda\x05\x1d\xba\xd4\xbd\x43\x31\xeb\x1e\x43\x77\xe5\x0a\x11\x0e\xf0\x47\xf5\x92\xf1\x20\xf1\xd7\x0c\xee\xd1\xcf\xba\xe7\x63\xb5\x13\x47\xa8\x45\x76\x17\x93\x3b\xb4\xd4\x99\xab\x1d\x2d\xed\xd5\x4a\xda\x90\x8a\x47\xaa\xe8\x1e\x1d\xb5\x65\x3a\x9f\xab\xa1\x21\xb9\x45\x40\xe2\xb6\x29\x46\xf7\xe9\xe6\xa4\x56\x4e\x75\xaf\x76\xaa\x47\xa8\xa7\xda\xa3\x9f\xcd\xd4\x40\x0b\x78\x47\x47\x5b\x41\x7a\x0b\xfc\x4e\x3d\x0d\x73\x2d\x4d\x55\x6d\xe5\x86\x5a\xda\xaa\x1e\xa6\xae\x2a\xd0\xd7\xe6\x80\xae\x74\xed\xc1\x1a\xab\x1e\xae\xb2\xcd\x0e\x7b\x54\x36\x4d\xe1\x8c\xab\x92\x49\x7b\xe0\x6f\x7a\x1c\xa6\xe9\x25\x86\x19\x97\x92\x64\xf4\x92\x71\x73\x97\x94\x64\x0b\x46\x51\xd8\x46\x25\x95\x33\x9a\xe9\x91\x52\xc5\xa8\x20\x97\x6a\xa4\x32\x21\xe9\x08\x63\x8b\xd1\x5c\xb4\xa6\x9d\x9e\x4f\xec\xd1\x3f\x1c\xc1\x81\x2e\x54\x62\x9f\x0c\x3d\x69\x0a\x27\x64\xa5\xa8\x02\xaf\xf2\x2e\x2f\xf9\x46\x7c\xad\x2a\xef\x2e\x63\xe5\x82\x4a\xb5\x62\x9a\x42\x29\x51\xfd\x28\xcf\xa8\x1a\xba\x11\xec\x09\x2f\x91\x14\xf4\x0a\xe3\x43\x2d\x80\x5c\x0b\x96\x03\xd1\x9a\x64\x57\x2a\x81\x57\xee\x4c\x73\x61\xf2\x28\x1c\xb2\x82\x51\xae\x55\x82\x03\x8c\xcd\x80\x4e\x0b\xcd\x44\x13\x9c\x48\x1d\x1a\xe7\xdb\xcf\xf1\x91\x17\x1b\x83\x58\xb6\x92\xd7\x54\xb9\x39\x17\xe4\x9a\x02\x51\x8a\x2e\x2f\x8b\x0d\xb0\x65\x59\xd0\x25\xe5\xda\x64\x38\x94\xeb\xe9\xf9\xd9\xb8\xd6\x5b\x10\x3e\x4f\xe7\x22\xd5\x92\xd2\x74\x49\x94\xa6\x32\x55\x32\x4b\xdd\x2d\x67\x5a\x14\xac\xd4\x2c\xc3\x21\x4e\x70\xc2\x71\x4d\xf5\x21\xfc\xf4\xb3\xe1\x22\xb6\x9f\xbd\xba\xad\xbe\x8f\x9f\xbf\xfc\x66\x8b\xf8\xfa\xaa\x99\xef\x15\x7d\x2f\x72\x2a\x39\xfe\x6f\xaf\x78\x22\x42\xdf\x2b\x0a\x4b\xd3\x6e\x72\xa4\xf8\xb5\x42\x72\xcd\xae\x58\xb2\x14\xbf\xb2\xa2\x20\xe6\x8e\xaf\xb9\x69\xca\xf4\x26\xb5\x0c\xba\x98\xb0\x9c\x5e\x4c\xcf\x27\x7f\xb0\x23\x5f\x64\x62\x59\x12\xcd\x2e\x59\xc1\xf4\x06\x27\xf8\x40\x6f\xf4\x58\x0a\x2d\x0c\xa2\x2e\x71\xd4\x5f\x3c\xef\x3b\xfb\x9f\x3e\x4b\x9e\xf5\xb7\xc3\x16\x73\xd6\xeb\x75\x22\xd6\x44\x95\x66\x52\xc6\x73\x7a\x93\x94\x8b\x32\x9d\x4a\xc2\x55\x29\xa4\xbe\x38\x27\x1b\x2a\x2f\x70\x64\x9b\x64\xbc\x38\x59\x50\xa2\x2f\x26\x0b\x4a\xf5\x1f\x3e\xad\x0a\x7a\x31\xba\xc0\x45\xba\x98\xd8\xeb\x65\x17\x13\x2d\x05\x9f\x9b\x1e\x22\x13\x85\x59\x8e\xf7\x8c\xff\x40\xa5\x62\x82\x1f\x22\xed\x89\x7b\x98\x9e\x4f\x9e\x3d\xf7\x28\x4d\x17\x14\x97\xb9\x16\x39\x55\xdd\x58\x7b\x2d\xe4\x9a\xc8\x1c\x26\x34\x93\x34\xdb\x1c\x56\xe8\x53\x9e\x20\xe7\x4a\x9a\x33\xcb\x36\x7c\x4a\x1d\xf8\x85\xb2\xe0\x66\x31\x1b\x02\xf6\xd3\xcf\x2b\xc6\xf5\xb3\x6f\xac\xd5\x47\x84\xa6\xe7\x93\x8b\xd3\x93\x57\x6f\x4f\xf1\xff\xc9\xf1\xc5\x8f\x67\xd3\xb7\x17\xc7\xa7\x93\x8b\xe7\x2f\xbf\xb9\x78\x73\xf2\xfe\x62\xf2\xf6\xf8\xc5\x5f\xfe\x3c\xec\xe8\xf0\xe9\xf3\xc0\x5b\xe3\x3f\x7b\xfe\x17\xdf\xe1\xf9\xcb\x6f\xee\x1d\xff\x7e\xf0\x60\xfc\x93\xb7\xc7\x27\x6f\x8f\x9f\x3f\xbd\x18\x7f\x3c\xff\xc7\xb3\x17\x4f\x5f\xde\x39\x7c\x37\x74\x25\xd8\x3e\x43\x68\x1d\x92\x34\x85\xcb\x15\x2b\x72\x30\x79\x74\x5c\x1b\xeb\x80\xc0\x4c\x8a\xa5\x4f\x79\x88\xd2\xeb\xa3\x37\xe7\xe1\xb9\x45\x55\x28\xdc\x55\xa0\x17\x94\xe9\x76\x9a\xb4\x24\x80\x57\xbe\x52\xcc\xe9\x67\x58\x70\x67\xeb\x6c\xef\x1f\xe2\xa7\xa7\x3f\x0f\x5d\x10\x8e\x63\x9c\x0b\x92\xff\xef\xcb\xa7\x7f\x7d\x47\x37\x63\xc2\x64\xbc\x3f\xc9\xec\x42\x9d\x2a\x85\xda\x26\x66\x7f\xcf\x41\xd5\x67\x78\xc7\x2f\x19\xdc\x37\xfe\x3b\xba\x79\xc8\x14\x7b\x0b\x99\x1b\x59\x85\xde\x36\xf0\x62\x3b\x8a\x1c\x83\x55\x49\x53\x57\xcf\x12\x26\xb4\x4e\x8e\xc3\xf3\x22\x04\xcb\x08\xf6\x1f\x82\xfd\x3c\xb5\xbe\x1a\x13\x66\xb7\x46\xf7\xe2\x35\x2b\xe8\x67\x73\xf7\xf8\x33\xf9\xeb\x89\xaf\x91\xe8\x62\x41\xf5\xb6\x72\xf9\x6c\xcb\x58\x88\x02\xb1\xbe\x79\xf9\xf4\xaf\xc9\x07\xba\xf6\x6d\xd6\x03\x15\xa6\xe8\xbc\x86\x4c\x8e\x8d\xe3\x8c\x8f\xea\xb5\x14\xcb\xf1\xe9\xfb\xd8\xbe\xf5\x58\x7c\x25\xae\x9a\x13\xcf\x96\x1a\xfd\x51\x21\x67\x26\xd1\xc2\x85\xb6\x05\x7d\x2d\x76\xf6\x6b\x5f\x74\x8f\x3c\x9b\xcd\xf5\xe4\x18\xf5\xa1\x46\xe8\x3e\xf8\xe3\x95\x29\x60\x46\xa9\xff\x44\xff\xb9\x62\x92\x1e\xf3\xfc\x07\x2a\xd9\x6c\xe3\x06\xa4\x52\x07\x6a\x9f\x91\xa2\x80\x6c\xa5\xb4\x58\xc2\xf4\x7c\x52\xe5\xff\x88\x16\x32\x8c\x43\xa6\xe7\x93\xb8\x73\xde\x81\x93\xaf\x82\xf2\x6e\x80\x86\x62\xba\x54\xdf\xc1\x01\x74\xc3\xbe\xa1\xba\x51\x86\x1b\x2c\x6c\x9a\xba\xbc\x72\x65\xa3\x08\xcf\x3d\xea\xce\x5c\xa1\xf3\x52\xa2\x23\x91\xbb\x72\x41\xca\x73\x05\xab\xd2\xa7\xa9\xdb\xf2\xdc\x65\xc8\xea\x3b\x0e\x9d\xef\x4d\xbd\x71\x00\x12\x44\x19\xfe\xc8\xcb\xb8\x80\xb6\x02\xf4\x97\xd1\xa8\x75\x16\xfe\x8b\x41\xdb\xb5\x5f\xd1\xcd\x2f\xb0\xa6\x92\x36\xab\x10\xdc\xed\x82\x6d\x74\xcf\xf8\x9d\xc3\xaf\x89\xea\x1a\x6d\xbb\x87\xde\x36\x3d\x0f\x98\xce\x62\x7d\xc7\x34\x69\x6a\xb9\xbf\x30\x61\xa7\x3b\x24\x20\xb0\x46\x4f\xe2\x0e\x61\x0b\xe6\x6e\x2e\x95\x99\xac\x12\x45\x5b\x8f\x38\x3d\x9f\xd4\x49\xc9\x34\x85\xe5\x4a\x69\xe7\x48\x6a\x28\x28\x51\xda\x1c\x63\x84\xa3\x08\x09\x25\xe1\x2c\x53\xfb\x3c\xeb\xe4\x3b\xdc\x04\x31\xea\x9b\x8a\x80\x45\xf1\x60\x5f\x48\xae\x1a\x31\x79\x1d\x0a\xab\xc7\x47\xe5\xea\x5f\x0f\xcb\x55\x33\x2e\x57\x5f\x3a\x30\x57\xff\x71\x91\xb9\xea\x0e\xcd\xd1\x0a\x7e\xa0\xeb\xbd\x21\x64\xb7\x41\xab\x92\xd8\x26\x71\x1d\xef\xfc\x3c\x44\x9a\x82\x1d\xb1\xba\x88\xd3\x2c\x59\xf6\x75\xd4\x76\x59\x3b\x4e\x0d\xdd\xa1\x40\xf5\x43\x15\xae\x78\xbb\x79\x90\x00\x68\xef\x0a\x49\x49\xbe\x81\x1c\x25\x19\x35\xca\x94\x6d\x07\xd8\x00\x6c\xa3\xa0\x7b\x77\xba\x01\xfb\xb8\x78\x05\x09\xb6\x3f\xc7\xc2\x66\x96\x7a\xfb\xb4\x26\x8a\x7f\xad\xfd\xf1\x5e\x5d\x4f\x5e\xdd\x17\x71\x06\xc2\x57\xcc\x07\xf7\x48\xcc\x65\x11\x57\x4e\x5e\xc5\x45\x66\x1e\x57\xb2\x64\x2b\x36\xaa\xf9\x1a\xad\xad\x79\xbb\x13\x05\xd5\xe1\x50\xd7\xa5\x8a\x46\xd6\xce\x05\xeb\x21\x12\x3a\x2b\x4d\x49\x06\xd8\x92\x8c\x0a\x8d\x56\x7b\x17\x22\xdd\x19\x8d\x16\x36\xe1\xfd\x8d\x20\x49\xd9\x81\x89\x29\x8c\x70\x15\x0b\x35\x1e\x8d\xd6\x7b\xb0\x08\x12\x38\x3b\x78\xdc\x9d\x8f\x6d\xe3\x62\xeb\x1f\x76\x90\x69\x36\xdf\x83\x4d\x98\x20\xda\x41\xe7\xbe\xac\xef\xf6\x4e\xd1\xf5\x47\x2e\x28\x55\xb9\x58\x4e\x44\x76\xe5\x35\xa3\xba\xe4\x57\x1b\xae\xf8\xee\x73\x0a\x27\xcc\x0d\x57\xd9\xca\x71\xe0\x2c\x5b\xf9\xb5\xc2\xdd\x2c\x58\x3e\x6a\x63\x70\xaf\xd2\x79\xcc\x8b\xbb\x50\xd6\x59\xd9\x1f\x9a\x96\xbf\x0b\xc6\x51\x87\xc6\x42\xea\xd8\xdf\xbd\xf2\x57\x18\xcf\xb4\x20\xb1\xbd\x53\x36\xf8\x3c\x5a\xcc\xc7\x62\x08\x65\x7d\x2d\x72\x4d\xe6\xf6\xb7\x6f\xaa\xe9\x3c\x8a\xbb\xfb\xd4\x67\x73\xcd\xd9\x83\x85\x7b\x74\x57\xc4\x4a\xf7\xd8\xcc\xc7\x17\x0f\x65\x65\x65\xbf\xaa\xbb\x53\x9f\xcb\x4e\x67\xa9\x76\x38\xea\x8a\x36\x1f\xc3\x54\xb5\x18\x82\xba\x93\xad\x01\xb6\x5f\x80\xb3\x81\xb1\x5d\xd4\x4d\x8e\xc1\x2a\xe4\x70\x90\x43\x0d\x50\xf0\x5c\x6e\xed\x30\x47\xee\x54\x7c\x67\x73\xf3\xc7\xa3\x3e\xee\x37\x6e\x76\x41\x09\x47\x47\x5a\x52\x25\x56\x32\xa3\xaa\xe3\x94\xdc\x1f\xab\x06\x3f\xc1\xc4\x66\x60\x7f\x14\x30\x39\x11\xcb\x92\x98\x68\x64\xb2\x26\xe5\x19\xd7\x2f\x9e\xc7\x07\xf6\x3a\x99\x2f\x06\x32\x37\x07\x9f\x59\x2f\x24\x43\x77\x21\xae\xaf\x9b\x0d\xc2\xa3\xfb\xf6\xef\x34\xd5\x65\x09\xad\xe3\x5d\x78\xd2\x3c\x80\x1e\xfa\xfc\xe8\x58\x4b\x78\xd2\x3c\x2f\x36\xf3\xa6\xa9\x77\x7c\xac\x43\x29\xb2\x6c\x25\xa1\x20\x28\x41\x2e\xfa\xa8\x8f\xbc\x65\x4d\xb1\xe9\x19\x6b\x01\xa5\xa4\x66\x0a\x10\x45\x0e\x97\x74\x41\xae\x99\x58\xa1\x77\xd3\xf6\xaa\xa2\xde\xb7\xa3\x9a\xbc\xe6\x41\xf6\x93\x1a\xcb\x28\xea\x65\xfa\x06\x23\x6e\x9e\x51\x13\xb8\xba\x1f\x73\x4c\x7e\x64\x7a\xe1\x0c\x6a\xec\xdb\xa6\x1f\x5f\x7d\x8c\x07\xe8\xf8\xb5\x6e\x08\x55\x08\xd8\x71\xcc\xfc\x7e\xee\x93\x05\xe1\x38\x70\x7d\x3d\xef\x52\x88\x62\x60\xcb\x2d\x58\x50\x6b\xe1\x10\xbc\xad\x7c\x58\x23\xfe\xb6\xf5\x27\xf6\x73\xe0\x57\x3a\x4f\xf2\xda\xfc\x4c\x55\x96\x51\xa5\x5c\x29\x97\xf7\x2e\x43\xa8\x26\x22\xdf\x8e\x7c\x17\xe3\x11\xb6\xfd\x4f\xe5\x5c\x4f\xcf\xf9\x4c\xdf\xec\x56\x57\x98\xcd\xce\xc4\xe0\x36\x81\x55\x15\x50\xd6\xbf\xb7\x24\xa4\x67\xa4\xdf\xef\x0e\x9d\x67\x6a\xbd\x4f\xf3\xfb\x86\x8e\x4a\x3f\xd9\x21\x34\xbd\xd5\xba\x94\xa8\xd7\xf3\x64\x7a\xad\x72\xc9\x97\x78\x50\x55\x76\xa0\x10\xc2\x8a\x6b\x56\x00\xc6\xdc\xb5\xbf\x68\x82\x16\xd7\x7f\xb6\x2a\x8a\x8d\xb9\x56\x65\xaf\x54\xb9\xda\x21\x8c\xd2\x91\x80\xa6\xd8\x45\xd5\xac\x87\x7e\x5a\x5c\xb2\x8e\xd5\xaa\x90\xf3\xdf\x0e\x0e\xe0\xdb\x51\xc8\x77\x7f\x55\xdd\x03\xd4\x25\x55\xbb\xa2\xee\x0b\xa4\xde\x54\x85\x20\xce\x74\x29\x20\xbe\x84\x04\x56\x0a\xc5\xcf\x3a\xc3\x54\x75\xd7\x81\xd5\x03\xc4\x83\x46\x75\x21\x4e\xef\x2f\x85\x56\x67\x2c\x55\x55\x96\x07\x22\x45\x21\xd6\xca\xd5\x5e\xdb\x7b\x68\xc4\xb9\xb8\x0e\x42\x70\x1b\x88\xee\x73\xc5\x83\x52\x16\xdf\x25\x44\xc3\x08\x68\x58\x1d\xd5\x44\x05\xdd\x14\x6f\x4f\x2b\x0e\x98\x72\x1a\xe3\x41\xf8\x7b\x54\xd5\x6e\xb7\x33\x7d\x38\x40\x3c\x80\x38\x0c\xc6\x86\x0f\x2e\x34\x3a\xbc\xb3\xd2\x28\xb0\x99\xc3\xb0\xda\xa8\xe6\x6f\xc3\xdf\x19\x06\x1b\x01\xea\x40\x27\x7d\x81\x7b\xdf\x45\x56\xd8\xef\xf7\x23\xab\x71\xb8\x5f\x13\x55\x45\x10\x1d\x34\xa9\x3b\x88\x0a\xfa\xfd\xbe\x34\xa9\x36\x51\x06\xd5\xae\x0a\x29\xb7\xfb\x7d\xb4\xc5\x52\x35\x29\xb7\xb6\x0c\x2b\x79\x25\x62\x6b\x87\xfd\x6f\x6e\x40\x65\xea\x83\x7b\xdb\x55\x61\x59\x58\x9e\x7b\xdb\x88\xd4\x9d\x9f\xe0\xa2\xd5\xc6\xa5\x50\x9b\x15\x42\x53\xcb\xb8\xaf\xc1\xeb\x35\xc7\xaa\x4c\x66\x35\x5e\x38\x40\x92\x24\xd0\x1f\xb4\x58\x58\x5b\xa3\x5d\x26\x3e\xdc\x82\x5b\xe6\x6e\x83\x9f\x62\x09\x8b\xd0\x6a\x0e\xe0\x9e\xf8\xed\xa8\xae\x37\xb6\x66\xc1\x7c\x4d\xda\xc0\x43\x70\x3f\x7d\x9c\x4c\xce\xde\x9c\x7d\x98\x36\x9e\xa7\xa7\x9f\xde\xe3\x6c\xff\x1f\x00\x00\xff\xff\x32\xb3\x3e\x77\x22\x5a\x00\x00") +var _templatesServerServerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd4\x5c\x7d\x6f\xdb\x38\xd2\xff\xdb\xfe\x14\xb3\x3e\x5c\x56\x2e\x6c\xa9\x2f\xd7\xc5\x5d\x6e\xf3\x00\xd9\x34\x6d\x73\x4d\x5b\xa3\xf6\xee\x3e\x87\xc5\x22\x65\x24\xda\xe6\x13\x99\xd4\x91\x54\x1c\x6f\xe0\xef\xfe\x60\xf8\x22\x51\xb2\x9c\xa4\xb9\xee\xbd\x04\x68\x6d\x51\x43\xf2\x37\x43\xce\x70\x38\x1c\x3a\x49\xe0\x44\x64\x14\x16\x94\x53\x49\x34\xcd\xe0\x72\x03\x0b\x31\x56\x6b\xb2\x58\x50\xf9\x57\x78\xf5\x11\x3e\x7c\x9c\xc1\xe9\xab\xb3\x59\xdc\xef\xf7\x6f\x6f\x81\xcd\x21\x3e\x11\xc5\x46\xb2\xc5\x52\xc3\x78\xbb\x4d\x12\xb8\xbd\x85\x54\xac\x56\x94\xeb\xd6\xbb\xdb\x5b\xa0\x3c\x83\xed\xb6\xdf\xef\x17\x24\xbd\x22\x0b\x8a\xc4\xf1\xf1\xe4\x6c\xe2\x1e\xf1\x1d\x5b\x15\x42\x6a\x88\xfa\xbd\x41\x2a\xb8\xa6\x37\x7a\x80\x5f\xe5\xa6\xd0\x22\xd1\xb9\xc2\x27\x2a\xa5\x90\xe6\x5b\x2e\x16\xf8\xc1\xa9\x76\x1f\xc9\x52\xeb\x02\xbf\x0b\x65\xff\x4f\x14\x5b\x70\x92\xe3\x83\xd2\x32\x15\xfc\xda\x7c\xdd\xf0\xd4\x7f\x26\x44\x8b\x15\x73\x8f\x2a\x25\xb9\x21\xd6\x6c\x45\x07\xfd\x3e\xc0\x60\xc1\xf4\xb2\xbc\x8c\x53\xb1\x4a\x16\x62\x2c\x0a\xca\x49\xc1\x12\x14\xcb\xa0\x0f\xe0\xc4\xf0\xa3\xa2\x6f\xc4\x54\xcb\x32\xd5\xaf\x73\xb2\x50\xb0\xdd\xce\xcd\x67\x58\xfd\xff\xa8\x52\xf4\x3a\xbb\xc2\x76\xcc\x5b\xd7\x00\xca\x65\xbc\xdd\xee\xef\x4c\x96\x1c\xf1\x24\x58\xc9\x48\x24\xec\x77\x12\x76\xd8\x68\x41\x15\xf3\x67\x2f\x92\x02\xcb\x77\x7a\xaa\xeb\xfb\xea\x03\x4f\x87\x82\x62\xbc\x13\x9d\xc8\x09\x5f\xc4\x42\x2e\x92\x9b\x04\xa5\xcd\xa9\x2e\x35\xcb\x8d\xa0\xb0\x45\x33\x78\x0a\xe2\x57\x74\x4e\xca\x5c\x9f\xb9\xe7\xaa\x47\xff\x3e\x78\x31\xec\xf7\x53\xc1\x95\x19\x72\x95\x2e\xe9\x8a\xbe\x9d\xcd\x26\x00\x47\x30\x70\x63\x59\x97\x4e\x7d\xa9\xaa\x8a\x7f\xe4\xec\xc6\x10\x97\x9c\xdd\x0c\xb0\xb5\x6b\x22\x21\xb3\xfd\x4f\x0d\x89\x82\x5f\x7e\xb5\x2c\xf5\xfb\xf3\x92\xa7\xc0\x38\xd3\xd1\x10\x6e\xfb\xbd\x16\xdd\x51\x45\x79\xeb\x04\x14\x2d\x89\x3a\xe3\x8a\xa6\xa5\xa4\x10\x3b\xba\x21\xe2\xee\x05\xb8\x46\x56\x4c\x66\x92\xbb\x4a\xd3\x7b\xaa\x4c\x47\x95\x42\xb8\x4a\x38\xdd\x09\xe3\x0a\xe2\xd3\x1b\x2d\x89\xc7\x64\x19\x6b\xd4\x47\x9e\xeb\xea\xfd\xde\xb6\xbf\xf5\xfa\xc8\x85\xde\x9d\x8c\xdb\xad\x11\x4a\xe4\xc6\xfc\xf4\x26\xcd\xcb\x8c\x4e\x0b\x9a\xda\x91\x51\x05\x4d\x5f\xb3\x9c\x82\xff\x73\xd2\xaa\x86\x7f\xbb\xa5\x9c\x5c\xe6\x34\x3b\x67\x4a\xa3\x7d\x08\x44\x0a\x90\xe6\x94\xf0\xb2\x98\xb1\x15\x15\xa5\x06\x00\x9c\xab\xf1\xab\x52\x12\xcd\x04\xef\x03\x2c\x24\x49\xe9\xbc\xcc\x2b\x8a\x36\xc1\x8a\xdc\xbc\xa5\x24\xa3\x72\xca\x7e\x33\x28\xdc\x44\x8f\x7f\xd8\x68\x8a\x65\x38\xbf\x94\x48\xaf\xa8\x9e\x10\xbd\xf4\xf8\xfa\x00\x4b\xa1\xf4\x2e\x6c\x63\x42\xfc\x1f\xe3\xba\x0f\x90\x1b\xe4\xe7\x6c\xc5\xb4\x2f\xba\xa2\xb4\x38\xce\xd9\xb5\xe9\xb1\x0d\x49\x52\x92\xed\xc5\xbb\x96\x4c\x53\xff\xb6\xf9\xb2\x0f\xa0\x73\xf5\x36\x84\x15\x00\xd3\xb9\x9a\x84\xd8\x3c\x14\x9d\xab\xf3\x10\x60\x50\xfe\x2e\x44\xb9\x0b\x45\xe7\xea\x53\x08\xb5\x93\xe2\xe7\x10\x6f\x27\xc5\x09\x95\x9a\xcd\x59\x4a\x34\x6d\x03\x0e\x5e\xbd\xa3\x9b\xe6\xab\xe3\x46\x3d\xf7\x6a\x58\x2d\x0e\xde\xba\x6c\xb7\xfd\x24\x81\xa9\x79\x3d\xcd\x59\x4a\x7f\x22\x12\x54\x59\x98\x71\x9a\x0b\x69\xc6\xbb\xaf\x37\x05\x05\x65\x5f\xe7\x25\x6d\x6b\x2d\xa7\xeb\x69\xf5\x32\xba\x26\x79\x3d\x09\x47\x50\xc0\x13\xff\x30\x84\x27\x41\x23\xb7\xfd\xde\x93\x02\x8e\x00\xe9\xfb\x3d\x49\x75\x29\x39\x44\x01\xc5\x30\x2a\x86\xa8\x3f\xa6\x8f\x48\x85\x95\x87\x30\xa5\x1a\x7b\x02\xdf\xb2\x59\x79\x4c\x9b\x68\x2c\x6a\xca\xc8\x99\xcc\x78\x5a\xe4\xcc\x54\x19\xc1\x60\x34\x18\x0e\xab\x2e\x39\xcb\xf7\xf6\xf2\x86\xa2\x39\x62\x5c\x53\x39\x27\x29\xbd\xdd\xc2\x2d\xb8\x6a\x9e\xa9\xe8\x09\x9a\x90\x7d\x28\x2d\xc9\xd0\xc1\xac\x6b\x7b\x54\x7f\x13\x8c\x47\x61\x53\x16\x1d\x98\x61\x41\x05\xbf\x6f\x68\x82\xc5\xbb\x69\x41\xdb\xba\x7b\xb4\xa3\xba\xd1\xb3\xa7\xe6\x6f\xb8\xcf\xfa\x60\x85\xd8\x02\xf8\x89\xc8\x49\x74\xe0\xcd\xd1\x08\x06\xf8\x75\x30\x82\x81\xff\xa7\x97\x14\x9c\x43\x62\xac\x96\x9d\x7a\x4c\x70\xd0\x02\x14\x95\xd7\x74\x30\x0c\xcd\x56\xe7\x42\xd7\xef\x99\x2e\x7f\x22\x32\x6a\xce\xa9\xe6\x6a\x30\x82\x83\xb6\xd5\x43\xb9\x19\x13\x4c\x3c\x98\xbc\x32\x88\x5a\x80\x25\x1f\x81\x5e\x32\x05\x29\xe1\x70\x49\x41\xd2\x82\x1a\x6f\x8a\xf0\xcc\x2f\x4b\x86\xd8\xb0\xe2\x6c\x3c\xe3\xd0\xe6\x6c\x30\xec\xf7\x02\x13\xdf\xb1\xdc\x3b\x36\x9a\x43\x17\xed\x60\xf6\x90\xe9\x60\x04\x6d\x06\xff\xa5\x2c\x18\xb4\xde\xea\x18\xa8\xcd\x85\x63\x04\x03\x57\x30\xd6\xb6\x64\x30\x82\x67\x4f\x9f\x18\x6b\x35\xa5\xa9\xe0\xd9\x08\x06\x66\x2d\x81\x82\x4a\x26\x32\x33\x3f\xd7\x4b\x96\x2e\x11\xcd\x9a\x30\x0d\x97\x74\x2e\x24\x85\x2b\x96\xe7\xa8\x09\x2c\xcb\x29\xa4\x82\x73\x9a\x62\xaf\x0a\x21\xed\xe2\x68\xad\x4f\xbe\x97\x79\x99\x87\x48\x5e\x3e\x0a\x89\x5a\x96\x5a\x23\x94\x4c\xac\x9d\x88\x70\x9a\xca\x0a\x89\x41\xd0\x50\xa2\x11\x0c\x56\xe4\x66\xbc\x34\x05\x63\xc5\x7e\xc3\xa1\x33\xde\xb0\x14\xb9\x32\x6d\xac\xc8\x0d\x5b\x95\x2b\xe0\xe5\xea\x92\x4a\x10\x73\xb8\xdc\x68\xaa\x82\xf6\x61\xcd\xf2\xdc\xac\x62\x50\x10\xa9\x10\x01\xbe\x94\xf4\x1f\x25\x55\x1a\x6c\xe3\xdf\x2a\xb8\xa2\x1b\x65\x06\xf6\x1a\x55\x40\x8d\x80\x71\xd4\xcf\x36\x7d\xce\x38\x8d\xe1\x4c\x43\x26\xa8\x32\x5e\x46\x6e\x56\x2a\xd3\x21\x2a\xbe\x98\x37\xe8\x2f\x45\xb6\x19\x0c\xfb\x8d\x39\x6a\x38\xad\x57\x71\x9c\x98\xe6\x61\x5c\x10\xbd\x44\x16\x93\x6b\x22\xd1\xd7\x4d\xb4\xc8\xc4\x18\xe7\x65\x8c\x14\x5e\xd7\xd0\x11\x72\x5e\x00\x4a\xd9\xce\x5b\x10\xbc\xb3\x1f\x74\x0c\x46\x30\xc0\x0f\xac\x9f\x8b\x94\xe4\xfe\x01\x1b\x3b\x9b\xb4\xdb\xb0\x4d\x9c\x71\x6d\xea\xa3\xfd\x1b\xc1\x00\x3f\x06\x23\x78\xea\x6a\x19\xab\x18\xd6\x33\x03\xcf\xbc\x83\x18\xcc\xb4\x51\x43\x53\x08\x48\xc2\x33\xb1\xb2\x52\xde\xe9\x2c\x70\x4e\x10\xab\x79\x1a\x1b\x01\xbb\xbe\x6b\x61\xd7\x23\x2e\x4a\xad\x34\xe1\x66\xa8\x9c\xd8\xf7\xcc\xef\xca\xd1\x19\xc1\x00\xbf\x8f\x09\x3e\x0c\x46\xf0\xc2\x4e\xe9\xf7\x8c\x97\xda\x98\x5b\xaa\xed\x1c\x9a\x9d\x4c\xa0\xa6\x04\xa7\x05\x0a\x19\x26\x69\x4a\x0b\xb4\x06\x01\xb3\x66\x66\x14\xb2\xe4\x54\x41\x86\x53\x0e\xeb\x07\xef\x21\x02\x1a\x2f\x62\x48\x73\x61\x66\x62\x4e\x0a\x2d\x0a\x58\xb1\x6c\x8c\x6a\x91\x0b\x92\x0d\xbb\xa1\x07\x6e\xd8\x08\x06\xf8\x14\xa8\xe4\x8b\xb6\x71\xf0\x6a\x91\xb9\x26\xbc\x12\x6a\xb6\xc2\x6e\xd1\xfb\x31\x1a\xd1\x9c\xac\xdd\x3d\x87\x3e\xde\x08\x06\xe6\xf1\x9f\xec\xdb\xb4\x51\x77\xae\x0a\xc1\x15\xed\x9c\xbd\xce\x85\xc4\x59\x97\xab\xf1\xa3\x27\xb1\x73\x37\x5d\x33\x0f\x9a\xcb\x8f\x9c\xc9\x4d\xec\x81\x57\xe8\xfa\x4e\xeb\x92\x70\x2d\x0f\x8a\x61\x8e\x3b\x10\x2d\xa0\x54\x74\x0f\x92\xfb\x7b\x7b\x47\x37\xae\xc3\x2b\xba\x09\x3b\x2a\x24\xbb\xc6\x4e\xae\xe8\xe6\x01\x1d\x41\xb4\x66\x7a\x89\x43\x56\x10\xa5\x8a\xa5\x24\x8a\x0e\xf7\xf5\x7e\xdc\xc1\x2d\xd9\xc7\x24\x29\xf5\x52\x48\xa6\x37\x9d\xac\x5f\x52\x04\x95\x01\xf6\x0e\xab\x52\x97\x24\x47\x37\xdb\xd4\xea\x1a\xdc\xf3\x86\xdd\xc0\x9e\xbf\xba\xed\x08\x77\x20\x95\x68\xff\xab\x4c\x48\x73\x87\xe4\x78\xf8\x57\x5a\x92\xd6\x06\xcc\x21\xf8\x3d\x0d\x8a\x77\xd3\xad\xc3\x7f\xca\xaf\x3f\x5e\x53\x29\x59\x46\x23\x21\xd9\x02\xfc\xa6\x29\xa3\xf3\xea\xbb\xf1\x03\xe2\x38\xf6\x3b\x1d\xbf\x95\xe8\xf7\x50\x45\x2e\x46\x70\x05\x87\x47\xa8\xfb\x0b\x6a\x69\x6f\xfb\xbd\x1e\x9b\x83\x50\xf1\x1b\xaa\x29\xbf\x8e\xae\x86\xf0\xcd\x11\x0c\x06\xe6\x8d\xdf\xf6\x84\xaf\xfb\xbd\x9e\x09\x56\x60\x35\xec\xda\x52\x1f\x1c\x80\x01\x75\x54\xd5\x75\x55\x33\x3a\x37\xd4\xbe\x25\xc9\x16\xfd\x7a\xff\xa1\x77\xb8\x62\x5c\x5b\x96\xcc\x97\x36\x3f\x8c\xeb\xc7\x33\x73\x3d\xc2\x9d\x1f\xd6\x71\x31\xc4\xf8\x58\x0b\x16\x85\xe4\xc8\x1d\x36\x81\x74\xdf\x1c\xe1\x76\xcf\x56\xed\xcd\x57\x3a\x7e\x5d\x48\xc6\x75\xce\xb1\xc6\x54\x67\x54\xca\x11\x5c\x8d\x60\xc0\xac\x2b\x45\xd0\x98\xb2\xcc\xe9\xe7\xc0\x34\xd5\x13\x2a\x3e\xbd\x61\x3a\x7a\x66\x1e\xb7\x81\x4c\xaf\x3b\x04\xf9\x34\x94\xe3\xd3\xfb\xc5\x18\x6c\xe8\x92\x04\x3e\xd0\xf5\xd4\x7a\x8d\xa9\x44\x57\x5f\x01\xc1\xed\x36\x90\x82\xe1\xfe\x69\x59\xae\x08\x47\x27\x2f\xfe\x40\x56\x14\xb6\x5b\xef\x63\x5e\x96\x81\x43\x98\x0a\x3e\x67\x0b\xb4\xa4\x4c\xdb\x51\xaa\x9a\x8d\xb0\xa1\x27\xb7\xb7\x10\xd7\xa1\xde\xf8\xf6\x16\xad\x6b\x4a\xf2\xb0\xe5\xe3\xc9\xd9\x10\x9e\x38\x30\xb7\xfd\x9e\x42\xa1\x73\xba\x8e\x6c\xd1\xb0\xda\xd0\x75\x06\xba\xcc\x3e\x43\xc5\xa7\xed\x60\xd5\x11\xb4\x77\x45\x48\x76\xd2\x8c\x5b\x1d\xb5\x02\x59\x48\xf2\xa6\x15\xb9\x3a\x6a\xc7\xb2\x90\xe8\x7d\x6b\x07\xdc\x70\xe6\x91\x60\x5a\x47\xae\x8e\x82\x30\x16\xbe\x32\x81\xa2\xa3\x0e\x45\x75\xfe\x2b\xae\x21\x6f\x3f\x4e\x67\x38\x29\x54\x6c\x62\x47\x47\xed\xd9\x6f\x5d\x55\x34\xf5\x93\x8f\x9f\x1c\x65\x18\x4d\x3a\x0a\x83\x5f\xf8\xb2\x0e\x29\x1d\xd5\x41\x30\x7c\x11\x46\x92\x8e\xc2\x10\x18\xbe\x6c\x04\x91\x8e\x1a\x31\x30\x7c\x3d\x3b\x9f\xee\x65\xa6\x72\x67\x2c\xc3\x23\x18\xcc\xce\xa7\x17\x86\xaf\x06\x7f\xb3\xf3\x69\x37\x8b\x95\x23\xf3\xd4\xd5\xad\x39\x9d\x9d\x4f\xc3\x20\xd4\x9e\xee\x9b\x6b\xf4\xc0\xb5\x72\x72\xfa\x69\x76\xf6\xfa\xec\xe4\x78\x76\xda\xd5\xd8\x3b\xba\x79\x40\x7b\xd6\xe7\xf0\x4d\x4e\x3e\x9d\xfd\x74\x3c\x3b\xbd\x78\x77\xfa\xf7\xba\xc9\xe3\x87\x20\x3c\xde\x83\xf1\xb8\x13\x66\x73\x80\x9b\xbe\x80\x23\x09\x87\x39\x5c\xc6\xdd\xeb\xe6\x60\x37\x57\x49\x47\xd2\x1a\xf2\xd6\x42\xd6\x07\x40\x6d\x1c\x77\x87\x75\x00\x54\x6c\x9e\x8e\xaa\xf8\x72\x55\x21\x08\xce\x54\x0f\x3d\x15\xe3\x5e\xd9\x6c\x93\x51\x87\xae\x68\x94\x2e\x89\x89\x61\x95\xa9\xbe\xdd\x1a\xc6\xd1\x8e\x1c\xa1\x59\xc2\x07\x13\x30\x93\x65\xa1\x1b\xf4\x68\x62\xcd\x91\xcf\x08\x9e\xd5\xe1\x37\xd5\xb7\x96\xee\xc4\x1b\xa9\xe3\xc9\x59\x6d\xb1\xac\xc7\x82\x45\xb8\x13\x5e\x12\x9e\xe5\x54\xaa\xb8\x8e\xb6\x39\xeb\xd3\xa8\xee\xe2\x5f\x80\xec\x5b\x64\x95\xdd\xaf\xe2\xbe\xb1\x6b\x0b\x8d\x4b\x58\xd5\xd0\x0f\x0d\xdd\xb6\x8d\xcc\x5a\xb2\x16\x36\x92\x65\x0c\x9d\x00\x92\x83\x3d\x57\xca\xe8\x9c\x71\x7b\x48\x87\xef\x2b\xcc\xf0\x81\xd2\x4c\x39\x67\x32\x25\x79\x8e\x34\xce\x71\x40\x3f\x98\x48\x45\x65\x3c\xc1\x8f\x3b\xd8\x33\x18\xee\x67\x30\x6d\xd2\x77\x70\xe5\x2c\x39\x2e\xbb\xd8\x7d\xe7\x62\x72\x3c\x39\xb3\xb1\x5f\x47\x6c\x47\x1c\xad\xff\x8e\x21\xaf\x8e\x67\xf6\x9e\xba\xc1\xe7\x5c\xf0\xc5\xa1\x8f\x79\x41\x46\x55\x2a\x59\x81\xb2\x3b\xfc\x9d\xc3\x5d\x9f\x83\x60\xd7\xc9\x9d\x67\x22\x77\xc0\x07\xf0\x1c\xb4\x83\x61\x4d\x56\xfe\xc9\x38\x98\x67\xec\x70\xf0\xec\xa9\x6a\x20\x6f\x2f\x79\x8f\x40\xbe\x13\x3d\x7b\x0c\xf4\xbd\x81\xb3\x00\xfa\xcb\x26\xf4\xf7\xf7\x1d\x23\xdd\x3f\x6d\xda\x81\xb7\x26\xf2\xff\xbe\x18\x5c\x1c\x8a\xeb\x3d\xfb\x21\x94\x57\xbf\x17\x38\x26\x77\x7b\x55\x95\xd6\xd1\x5c\x51\x7f\xb6\x1d\xa3\x4d\xe7\xa8\xc4\x5e\xe7\x82\x70\xde\xae\xe2\xed\x0d\xdf\xd5\x08\xab\x00\xe0\xed\x2d\x64\x44\x2d\xa9\x0c\x0d\x85\x0d\x06\x86\x03\x9e\x89\x15\x61\xdc\x72\x71\x0e\x9c\xea\xd8\x9b\x8a\x7e\xbf\x67\xbc\x91\x87\x9a\x0b\x13\x55\xd9\xc5\xdc\x0e\xb0\xd4\x50\xeb\x58\x0c\x50\x7e\x7d\x68\x9d\x98\x10\x9b\x71\x64\x18\xd7\x0f\xd2\x18\x13\x9a\xd9\xed\xfe\x2b\x85\x1b\x2d\x42\xe3\x32\x85\x08\xcf\x5b\x47\xa2\x77\x23\x75\x7f\x0e\x70\x23\xce\xd0\x04\xfe\xe0\x78\x43\x88\xe5\xdd\xde\xb3\xd8\xfb\xc7\x2e\x88\x47\x34\x91\xfc\x5b\x63\x11\xf5\x54\x79\xb1\x6a\xb0\xfa\x69\xef\xc9\xf2\xfd\xac\x36\xc2\x16\x4d\x66\x1f\x19\xb1\x08\x60\xb6\x16\x82\x9f\xf7\x1e\x72\xdf\x8f\xb3\x19\xdc\xf8\x62\xa0\xdd\x71\x8d\x1a\xea\x77\x2d\xa8\x4b\xad\x0b\xeb\x3c\x9c\x03\xb4\xed\x80\xdf\x98\xb4\x8f\xe3\x1f\x30\xdd\x1d\x37\x55\x0c\xf6\x5e\x03\x61\x1d\x9d\x5c\x8d\x60\xbd\xa4\xdc\x98\x53\x77\x4c\x49\x33\x60\xfa\x5b\xb7\x3a\xa0\x3d\x23\x0a\xc6\xe3\xc0\x80\x54\x3b\xa2\x90\x31\xbf\x21\x6a\xe4\x0b\x3c\x48\x4f\x43\xec\x5f\x64\x5d\x1e\x65\x5b\xaa\x2d\x59\x0b\x7c\x2b\xad\xe0\x6b\x2c\x32\xed\x68\xf2\x2e\x5f\x61\x64\xf5\xee\x78\x72\x0d\x3e\xdc\x62\xed\xe7\x01\x37\x84\x5f\x8b\x87\x2b\xba\xe9\x1a\x93\x20\x4e\xfd\x50\xec\xe1\x96\xb3\x8d\xbd\x99\xa0\xf1\xd5\xe4\x4f\xee\x11\x7b\x1d\xe6\x7e\x50\x68\x3b\x18\x87\xe3\xbb\x86\x62\x37\x47\xe6\x8b\x75\xe1\x6b\x2f\x5c\x8d\x7d\xf6\x6e\x86\xce\x5d\xf8\x1a\x93\xe1\x3f\x71\x09\x6b\xf1\x79\x57\x9e\xd1\x03\xf9\xfc\xfa\xeb\x57\x0b\xe3\x5d\x99\x4e\x0f\xc4\xf8\xbb\xac\x5d\xed\xd5\x4a\x55\xcb\x55\x6b\xb5\xea\xcc\x92\x31\x1f\x5f\xc5\x43\xc7\x7d\xea\xae\xea\xde\x93\x52\xf3\x39\x4c\x55\xf4\x5c\x90\x82\x41\xf3\xef\xa1\x01\xde\x7e\xcf\x47\x45\xea\x3f\x94\x49\xfc\xd6\x16\xe3\x7b\x55\xef\xf9\xcd\xdf\xa5\x10\x79\xbf\x57\x05\x88\xaa\xbf\x46\x88\xc8\x12\xe0\xa6\xf1\x55\x45\xc4\xb8\x7e\xf1\xbc\xdf\xab\x62\x45\x34\x83\xb0\xc5\x3a\x86\xd4\x68\xb1\x0a\x22\xb9\x30\xc6\xb9\x58\xcc\x21\x17\x0b\x05\x2b\xaa\x14\xf2\x47\x99\x5e\x52\x09\xd7\x8c\x54\xa1\x98\x52\x51\x89\x44\x28\x49\x61\x5f\xa9\x8d\xd2\x74\x05\x82\x53\x3b\x76\x0d\x1a\x56\x45\x71\x3a\x22\x4d\xd8\x63\x54\x1f\xcf\x10\xb9\x30\xc7\x19\x41\x92\x98\x49\x60\x6d\x87\x66\x0e\x0e\xec\x73\x7c\x6e\xfb\x08\x8e\x22\xc2\xf2\x68\x6e\x9b\x8c\xe3\x78\xd8\xef\x6d\xed\xa4\x41\xa2\x5c\x2c\xe2\x89\x64\x5c\xcf\x5b\x24\x4e\x10\xaf\x89\x26\xf9\xef\x2b\x8a\x24\x81\xd3\x1b\xa6\x95\x5d\x2a\xb8\xe0\xe3\xdf\xa8\x14\xa0\x34\xd1\xa5\x02\x32\xd7\x54\x82\x39\x4f\x61\x7c\xb1\x2b\x37\x0b\xf0\x5f\x25\xb9\xc6\x29\x4d\x4b\x8c\x1e\x49\x97\x18\xa7\x54\x77\x04\x20\xab\xa8\x81\x5e\xda\xe7\xca\x75\x3c\x9e\x9c\xdd\x15\xd9\x33\xcc\xef\xca\xc2\xf6\xf2\x85\x87\x2f\x56\x34\x26\xd0\xda\x92\x00\x98\x67\xf3\x54\x87\x35\x6d\x89\x8d\xb2\x22\x7f\x3b\x51\xda\x3d\x11\x50\x13\x29\x0c\x13\x1a\x3d\xe8\x25\x51\x36\x3f\x2d\xb2\xb1\xb6\x2a\xf7\x12\x15\xd6\x1c\x09\xb9\x10\xdc\xe1\x11\xec\x1e\xf5\x18\xf0\x39\xe5\xae\xb2\x1a\xd6\xe7\x61\xaa\x4a\xf2\x6e\xa6\xc1\x59\xd4\xee\x60\xf0\xba\x3e\x18\xf4\xf4\xee\x6c\xf0\x1a\x5b\x72\x90\xc2\x13\x4e\x2d\x4b\x5a\x1d\xc8\xb9\xb2\x39\xc9\x15\x0d\x23\xa0\x36\x86\x5b\xb0\xae\x31\x92\xd7\x34\x1a\x42\x44\xa5\xb4\xe9\xa5\x7e\x08\xbe\x41\xd9\x05\x76\xd0\xe1\x40\x3a\xe4\xdc\xbe\x88\x86\x7f\x6d\x1f\x39\x82\xcf\xfe\xa4\x52\x7a\x60\xfd\x5e\x92\x80\xa2\xda\xb3\xee\xe3\xc5\x23\xab\x8b\xa8\x93\x0a\xdf\x3b\xb5\xa8\xc6\xac\x6e\xb5\x52\x97\xa0\xac\x57\x77\x24\xa4\x8a\x3f\xd0\x75\x34\x48\x09\xff\x56\xbb\x63\x44\xc3\xf5\x4e\x8f\x44\xa1\xf6\x63\x53\xb6\xcf\x81\x3d\x18\x36\xf3\x6a\x4a\xb5\x5b\x04\x6c\x30\x39\xb6\xe2\xe1\x2c\x1f\x0e\x2d\x1f\xeb\x85\x3f\x11\x54\x1b\x9e\xc6\x3f\x13\xa6\xdf\x48\x51\x16\xc3\x7e\x4f\xf0\x94\x36\x5e\x7e\xe4\x29\x1d\xf6\x7b\xf6\x06\xc8\x07\xa1\xd9\x7c\x13\x05\xc7\x06\xc3\x7e\x6f\x21\x1c\xae\x33\x5f\x18\x61\x2b\x23\x50\x43\x9c\xc9\x66\x8c\xcc\x4c\xfb\xe5\xd7\x27\x66\x89\xb2\xc3\x76\x8b\x48\x9c\xa4\x9a\xb3\xf5\x47\xce\x6e\xcc\x00\x36\x62\x53\x1e\x55\xd0\xc4\xb0\x45\x52\x9f\x22\xfe\x60\xa2\x88\xe6\x08\x2c\x6a\x1d\x2e\xee\x54\x7a\x5b\x29\x57\x35\x68\x76\xac\x18\xd7\xdf\xfd\x29\x6a\x9f\x71\x0e\xe1\x7f\x9c\x32\x34\x9b\x39\xcb\xf2\xe0\x98\xa7\x5d\xcb\x0f\x4f\xa5\xbf\xee\x50\x37\x6c\x62\xe4\xee\x29\x8c\x9c\xba\x46\xe1\xa9\xe7\x70\x68\x46\xd7\x49\x13\x2d\x43\x41\x79\x16\xb9\x82\x11\x84\x0d\x21\x8b\xeb\x45\x7c\x9c\x65\xf6\xe4\x5b\xc5\x66\x25\x1c\x60\x9f\x26\x21\xa1\xeb\x04\x81\x68\x13\x5d\x3c\x4c\x92\x3f\x2a\x84\x10\xf6\xdd\xef\xe1\x28\xa3\xde\x45\x79\xc3\xd9\x1a\x5a\x65\xc9\xe8\x1c\x6d\xee\x22\x7e\x25\x38\x8d\x86\xa6\xcc\xa9\xd9\xe1\x51\x03\x9a\x9b\x8c\x79\x53\xe5\x0e\x0e\xfc\x93\x19\xdd\x53\x29\xad\x78\x4e\x72\x81\xfb\x1d\x23\x6c\xe5\x17\x83\xc1\x1f\xaf\x07\x26\x97\xc0\xf6\xb3\x35\xff\x57\x2c\x6a\x51\x14\x34\x33\xcb\xc0\x63\x59\xdd\x46\x2a\x6e\x44\x45\x9d\xda\x74\x4e\xd6\xb7\xb3\xd9\xc4\x4e\xd6\x3a\x80\xb2\x67\xaa\xd6\x04\x0f\x9e\xa8\x41\x95\xe6\x51\x63\xe3\x9c\xb9\x49\xd8\x3a\x70\x6c\x1e\x3a\x37\x49\xa7\x54\x57\x1b\x2f\xe5\x96\x81\xc8\x4f\xfb\xea\x8d\x99\xf1\x43\x6f\xbf\xc2\xfd\x63\xa5\x09\x2a\x0e\xc3\x47\xc8\xbd\xb9\xd3\x14\x1b\x32\x3f\x59\xa2\x06\xd5\xa8\xd9\x56\x65\xc0\x1e\xa2\x78\x01\x0b\x0f\x53\xbb\xa0\x42\x97\xba\x77\x28\x66\x5d\x63\xe4\x2e\x51\x21\xe0\x00\x3f\xaa\x97\x8c\x86\xb1\xbf\x38\x70\x8f\x7e\xd6\x35\x1f\xab\x9d\xd8\x42\x3d\x65\x77\x91\xdc\xa1\xa5\xce\x5c\xed\x68\x69\xaf\x56\xd2\xc6\xac\x78\xa4\x8a\xee\xd1\x51\x9b\x78\xf3\xa5\x1a\x1a\xb2\x9b\x07\x2c\x6e\x9b\xd3\xe8\x3e\xdd\x9c\xd6\xca\xa9\xee\xd5\x4e\xf5\x08\xf5\x54\x7b\xf4\xb3\xb9\xd9\x6f\x11\xef\xe8\x68\x6b\xdb\xdd\x22\xbf\x53\x4f\xc3\xe8\x49\x53\x55\x5b\xd1\x9e\x96\xb6\xaa\x87\xa9\xab\x0a\xf4\xb5\xd9\xa0\x4b\x46\x7b\xb0\xc6\xaa\x87\xab\x6c\xb3\xc2\x1e\x95\x4d\x12\x38\xe3\xaa\x60\xd2\x1e\xe1\x9b\x1a\x87\x49\x72\x89\x1b\x87\x4b\x49\x52\x7a\xc9\xb8\xb9\xc3\x49\xd2\x25\xa3\x38\xd9\xc6\x05\x95\x73\x9a\xea\xb1\x52\xf9\x38\x27\x97\x6a\xac\x52\x21\xe9\x18\x77\x0b\xe3\x85\x68\x75\x3b\x3b\x9f\xda\xc3\x7c\x38\x82\x03\x9d\xab\xd8\x3e\x19\x7e\x92\x04\x4e\x48\xa9\xa8\x02\xaf\xf2\x2e\xd2\xf8\x46\x7c\xab\x2a\x7f\x2d\x65\xc5\x92\x4a\x55\x32\x4d\xa1\x90\xa8\x7e\x94\xa7\x54\x8d\x5c\x0b\xf6\xcc\x96\x48\x0a\xba\xc4\x1d\x9f\x16\x40\xae\x05\xcb\x80\x68\x4d\xd2\x2b\x15\xc3\x2b\x77\x4a\xb9\x34\x91\x11\x0e\x69\xce\x28\xd7\x2a\xc6\x06\x26\xa6\x41\xa7\x85\xa6\xa3\x29\x76\xa4\x0e\x8d\x3b\xed\xfb\xf8\xc8\xf3\x8d\x01\x96\x96\xf2\x9a\x2a\xd7\xe7\x92\x5c\x53\x20\x4a\xd1\xd5\x65\xbe\x01\xb6\x2a\x72\xba\xa2\x5c\x9b\x98\x85\x72\x35\xbd\x3c\x1b\xd7\x69\x73\xc2\x17\xc9\x42\x24\x5a\x52\x9a\xac\x88\xd2\x54\x26\x4a\xa6\x89\xbb\x5c\x4c\xf3\x9c\x15\x9a\xa5\xd8\xc4\x09\x76\x38\xa9\xb9\x3e\x84\x5f\x7e\x35\x52\xc4\xf2\xb3\x57\xb7\xd5\xf7\xc9\xf3\x97\xdf\x6d\x11\xaf\xcf\x83\xf9\x51\xd1\xf7\x22\xa3\x92\xe3\xff\xf6\xd2\x26\x02\xfa\x51\x51\x58\x99\x72\x13\xf5\xc4\xaf\x15\xc8\x35\xbb\x62\xf1\x4a\xfc\xc6\xf2\x9c\x98\xbb\xb5\xe6\xee\x28\xd3\x9b\xc4\x0a\xe8\x62\xca\x32\x7a\x31\x3b\x9f\xfe\xc1\xb6\x7c\x91\x8a\x55\x41\x34\xbb\x64\x39\xd3\x1b\xec\xe0\x03\xbd\xd1\x13\x29\xb4\x30\x40\x5d\x28\x68\xb0\x7c\x3e\x70\xf6\x3f\x79\x16\x3f\x1b\x6c\x47\x2d\xe1\xac\xd7\xeb\x58\xac\x89\x2a\x4c\xa7\x8c\x67\xf4\x26\x2e\x96\x45\x32\x93\x84\xab\x42\x48\x7d\x71\x4e\x36\x54\x5e\x60\xcb\x36\x6c\x78\x71\xb2\xa4\x44\x5f\x4c\x97\x94\xea\x3f\x7c\x2a\x73\x7a\x31\xbe\xc0\x41\xba\x98\xda\x0b\x63\x17\x53\x2d\x05\x5f\x98\x1a\x22\x15\xb9\x19\x8e\xf7\x8c\xff\x44\xa5\x62\x82\x1f\x22\xef\xb1\x7b\x98\x9d\x4f\x9f\x3d\xf7\x90\x66\x4b\x8a\xc3\x5c\x4f\x39\x55\xdd\x41\x7b\x2d\xe4\x9a\xc8\x0c\xa6\x34\x95\x34\xdd\x1c\x56\xf0\x29\x8f\x51\x72\x05\xcd\x98\x15\x1b\x3e\x25\x8e\xfc\x42\x59\x72\x33\x98\x8d\x09\xf6\xcb\xaf\x25\xe3\xfa\xd9\x77\xd6\xea\x23\xa0\xd9\xf9\xf4\xe2\xf4\xe4\xd5\xdb\x53\xfc\x7f\x7a\x7c\xf1\xf3\xd9\xec\xed\xc5\xf1\xe9\xf4\xe2\xf9\xcb\xef\x2e\xde\x9c\xbc\xbf\x98\xbe\x3d\x7e\xf1\xe7\x3f\x8d\x3a\x2a\x7c\xfa\x32\xf2\x56\xfb\xcf\x9e\xff\xd9\x57\x78\xfe\xf2\xbb\x7b\xdb\xbf\x9f\x3c\x68\xff\xe4\xed\xf1\xc9\xdb\xe3\xe7\x4f\x2f\x26\x1f\xcf\xff\xfe\xec\xc5\xd3\x97\x77\x36\xdf\x4d\x5d\x4d\x6c\x1f\xf3\xb3\x0e\x49\x92\xc0\x65\xc9\xf2\x0c\x4c\x64\x1c\xc7\xc6\x3a\x20\x30\x97\x62\xe5\x83\x18\xa2\xf0\xfa\xe8\xcd\x79\x78\x12\x51\xa5\xfe\x76\xa5\xdc\x05\x89\xb7\x9d\x26\x2d\x0e\xe8\x95\xcf\xfd\x72\xfa\x19\xa6\xd0\xd9\xcc\xd9\xfb\x9b\xf8\xe5\xe9\xaf\x23\xb7\xad\xc6\x36\xce\x05\xc9\xfe\xf7\xe5\xd3\xbf\xbc\xa3\x9b\x09\x61\x32\xda\x1f\x36\x76\x5b\x9d\x2a\x28\xda\x66\x66\x7f\xcd\x61\x55\x67\x74\xc7\x2f\x08\xdc\xd7\xfe\x3b\xba\x79\x48\x17\x7b\x53\x93\x1b\x71\x82\xde\x36\xf0\x62\x3b\xd2\x16\x83\x51\x49\x12\x97\xa1\x12\x86\xa8\x4e\x8e\xc3\x13\x20\x24\x4b\x09\xd6\x1f\x81\xfd\x3c\xb5\xbe\x1a\x13\x66\xb5\x46\xf7\xe2\x35\xcb\xe9\x17\x4b\xf7\xf8\x0b\xe5\xeb\x99\xaf\x41\x74\x89\xa0\x7a\x5b\xb9\x7c\xb6\x64\x22\x44\x8e\xa8\x6f\x5e\x3e\xfd\x4b\xfc\x81\xae\x7d\x99\xf5\x40\x85\x49\x23\xaf\x29\xe3\x63\xe3\x38\xe3\xa3\x7a\x2d\xc5\x6a\x72\xfa\x3e\xb2\x6f\x3d\x8a\x6f\xc4\x55\xb3\xe3\xf9\x4a\xa3\x3f\x2a\xe4\xdc\x84\x4e\xb8\xd0\x36\x45\xaf\x25\xce\x41\xed\x8b\xee\x99\xcf\x66\x71\x3d\x39\x46\x7d\xa8\x01\xdd\x47\x7f\x5c\x9a\x94\x64\x9c\xf5\x9f\xe8\x3f\x4a\x26\xe9\x31\xcf\x7e\xa2\x92\xcd\x37\xae\x41\x2a\x75\xa0\xf6\x29\xc9\x73\x48\x4b\xa5\xc5\x0a\x66\xe7\xd3\x2a\xa2\x47\xb4\x90\xe1\x3e\x64\x76\x3e\x8d\x3a\xfb\x1d\xba\xf9\x95\x53\xde\x4d\xd0\x50\x4c\x17\xbc\x3b\x38\x80\x6e\xda\x37\x54\x37\x12\x6b\x83\x81\x4d\x12\x17\x29\xae\x6c\x14\xe1\x99\x87\xee\xcc\x15\x3a\x2f\x05\x3a\x12\x99\x4b\x00\xa4\x3c\x53\x50\x16\x3e\xf0\xdc\x9e\xcf\x5d\x86\xac\xbe\xb5\xd0\xf9\xde\x64\x10\x07\x24\xc1\x2e\xc3\x1f\x62\x19\x17\xd0\xe6\x74\x7e\x1e\x8f\x5b\xa7\xdb\x9f\x0d\x6c\x57\x7e\x45\x37\x9f\x61\x4d\x25\x6d\xe6\x15\xb8\xfb\x02\xdb\xfe\x3d\xed\x77\x36\xbf\x26\xaa\xab\xb5\xed\x1e\x7e\xdb\xfc\x3c\xa0\x3b\x8b\xfa\x8e\x6e\x92\xc4\x4a\x7f\x69\xb6\x9d\x2e\xec\x4f\x60\x8d\x9e\xc4\x1d\x93\x2d\xe8\xbb\x39\x54\xa6\xb3\x6a\x2a\xda\x0c\xc3\xd9\xf9\xb4\x0e\x33\x26\x09\xac\x4a\xa5\x9d\x23\xa9\x21\xa7\x44\x69\x73\x30\x11\xb6\x22\x24\x14\x84\xb3\x54\xed\xf3\xac\xe3\x1f\x70\x11\xc4\x5d\xdf\x4c\x04\x22\x8a\x86\xfb\xb6\xe4\xaa\xb1\x27\xaf\xb7\xc2\xea\xf1\xbb\x72\xf5\xcf\x6f\xcb\x55\x73\x5f\xae\xbe\xf6\xc6\x5c\xfd\xc7\xed\xcc\x55\xf7\xd6\x1c\xad\xe0\x07\xba\xde\xbb\x85\xec\x36\x68\x55\x58\xba\x92\xfe\x42\x54\x5b\xbd\xa9\x3b\xaf\x8c\xd6\x8b\x11\x1c\xb8\x91\x1b\x5a\xf2\x9f\x09\xd3\xd1\xce\xef\x43\x24\x09\x58\x00\xd5\x4d\x9c\x66\xce\xb2\x4f\xa4\xb6\x6d\x75\x1c\x1b\xba\x53\x81\xea\x97\x2a\x5c\xf6\x76\xf3\x24\x01\xd0\x3c\xe6\x92\x92\x6c\x03\x19\x4e\x7c\x54\x40\x93\xb7\x1d\xa0\x01\xd8\xf6\x83\xea\xdd\xd1\x09\xac\xe3\xb6\x37\x28\x1f\xfb\x7b\x2c\x6c\x6e\x85\x65\x9f\xd6\x44\xf1\x6f\xb5\x3f\xdf\xab\x13\xca\xab\x0b\x23\xce\x9e\xf8\x94\xf9\xe0\x22\x89\xb9\x2d\xe2\xf2\xc9\xab\x6d\x94\xe9\xc7\xe5\x2c\xd9\x94\x8d\xaa\xbf\x46\x69\xab\xdf\xee\xb8\x42\x75\x3a\xd4\x75\xab\xa2\x11\xe4\x73\x7b\xfb\x10\x84\x4e\x0b\x93\x93\x01\x36\x27\xa3\x82\xd1\x2a\xef\x02\xd2\x1d\x00\x69\xa1\x09\x2f\x70\x04\x31\xcd\x0e\x24\x26\x33\xc2\xa5\x2c\xd4\x38\x1a\xa5\xf7\xa0\x08\xe2\x3d\x3b\x38\xee\x0e\xdf\xb6\xb1\xd8\x04\x88\x1d\x30\xcd\xe2\x7b\xd0\x84\xf1\xa4\x1d\x38\xf7\x05\x89\xb7\x77\x4e\x5d\x7f\x42\x83\xb3\x2a\x13\xab\xa9\x48\xaf\xbc\x66\x54\xb7\xfc\x6a\x3b\x17\xdd\x7d\xac\xe1\x26\x73\xc3\xb3\xb6\xf3\x38\xf0\xad\xed\xfc\xb5\x93\xbb\x99\xb1\x7c\xd4\x46\x70\xaf\xd2\x79\xe4\xf9\x5d\x90\x75\x5a\x0c\x46\xa6\xe4\x6f\x82\x71\xd4\xa1\x89\x90\x3a\xf2\x97\xaf\xfc\x1d\xc6\x33\x2d\x48\x64\x2f\x95\x0d\xbf\x8c\x17\xf3\xb1\x1c\x41\x51\xdf\x8b\x5c\x93\x85\xfd\xf1\x9b\xaa\x3b\x0f\x71\x77\x59\xfb\x62\xa9\x39\x7b\xb0\x74\x8f\xee\x8e\x58\xe1\x1e\x9b\xe1\xfb\xfc\xa1\xa2\xac\xec\x57\x75\x79\xea\x4b\xc5\xe9\x2c\xd5\x8e\x44\x5d\xd6\xe6\x63\x84\xaa\x96\x23\x50\x77\x8a\x35\x40\xfb\x15\x24\x1b\x18\xdb\x65\x5d\xe4\x04\xac\x42\x09\x07\x21\xd7\x00\x82\x97\x72\x6b\x85\x39\x72\xc7\xe2\x3b\x8b\x9b\x5f\x11\x7d\x98\xc0\x78\xe5\x39\x25\x1c\xfd\x6e\x49\x95\x28\x65\x4a\x55\xc7\x31\xb9\x5f\x49\x83\xdf\x60\x62\x73\xb0\x3f\xdd\x17\x9f\x88\x55\x41\xcc\xe6\x65\xba\x26\xc5\x19\xd7\x2f\x9e\x47\x07\xf6\x3e\x99\xcf\x06\x32\x57\x07\x9f\x59\xa7\x25\x45\xef\x22\xaa\xef\x9b\x0d\xc3\xb3\xfb\xf6\x0f\x35\xd5\x79\x09\xad\x15\x1d\x9e\x34\x4f\xa0\x47\x3e\x9c\x3a\xd1\x12\x9e\x34\x0f\x8c\x4d\xbf\x49\xe2\xfd\x24\xeb\x7f\x8a\x34\x2d\x25\xe4\x04\x67\x90\xdb\xac\xd4\x67\xde\xb2\xe6\xd8\xd4\x8c\xb4\x80\x42\x52\xd3\x05\x88\x3c\x83\x4b\xba\x24\xd7\x4c\x94\xe8\x0c\xb5\x9d\xb0\x7e\xef\xfb\x71\xcd\x5e\xf3\x24\xfb\x49\x8d\xb2\xdf\xef\xa5\xfa\x06\x37\xe8\x3c\xa5\x66\x9f\xeb\x7e\x72\x31\xfe\x99\xe9\xa5\x33\xa8\x91\x2f\x9b\x7d\x7c\xf5\x31\x1a\xa2\x9f\xd8\xba\x22\x54\x01\xb0\xed\x60\xff\xc6\x29\x98\x33\xa9\x34\xd0\x1b\x9a\x96\x2e\x17\xa0\x90\x74\x5c\xe5\x70\x2d\x85\xb8\x72\xd9\x22\xf1\xc4\x3b\xca\x01\xd7\x75\xba\xd7\xc9\x92\x70\x44\x57\x5f\xf2\xbb\x14\x22\x1f\xda\xa4\x0d\x16\x64\x6c\x38\x2e\x6f\x2b\xbf\xd9\xe8\x90\x2d\xfd\x85\xfd\x1a\xf8\xb2\xce\x7b\xbd\x36\x3f\x76\x95\xa6\x54\x29\x97\x10\xe6\x3d\xda\x90\xaa\x09\xe4\xfb\xb1\xaf\x62\xbc\xd0\xb6\xcf\xab\x9c\xbb\xeb\x19\x49\xf5\xcd\x6e\x8e\x86\x59\x31\xcd\xbe\xdf\x06\xcd\xaa\x34\xcc\xfa\x57\x9b\x84\xf4\xa3\xe1\x17\xcd\x43\xe7\x0d\x5b\x8f\xd7\xfc\x4a\xa2\xe3\xd2\x77\x76\x08\x4d\x0f\xb9\x4e\x48\xea\xf5\x3c\x9b\x5e\x35\x5d\xc0\x27\x1a\x56\xf9\x21\x38\x93\xa1\xe4\x9a\xe5\x80\xfb\xfc\xda\xe9\x34\x1b\x25\x57\x7f\x5e\xe6\xf9\xc6\x5c\xce\xb2\x17\xb3\x5c\x06\x52\x4a\xec\x45\xb3\xe6\x28\xf6\xab\x5e\x0f\x7d\xb7\x38\x64\x1d\xa3\x55\x81\xf3\xdf\x0e\x0e\xe0\xfb\x71\x28\x77\x7f\xe1\xdd\x13\xd4\x89\x59\xbb\xfa\xe2\xd3\xac\xde\x54\xe9\x24\xce\xfe\x29\x20\x3e\x11\x05\x4a\x85\x73\xd8\x7a\xd4\x54\x75\x67\x93\xd5\x0d\x44\xc3\x46\x8e\x22\x76\xef\xaf\x96\x56\xe7\x3a\x55\x6e\x97\x27\x22\x79\x2e\xd6\xca\x65\x70\xdb\xdb\x6c\xc4\xf9\xc9\x8e\x42\x70\xbb\xf9\xdd\xe7\xcf\x07\x09\x31\xbe\x4a\x08\xc3\x4c\xd0\x30\xc7\xaa\x09\x05\x7d\x1d\x6f\x94\x2b\x09\x98\xa4\x1c\xe3\x86\xf8\xdb\x58\xd5\x92\xb9\xd3\x7d\xd8\x40\x34\x84\x28\xdc\x00\x8e\x1e\x9c\xae\x74\x78\x67\xbe\x52\x60\x78\x47\x61\xce\x52\x2d\xdf\x86\xd3\x34\x0a\x56\x13\xd4\x81\x4e\xfe\x82\x3d\x42\x17\x5b\x61\xbd\x7f\x1f\x5b\x8d\x84\x82\x9a\xa9\x6a\x1b\xd2\xc1\x93\xba\x83\xa9\xa0\xde\xbf\x97\x27\xd5\x66\xca\x40\xed\xca\xb3\x72\x4b\xe8\x47\x9b\x72\x55\xb3\x72\x6b\x93\xb9\xe2\x57\x22\xb2\x76\xf8\xb6\x61\x38\x82\x9b\xdf\x55\x6a\x5a\x98\xe0\x7b\xdb\x88\x0c\x38\x47\xc3\x6d\x77\x1b\xd7\x4a\x6d\x14\x0a\xcd\x2c\xe3\x3e\x8b\xaf\xd7\x6c\xab\x32\x97\x55\x7b\x61\x03\x71\x1c\xc3\x60\xd8\x12\x5f\x6d\x89\x76\x05\xf8\x70\xeb\x6d\x05\xbb\x0d\x7e\xcc\x25\x4c\x63\xab\x25\x80\xeb\xe1\xf7\xe3\x3a\x63\xd9\x9a\x04\xf3\x35\x6e\x13\x8f\xc0\xfd\xc2\x71\x3c\x3d\x7b\x73\xf6\x61\xd6\x78\x9e\x9d\x7e\x7a\x8f\xbd\xfd\x7f\x00\x00\x00\xff\xff\x4b\x3c\xa5\x19\x09\x5a\x00\x00") func templatesServerServerGotmplBytes() ([]byte, error) { return bindataRead( @@ -595,12 +762,12 @@ func templatesServerServerGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/server/server.gotmpl", size: 23074, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xfa, 0x5d, 0xf2, 0xfe, 0xe2, 0xab, 0x28, 0xe5, 0x67, 0x51, 0x2, 0xfa, 0x1c, 0x9f, 0x68, 0x15, 0xb0, 0xa6, 0x9a, 0xe6, 0xda, 0x80, 0xdc, 0xc, 0x65, 0x77, 0xcd, 0x42, 0x91, 0x7, 0x2f, 0x7}} + info := bindataFileInfo{name: "templates/server/server.gotmpl", size: 23049, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x72, 0x85, 0x28, 0x2d, 0x49, 0x40, 0x62, 0x64, 0x9, 0xda, 0x68, 0x50, 0x3a, 0xa3, 0x17, 0x89, 0x3a, 0x99, 0x62, 0x59, 0xb3, 0x94, 0x22, 0x67, 0x40, 0x12, 0xa2, 0x85, 0xf1, 0x47, 0x63, 0x1d}} return a, nil } -var _templatesServerUrlbuilderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5f\x8f\xe3\xb6\x11\x7f\xd7\xa7\x98\x08\x4d\x23\x1f\x6c\xf9\xfa\xda\xc2\x05\x72\x7b\x97\xf6\x8a\xf4\x72\xd9\xdd\x34\x0f\x41\xb0\xa0\xa5\x91\x4d\x9c\x44\xca\x24\xe5\xad\x2b\xe8\xbb\x17\x43\x51\x7f\x2d\x79\xf7\x76\x37\x41\x8b\xe4\xc9\xb2\xc8\xf9\xcb\xdf\xfc\x66\xa8\xb2\x84\x18\x13\x2e\x10\xfc\x43\x81\xea\x94\x33\xc5\xb2\x6d\xc1\xd3\x18\x95\x0f\x55\xe5\x95\x25\xf0\x04\x84\x34\x10\xbe\xd7\x5f\x2b\xc5\x4e\x50\x55\x65\x09\x06\xb3\x3c\x65\x06\xc1\xd7\x3c\xcb\x53\x9c\x90\x0e\xeb\x9d\x98\x6a\x3c\x93\x49\x79\x74\x49\x44\xc4\xb5\xed\x55\xf7\xd8\xfa\x39\x6b\xaf\xf5\x36\x7c\xaf\x3f\x14\x69\xca\xb6\x29\xc2\xaa\xaa\xbc\x23\x53\x50\x96\x70\x64\x4a\xb0\x0c\x21\x7c\xff\x16\xaa\xea\x7b\xd0\x46\x71\xb1\xf3\x78\x42\x8b\xe1\x35\x46\xc8\x8f\xa8\x3e\xd0\x96\xaa\x0a\xcb\x12\x72\xa6\x23\x96\xf2\xff\x34\x22\xf0\xc5\x06\x04\x4f\xa1\xf4\x60\x4a\xdf\x06\x9c\xf9\x6f\xa4\xca\x98\x31\xa8\xea\x68\x06\xff\x83\x57\x8f\x34\xb6\x18\xa4\xae\x3b\x83\xab\x42\x1b\x99\xf5\x55\xbe\x6a\x33\xf6\x48\xd5\x6d\x96\xce\x75\x85\x37\x36\x29\xc1\xa2\x2c\x51\xc4\xb4\xd5\xfe\x78\x36\xb5\x9d\x3b\xe3\xd0\xff\xfc\xb8\xd8\x9f\x14\xfa\x2f\x14\x91\x4b\x1a\xe1\xa3\x46\xc0\x38\xa6\x2f\x36\xe0\xfb\xf6\xac\x0f\x3a\xbc\x41\x43\xde\xe7\x8a\x0b\x93\x80\xff\xe5\xc1\x87\xd0\xf9\xb3\x9c\x10\x5e\x78\xad\x81\x11\x78\x09\xf8\xdc\x60\xf6\x04\xfc\x86\xff\x62\x69\x81\xef\xfe\x9d\x2b\xd4\x9a\x4b\x01\x55\x75\x33\x02\xf1\xf9\x8e\x11\x66\x27\x75\x7c\x06\x70\xcf\xc5\x7b\x87\x35\xb3\xe3\x59\x70\x5b\xd5\x59\x99\xf4\xfb\x33\x50\x77\xd1\xef\x17\x73\xfb\x0c\x53\x93\x6e\x77\xc0\x9a\xde\x71\x0d\x1b\x60\x79\x8e\x22\x9e\x71\xfd\x7a\x39\xa7\x7b\x8c\xbb\x01\xec\xa6\x21\xd7\x80\xeb\x6a\xcf\xd3\x78\xd2\x9b\x9f\x7e\x76\x20\x4b\xa4\x82\xbb\xe5\xc5\xdd\x74\x26\x8a\x89\x1d\xce\xc1\xb1\x0e\x7b\xd5\x12\x5a\xad\x68\xae\xb5\x5c\xa8\x96\x5a\xf2\x09\x2d\xa6\x2f\xe7\x0e\xab\xf2\xfa\x7d\xae\x76\xe9\x23\x53\x28\x4c\x83\xbf\x61\x7d\x53\x94\xfa\x9e\xed\xc2\x7f\x48\x2e\xde\x9c\x6a\x68\x04\x17\xb3\x68\xd3\x36\xa0\x8f\x2b\x99\xa6\x18\x19\x2e\x45\x2d\x4f\x98\x74\x6e\xe0\x61\x62\xd9\xcf\x8a\xd4\x70\x7b\x66\xee\x20\x0e\xfa\x38\xc8\xf7\xc8\x49\x47\x5d\x5f\xc7\xf1\x3c\x75\x1d\xf4\x71\x31\x20\x77\x02\x6e\x8a\x22\x38\x53\xb7\x80\xbf\xc2\x6b\xa7\xf3\xe8\x4a\x6f\xb8\xe3\xa7\xd7\x3f\x7b\x40\xee\xd3\x86\x0e\xe4\x0f\xf3\xa7\x75\x02\xa0\x1a\x93\xe6\x63\x08\xe0\x97\x39\x86\x2e\x09\x93\x55\xd6\xa6\x62\x66\x83\x76\xf9\x99\x5a\x6b\xb3\x34\x2b\xdb\x4f\xdd\x8b\x33\x84\x1e\x65\x7a\x55\x8d\x1f\x07\x9c\x91\x33\xb3\xff\x6d\x51\xc6\x79\xc4\xff\xdb\x8c\xf1\x70\xbd\xe6\x0f\xd5\x6b\x3e\xaa\xd7\x3b\xca\x01\x6c\xdc\x6c\xa1\xc3\x6b\xcc\x53\x16\x61\x60\xdf\x2f\xc1\xef\xf9\x55\x7e\xa9\xab\xae\x94\xfd\x25\xe9\x5a\xc2\xea\x4f\x16\x65\x75\x92\x6b\x9d\x0a\x4d\xa1\x04\x8d\x22\x4b\x40\xa5\xa4\xd2\xe1\x07\xbc\x0f\x48\x57\xc4\x32\xec\x4f\xd9\x5c\x83\xc2\x43\xc1\x15\xc6\x20\x05\x0c\xc6\xbd\x3f\x34\xa6\x7e\xb8\xfe\xd6\xef\x43\xf9\x77\xaa\xf8\x35\xa9\xa2\xaa\xbc\xf5\x1a\xae\x64\x8c\xb0\x43\x81\x8a\x19\x8c\x61\x7b\x82\x9d\x5c\x51\x96\x77\xa8\xfe\x02\x6f\xbf\x83\x0f\xdf\xdd\xc2\xbb\xb7\xef\x6f\x43\xaf\x29\x97\xf0\x4a\xe6\x27\xc5\x77\x7b\x5b\x27\xeb\x35\xd9\x8e\x64\x96\x51\xe1\x0c\xd7\x3a\x4b\x9e\x97\xb3\xe8\x13\x73\x04\xf1\xd1\x3d\xd3\xc2\x7a\x0d\xb7\x7b\xae\x21\xe1\x29\xc2\x3d\xd3\x43\x67\xcc\x1e\xc1\x79\x03\x46\xca\x34\xa4\xfd\xef\x62\x6e\xb8\xd8\x81\x69\xe5\x32\x6b\x31\x57\xf2\x88\x90\x14\xc6\xaa\xda\xa3\x80\x93\x2c\x40\xe1\x4a\x15\xc2\x6a\x6a\x54\x5b\x77\x99\x88\x3d\x8f\x67\xb9\x54\x06\x02\x0f\xc0\x4f\x32\xe3\xd3\x6f\x0d\x6d\x7a\xdc\xc9\x94\x89\x9d\xb3\x4f\x85\xa3\xc1\xa7\x1f\xbb\xcd\x55\x96\x7d\x16\x68\xd6\x85\x4a\x7d\x8f\xfe\xec\xb8\xd9\x17\xdb\x30\x92\xd9\x7a\x27\x57\x32\x47\xc1\x72\xbe\x26\x2d\xfe\x85\x65\xa3\xac\xfd\x85\xcd\xc8\xf0\x7a\xd4\x95\x4b\x1b\x81\x06\x26\x80\x5e\x10\x39\x53\x68\x65\x09\xfb\x22\x63\xa2\x2f\x00\x32\xa7\xcd\x5c\x0a\xcf\x9c\x72\x9c\xd7\xaa\x8d\x2a\x22\xd3\x40\xbc\x26\xf2\xf0\x23\x33\xfb\x8f\x44\xa2\x9a\xce\x09\x60\xea\x32\x5d\x96\xe1\xdf\xe4\xed\x29\x47\xb7\xa3\xbd\xeb\xf7\x15\x7d\x4f\x2c\xfe\xb0\x26\x82\x16\x13\x31\x04\xfd\x0f\x15\x8b\xc1\x45\x6a\x78\x4f\x9e\x31\xed\x01\xdc\x6d\x99\x46\xf2\xbf\xb9\x5a\x81\xd3\x2f\x15\x04\x3b\x03\x41\x8a\x62\x10\xe0\x02\x5e\x2f\x7a\x2b\x3d\x8f\xed\xca\xca\xda\x58\xaf\x81\x1d\x25\x8f\xa1\x10\x9f\xf0\x84\x31\x14\x9a\xed\x90\xcc\xb9\x04\x96\x63\x4f\x6a\x78\xff\xc8\xcd\xfe\x4d\xeb\x10\x1a\x6d\x0f\x8c\x5c\x04\x4b\xd2\xf5\x11\x72\x0d\x85\x4a\xc1\x75\xac\x25\x48\x91\x9e\x3a\x0e\xb5\x68\xe6\xe6\x2b\x0d\x31\x4f\x12\xb4\x4d\x2a\x51\x32\x23\x55\x64\xa3\xd3\xa6\x73\x8c\x78\xc2\x31\x06\x2e\x06\xe5\x43\x0b\xb6\x7c\x7e\x24\x5d\xb4\x72\x24\xbe\x00\x99\x8c\xfc\xe1\x16\x5c\x98\xe5\xe6\xd4\xe4\x2f\x29\x44\x04\x53\x57\x7f\x78\x35\x07\xaa\xc5\x20\xee\x60\x9b\x3b\x5d\x0b\x12\x19\x49\xd4\x28\x6c\x18\x76\xfc\xad\xe0\x06\x4d\x4f\x0d\x11\x9a\x6b\x44\x13\x9b\x29\xe5\x14\x63\x4f\xe6\xb7\x94\xf2\x61\xaa\xda\x8c\xcf\x65\xb6\xab\x93\x0d\x6c\x73\x07\xd7\x37\x94\x0e\x60\x36\x35\xd6\x39\x2a\x4a\x3b\x89\x3d\xcb\x35\xab\x36\x58\x40\xf0\xaa\x50\x69\xf8\xc3\xf5\xb7\x6e\x86\xa8\xbd\xa3\x71\xf4\x4e\xa1\x2e\x52\x03\x6e\xdd\x6b\x5e\xbb\x49\x66\xdc\xc9\xad\xdf\x23\xaa\x19\x70\x56\x7b\xf9\x6f\x86\xcc\xa6\xc5\x3e\x3c\x2d\xba\x8a\xef\x5d\xa9\x26\xbe\x16\xfe\x3f\x7e\x31\x6b\x46\x91\x51\x24\x2f\x35\x39\x9e\x69\xfe\x95\xe7\xc8\xfa\xc8\xda\x3e\x30\x68\x48\x1d\xd8\xdd\xb4\x36\x5b\x0d\x6d\xbb\x08\x5b\x0e\xa9\x2a\x9e\xf4\x34\x6c\xfa\xf9\xea\x15\xd1\x18\xa3\x3d\xf9\xa1\x7f\x35\xbe\x1c\xe2\x43\x27\x7d\x3e\x6e\xd8\x51\x37\x68\x2d\x2c\xeb\xc3\x59\x78\xad\x87\x33\x2d\xcb\xe9\x3f\xd8\xc9\x34\x63\x9f\x30\xa0\xa2\xb2\xf3\xa1\x9d\x08\x2f\x37\xe7\xae\x3e\x26\x3f\xef\xaf\xce\x9b\x7d\x13\xc8\x35\xbb\xb7\x0a\x61\x03\x07\x1d\xbe\x13\x91\x8c\x31\x58\x9c\xf5\x67\x07\x80\x3f\x3a\xb1\x25\x41\xc1\xb1\xcf\x3f\x0b\x6d\x2c\x1d\xc2\x1e\xd3\x1c\x15\x10\xd9\xd0\x08\x03\x46\x42\xce\x04\x8f\x6a\x62\x26\xfe\xec\x91\xb7\x53\x59\xd3\x28\x41\xea\x69\x24\x45\xd6\x83\x02\x06\x14\xd5\xd0\x54\xf3\xd2\x1e\x3b\x4f\xec\x52\xef\xc3\x2c\xd4\xde\x05\xa8\x54\x83\x45\x9e\x40\x41\x50\x19\x6f\xf1\xc9\xf1\x88\x89\xaf\x0c\x6c\x91\x56\x5b\xf4\xba\xc4\x14\x2e\x19\x75\x11\xb7\xb1\xd9\xd6\xd2\xbc\xa2\x29\x1f\x85\xb1\xe3\x5d\xd3\x50\x6c\xe5\xde\x73\xb3\x7f\x01\xbe\x6e\x08\xa4\xb1\x58\x5e\xec\xbb\xa1\xcd\xdc\xd4\x82\xe3\xfd\x45\xcb\x48\xfd\x36\xf3\x4d\x91\xba\x23\xa4\x13\x4f\xe8\x1f\xe5\xc6\x86\xa0\xa3\x3d\x66\xb8\x84\xbd\xd4\x66\xf9\xe2\x9d\x88\x2c\x07\x7d\x13\x6d\xb3\x9c\x6e\x50\x3c\x71\x0e\x0d\x6a\x7f\x8e\xc9\xdc\xd6\x3e\x7b\xd1\xc8\xd1\x0b\x71\x4c\x66\x53\x5c\xc6\x93\xda\xb3\xc7\x58\xb4\x1b\x9f\x65\xcf\x03\x3b\x90\xd4\x98\x9f\xa1\x48\x77\x98\x33\x05\x30\xf2\xad\xaf\x35\xbc\x71\xc9\x73\x59\x6c\x5e\xff\xdd\xc6\x67\xc3\xec\xf0\x55\xbb\xd1\x71\x42\x8d\x1c\x8b\x95\x47\x95\x02\xa3\xfb\x5d\x9e\xa2\xb1\x14\xf1\x1c\xf8\xcf\xa3\xe4\x33\xaa\x62\x3e\x93\x67\xea\x87\x65\xf2\xdf\x00\x00\x00\xff\xff\x03\x19\x46\x51\xd9\x1d\x00\x00") +var _templatesServerUrlbuilderGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x58\x5f\x6f\xe3\xc6\x11\x7f\xe7\xa7\x98\x10\x4d\x43\x1d\x24\xea\xfa\xda\x42\x05\x72\xbe\x4b\x7b\x45\xea\x38\xb6\xd3\x3c\x04\x81\xb1\x22\x87\xd2\xe2\xc8\x5d\x6a\x77\x29\x57\x25\xf8\xdd\x8b\x59\x2e\xff\x8a\xb4\x7d\xb6\x13\xb4\x48\x9e\x44\x71\x67\xe7\xdf\xfe\xe6\x37\xb3\x2c\x4b\x88\x31\xe1\x02\xc1\x3f\x14\xa8\x4e\x39\x53\x2c\xdb\x16\x3c\x8d\x51\xf9\x50\x55\x5e\x59\x02\x4f\x40\x48\x03\xe1\x47\xfd\xb5\x52\xec\x04\x55\x55\x96\x60\x30\xcb\x53\x66\x10\x7c\xcd\xb3\x3c\xc5\x89\xdd\x61\x2d\x89\xa9\xc6\xb3\x3d\x29\x8f\x1e\xda\x22\xe2\xda\xf6\xaa\x7b\x6c\xfd\x9c\xb5\xd7\x7a\x1b\x7e\xd4\x97\x45\x9a\xb2\x6d\x8a\xb0\xaa\x2a\xef\xc8\x14\x94\x25\x1c\x99\x12\x2c\x43\x08\x3f\xbe\x87\xaa\xfa\x1e\xb4\x51\x5c\xec\x3c\x9e\xd0\x62\x78\x8d\x11\xf2\x23\xaa\x4b\x12\xa9\xaa\xb0\x2c\x21\x67\x3a\x62\x29\xff\x4f\xb3\x05\xbe\xd8\x80\xe0\x29\x94\x1e\x4c\xe9\xdb\x80\x33\xff\x8d\x54\x19\x33\x06\x55\x1d\xcd\xe0\x7f\xf0\xe6\x89\xc6\x16\x83\xd4\x75\x67\x70\x51\x68\x23\xb3\xbe\xca\x37\x6d\xc6\x9e\xa8\xba\xcd\xd2\xb9\xae\xf0\xc6\x26\x25\x58\x94\x25\x8a\x98\x44\xed\x8f\x67\x53\xdb\xb9\x33\x0e\xfd\xcf\x4f\x8b\xfd\x59\xa1\xff\x42\x11\xb9\xa4\x11\x3e\x6a\x04\x8c\x63\xfa\x62\x03\xbe\x6f\xcf\xfa\xa0\xc3\x1b\x34\xe4\x7d\xae\xb8\x30\x09\xf8\x5f\x1e\x7c\x08\x9d\x3f\xcb\x89\xcd\x0b\xaf\x35\x30\x02\x2f\x01\x9f\x1b\xcc\x9e\x81\xdf\xf0\x5f\x2c\x2d\xf0\xc3\xbf\x73\x85\x5a\x73\x29\xa0\xaa\x6e\x46\x20\x3e\x97\x18\x61\x76\x52\xc7\x67\x00\xf7\x7c\x7b\xef\xb0\x66\x24\x5e\x04\xb7\x55\x9d\x95\x49\xbf\x3f\x03\x75\x0f\xfa\xfd\x6a\x6e\x9f\x61\x6a\xd2\xed\x0e\x58\xd3\x12\xd7\xb0\x01\x96\xe7\x28\xe2\x19\xd7\xaf\x97\x73\xba\xc7\xb8\x1b\xc0\x6e\x1a\x72\x0d\xb8\x2e\xf6\x3c\x8d\x27\xbd\xf9\xe9\x67\x07\xb2\x44\x2a\xb8\x5b\x3e\x28\x4d\x67\xa2\x98\xd8\xe1\x1c\x1c\xeb\xb0\x57\x2d\xa1\xd5\x8a\xe6\x5a\xcb\x03\xd5\x52\xef\x7c\x46\x8b\xe9\xef\x73\x87\x55\x79\xfd\x3e\x57\xbb\x74\xc5\x14\x0a\xd3\xe0\x6f\x58\xdf\x14\xa5\xbe\x67\xbb\xf0\x1f\x92\x8b\x77\xa7\x1a\x1a\xc1\x83\x59\xb4\x69\x1b\xd0\xc7\x85\x4c\x53\x8c\x0c\x97\xa2\xde\x4f\x98\x74\x6e\xe0\x61\x62\xd9\xcf\x8a\xd4\x70\x7b\x66\xee\x20\x0e\xfa\x38\xc8\xf7\xc8\x49\x47\x5d\x5f\xc7\xf1\x3c\x75\x1d\xf4\x71\x31\x20\x77\x02\x6e\x8a\x22\x38\x53\xb7\x80\xbf\xc2\x5b\xa7\xf3\xe8\x4a\x6f\x28\xf1\xd3\xdb\x9f\x3d\x20\xf7\x49\xa0\x03\xf9\xe3\xfc\x69\x9d\x00\xa8\xc6\xa4\xf9\x14\x02\xf8\x65\x8e\xa1\x4b\xc2\x64\x95\xb5\xa9\x98\x11\xd0\x2e\x3f\x53\x6b\x6d\x96\x66\xf7\xf6\x53\xf7\xea\x0c\xa1\x47\x99\x5e\x55\xe3\xc7\x01\x67\xe4\xcc\xec\x7f\x5b\x94\x71\x1e\xf1\xff\x36\x63\x3c\x5e\xaf\xf9\x63\xf5\x9a\x8f\xea\xf5\x8e\x72\x00\x1b\x37\x5b\xe8\xf0\x1a\xf3\x94\x45\x18\xd8\xf7\x4b\xf0\x7b\x7e\x95\x5f\xea\xaa\x2b\x65\x7f\x49\xba\x96\xb0\xfa\x93\x45\x59\x9d\xe4\x5a\xa7\x42\x53\x28\x41\xa3\xc8\x12\x50\x29\xa9\x74\x78\x89\xf7\x01\xe9\x8a\x58\x86\xfd\x29\x9b\x6b\x50\x78\x28\xb8\xc2\x18\xa4\x80\xc1\xb8\xf7\x87\xc6\xd4\x0f\xd7\xdf\xfa\x7d\x28\xff\x4e\x15\xbf\x26\x55\x54\x95\xb7\x5e\xc3\x85\x8c\x11\x76\x28\x50\x31\x83\x31\x6c\x4f\xb0\x93\x2b\xca\xf2\x0e\xd5\x5f\xe0\xfd\x77\x70\xf9\xdd\x2d\x7c\x78\xff\xf1\x36\xf4\x9a\x72\x09\x2f\x64\x7e\x52\x7c\xb7\xb7\x75\xb2\x5e\x93\xed\x48\x66\x19\x15\xce\x70\xad\xb3\xe4\x79\x39\x8b\x3e\x31\x47\x10\x57\xee\x99\x16\xd6\x6b\xb8\xdd\x73\x0d\x09\x4f\x11\xee\x99\x1e\x3a\x63\xf6\x08\xce\x1b\x30\x52\xa6\x21\xc9\x7f\x88\xb9\xe1\x62\x07\xa6\xdd\x97\x59\x8b\xb9\x92\x47\x84\xa4\x30\x56\xd5\x1e\x05\x9c\x64\x01\x0a\x57\xaa\x10\x56\x53\xa3\xda\xba\xcb\x44\xec\x79\x3c\xcb\xa5\x32\x10\x78\x00\x7e\x92\x19\x9f\x7e\x6b\x68\xdb\x47\x81\x66\x5d\xa8\x94\x9e\x77\x32\x65\x62\xe7\x7c\xa1\x22\xd2\xe0\xd3\x8f\x95\x73\x55\xe6\x7b\xf4\x67\xc7\xcd\xbe\xd8\x86\x91\xcc\xd6\x3b\xb9\x92\x39\x0a\x96\xf3\xb5\x36\xaa\x31\x30\x23\x70\xcf\x76\xbe\xb7\xb0\x19\x19\x5e\x8f\xba\x72\x69\x23\xd0\xc0\x04\xd0\x0b\x22\x67\x0a\xad\x2c\x61\x5f\x64\x4c\xf4\x37\x80\xcc\x49\x98\x4b\xe1\x99\x53\x8e\xf3\x5a\xb5\x51\x45\x64\x1a\x88\xd7\x44\x1e\x5e\x31\xb3\xbf\x22\x12\xd5\x74\x4e\x00\x53\x97\xe9\xb2\x0c\xff\x26\x6f\x4f\x39\x3a\x89\xf6\xae\xdf\x57\xf4\x3d\xb1\xf8\xe3\x9a\x08\x5a\x4c\xc4\x10\xf4\x3f\x54\x2c\x06\x17\xa9\xe1\x3d\x79\xc6\xb4\x07\x70\xb7\x65\x1a\xc9\xff\xe6\x6a\x05\x4e\xbf\x54\x10\xec\x0c\x04\x29\x8a\x41\x80\x0b\x78\xbb\xe8\xad\xf4\x3c\xb6\x2b\x2b\x6b\x63\xbd\x06\x76\x94\x3c\x86\x42\x7c\xc2\x13\xc6\x50\x68\xb6\x43\x32\xe7\x12\x58\x8e\x3d\xa9\xe1\xfd\x23\x37\xfb\x77\xad\x43\x68\xb4\x3d\x30\x72\x11\x2c\x49\xd7\x47\xc8\x35\x14\x2a\x05\xd7\xb1\x96\x20\x45\x7a\xea\x38\xd4\xa2\x99\x9b\xaf\x34\xc4\x3c\x49\xd0\x36\xa9\x44\xc9\x8c\x54\x91\x8d\x4e\x9b\xce\x31\xe2\x09\xc7\x18\xb8\x18\x94\x0f\x2d\xd8\xf2\xf9\x91\x74\xd1\xca\x91\xf8\x02\x64\x32\xf2\x87\x5b\x70\x61\x96\x9b\x53\x93\xbf\xa4\x10\x11\x4c\x5d\xfd\xe1\xcd\x1c\xa8\x16\x83\xb8\x83\x6d\xee\x74\x2d\x68\xcb\x68\x47\x8d\xc2\x86\x61\xc7\xdf\x0a\x6e\xd0\xf4\xd4\x10\xa1\xb9\x46\x34\x21\x4c\x29\xa7\x18\x7b\x7b\x7e\x4b\x29\x1f\xa6\xaa\xcd\xf8\x5c\x66\xbb\x3a\xd9\xc0\x36\x77\x70\x7d\x47\xe9\x00\x66\x53\x63\x9d\xa3\xa2\xb4\x93\xd8\x8b\x5c\xb3\x6a\x83\x05\x04\x6f\x0a\x95\x86\x3f\x5c\x7f\xeb\x66\x88\xda\x3b\x1a\x47\xef\x14\xea\x22\x35\xe0\xd6\xbd\xe6\xb5\x9b\x64\xc6\x9d\xdc\xfa\x3d\xa2\x9a\x01\x67\xb5\x97\xff\x66\xc8\x6c\x5a\xec\xe3\xd3\xa2\xab\xf8\xde\x95\x6a\xe2\x6b\xe1\xff\xe3\x17\xb3\x66\x14\x19\x45\xf2\x5a\x93\xe3\x99\xe6\x5f\x79\x8e\xac\x8f\xac\xed\x03\x83\x86\xd4\x81\xdd\x4d\x6b\xb3\xd5\xd0\xb6\x8b\xb0\xe5\x90\xaa\xe2\x49\x4f\xc3\xa6\x9f\xaf\x5e\x11\x8d\x31\xda\xdb\x3f\xf4\xaf\xc6\x97\x43\x7c\xe8\x76\x9f\x8f\x18\x76\xd4\x0d\x5a\x0b\xcb\xfa\x70\x16\x5e\xeb\xe1\x4c\xcb\x72\xfa\x0f\x76\x32\xcd\xd8\x27\x0c\xa8\xa8\xec\x7c\x68\x27\xc2\x87\x9b\x73\x57\x1f\x93\x9f\xf7\x57\xe7\xcd\xbe\x09\xe4\x9a\xdd\x5b\x85\xb0\x81\x83\x0e\x3f\x88\x48\xc6\x18\x2c\xce\xfa\xb3\x03\xc0\x1f\xdd\xb6\x25\x41\xc1\xb1\xcf\x3f\x0b\x6d\x2c\x1d\xc2\x1e\xd3\x1c\x15\x10\xd9\xd0\x08\x03\x46\x42\xce\x04\x8f\x6a\x62\x26\xfe\xec\x91\xb7\x53\x59\xd3\x28\x41\xea\x79\x24\x45\xd6\x83\x02\x06\x14\xd5\xd0\x54\xf3\xd2\x1e\x3b\x4f\xec\x52\xef\xc3\x2c\xd4\xde\x05\xa8\x54\x83\x45\x9e\x40\x41\x50\x19\x8b\xf8\xe4\x78\xc4\xc4\x57\x06\xb6\x48\xab\x2d\x7a\x5d\x62\x0a\x97\x8c\xba\x88\xdb\xd8\x6c\x6b\x69\x5e\xd1\x94\x8f\xc2\xd8\xf1\xae\x69\x28\xb6\x72\xef\xb9\xd9\xbf\x02\x5f\x37\x04\xd2\x58\x2c\x1f\xec\xbb\xa1\xcd\xdc\xd4\x82\xe3\xfd\x45\xcb\x48\xfd\x36\xf3\x4d\x91\xba\x23\xa4\x13\x4f\xe8\x1f\xe5\xc6\x86\xa0\xa3\x3d\x66\xb8\x84\xbd\xd4\x66\xf9\xea\x9d\x88\x2c\x07\x7d\x13\x6d\xb3\x9c\x6e\x50\x3c\x71\x0e\x0d\x6a\x7f\x8e\xc9\x9c\x68\x9f\xbd\x68\xe4\xe8\x85\x38\x26\xb3\x29\x2e\xe3\x49\xed\xd9\x53\x2c\x5a\xc1\x17\xd9\xf3\xc0\x0e\x24\x35\xe6\x67\x28\xd2\x1d\xe6\x4c\x01\x8c\x7c\xeb\x6b\x0d\x6f\x5c\xf2\x5c\x16\x9b\xd7\x7f\xb7\xf1\xd9\x30\x3b\x7c\xd5\x6e\x74\x9c\x50\x23\xc7\x62\xe5\x49\xa5\xc0\xe8\x7e\x97\xa7\x68\x2c\x45\xbc\x04\xfe\xf3\x28\xf9\x8c\xaa\x98\xcf\xe4\x99\xfa\x61\x99\xfc\x37\x00\x00\xff\xff\x15\x6f\x84\x92\xd9\x1d\x00\x00") func templatesServerUrlbuilderGotmplBytes() ([]byte, error) { return bindataRead( @@ -616,11 +783,11 @@ func templatesServerUrlbuilderGotmpl() (*asset, error) { } info := bindataFileInfo{name: "templates/server/urlbuilder.gotmpl", size: 7641, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x77, 0xac, 0xa8, 0x65, 0xb1, 0xe6, 0x78, 0x19, 0xa2, 0xaf, 0xf8, 0xa0, 0x36, 0x65, 0xef, 0xea, 0x1b, 0xb8, 0xe6, 0xa3, 0xa0, 0xfb, 0x6a, 0x79, 0x3c, 0xd9, 0xef, 0xa0, 0xb, 0x1f, 0x7c, 0xdd}} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x75, 0x67, 0x48, 0xf2, 0xbf, 0xaa, 0x76, 0x7e, 0xfc, 0x16, 0x6f, 0xfd, 0x71, 0x46, 0x6, 0x5d, 0xad, 0x91, 0x4b, 0xe4, 0x81, 0x46, 0x68, 0x3f, 0x1, 0x70, 0xf8, 0x38, 0x5f, 0x27, 0x45, 0x2e}} return a, nil } -var _templatesStructfieldGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x54\x4b\xcf\xd3\x30\x10\xbc\xe7\x57\xac\xac\xef\xd0\x4a\xc4\xbd\xf7\xc8\x4b\x54\x02\x2a\xd1\x0a\x71\xac\x65\x6f\x8a\x91\x5f\xd8\x0e\x22\x58\xfe\xef\xc8\x69\xfa\x08\x4a\x5b\x01\x42\xe5\x16\x79\x77\x32\xb3\xb3\x63\xa7\x04\x02\x1b\x69\x10\x48\x88\xbe\xe5\xb1\x91\xa8\x04\x81\x9c\x2b\x80\x94\x6a\x90\x0d\x18\x1b\xe1\x89\xae\xc2\x73\x16\x70\xdb\x39\x84\xba\xaf\x02\x2c\x16\x90\x12\x44\xd4\x4e\xb1\x88\x40\x84\xe5\x21\x7a\x69\xf6\x04\x28\x0c\x3d\xe5\x1f\xe7\x0e\xe7\xad\x43\x1f\xbb\x8f\x4c\x49\xc1\xa2\xb4\xe6\xa5\xe5\x9b\x23\xe6\x44\x8a\x46\xe4\x5c\xa5\x04\x8e\x05\xce\x94\xfc\x81\x40\xdf\x33\x8d\x39\x8f\x09\x03\xff\x8c\x9a\x15\x4d\x07\x46\xd8\x7d\x09\xd6\x2c\x49\x35\x28\x7f\xa2\x6f\xd8\xaf\xb2\xeb\xbe\x88\x2a\xe0\x79\x48\xba\xf6\x72\x2f\x0d\x53\x85\x64\x34\x3b\x33\x02\x66\xc5\x00\xfa\x01\xbf\xb6\xd2\xa3\x98\x03\x5d\x85\x57\xda\xc5\x6e\xad\x65\x8c\x28\x20\xe7\x67\x56\xcb\xa2\x2a\x76\x29\x15\xf1\xd0\xab\xaf\x87\xcf\x93\x1c\xfa\xe9\xdd\xdb\x81\x01\xbe\x6b\xb5\x24\x29\x5d\x9e\x91\x31\xb8\x00\x5e\xb4\x21\x5a\xbd\x65\x7b\x38\x8c\x3e\x3a\x38\xb5\xef\xaa\x33\xb2\x87\x1e\x57\x1a\x5b\xa7\xf0\xc1\x1b\x1d\x0f\xf5\x87\x0b\xad\xc9\xef\x5a\x52\x46\xe1\x7d\x05\x02\x7a\xd9\x73\xfa\x6b\x3e\x5d\x44\x7f\xd5\x30\x8e\xff\x41\xfe\xe1\xca\x05\x98\xcd\x6f\x3b\x56\x6d\x30\x4e\xe2\x6e\xa2\xe6\xa3\x35\x4d\xe4\xe7\x91\xb6\xc0\xfd\x14\xfd\x7b\x57\x46\x79\x71\x5e\x7e\x9b\x7e\x2e\x39\xd3\x78\x49\xf0\xba\xd4\xef\x68\xbb\x41\x32\x79\x81\xff\x8e\xe3\x67\x00\x00\x00\xff\xff\x62\x6a\xf5\x9f\xf2\x05\x00\x00") +var _templatesStructfieldGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x55\x4d\x8f\xd3\x30\x10\xbd\xe7\x57\x8c\xac\x1c\x76\xa5\x6d\x96\x73\x25\x2e\x7c\x89\x22\xd8\x4a\x64\x85\x38\xae\x65\x4f\xc2\xa0\xd8\x09\xb6\x8b\x28\x56\xfe\x3b\x72\x9c\x4f\x48\xbb\xaa\x10\x5a\x6e\x8d\x3d\x6f\xde\x9b\xe7\x67\xd7\x7b\x90\x58\x90\x46\x60\xd6\x99\x83\x70\x05\x61\x25\x19\xb4\x6d\x02\xe0\xfd\x06\xa8\x00\x5d\x3b\x48\xb3\x9d\x7d\xc1\x2d\xde\x1f\x1b\x84\x4d\xb7\x0b\x70\x7b\x0b\xde\x83\x43\xd5\x54\xdc\x21\x30\x59\x0b\xeb\x0c\xe9\x92\x41\x06\x7d\x4d\xe8\x31\x55\x34\xa6\x6e\xd0\xb8\xe3\x27\x5e\x91\xe4\x8e\x6a\xfd\xaa\x16\xf9\x80\x19\x49\x51\xcb\xb6\x4d\xbc\x87\x86\x5b\xc1\x2b\xfa\x89\x90\xdd\x71\x85\x6d\xbb\x24\xb4\xe2\x0b\x2a\x1e\x34\x45\x46\x78\xe8\x1b\xa4\x81\x08\xb6\xcf\x07\x1d\x61\xcd\x70\x5d\x22\xa4\x74\x03\x69\x1c\xf5\x9e\x97\xa1\x24\xcd\xf2\xe1\xd3\xce\x55\x53\x01\xa5\x83\x94\xe0\x19\x44\x5e\xd4\x72\x7d\xaa\xb1\x1d\x03\x49\xc2\x01\xeb\x7e\xce\x58\x58\xde\x09\x65\xbd\xae\x69\xce\xca\xe2\x25\x2d\xd9\x57\x5b\x6b\x76\xba\xdd\x20\xb0\x97\x9f\x7d\xfe\xf0\x3e\xd8\x16\xf4\xff\x50\xd5\x96\x79\x3f\x5f\x63\xf3\x99\x06\xc8\xcb\x83\x75\xb5\x0a\xa2\xe3\xd0\x8b\x85\x11\xf0\x90\x4c\xd8\x24\x40\x97\x21\xea\xc4\x8e\x6d\xb3\x08\xde\xb2\x89\x26\xcd\xde\xf2\x3f\xf3\xb4\x39\x61\x4b\x16\xe7\xcd\xf6\x86\x4a\xd2\xbc\xea\xf5\xcf\x4f\x8a\x6b\x09\x57\x21\xa8\x43\xed\x47\xfc\x76\x20\x83\xf2\x7a\x5c\xd9\xd9\xd7\xaa\x71\xc7\xbd\x22\xe7\x30\x28\xbf\xa9\x15\x05\xc7\xdd\x71\x1c\xc6\xfb\xce\x84\x11\xf1\x2e\xdf\xdf\xc5\x78\x86\xfa\x18\xee\xdf\x5d\x8b\x1f\x2c\x99\x9d\xc0\xdc\x11\x77\x68\x2a\x7c\xe2\x5b\x35\x49\x0e\xc0\x8b\x2f\x55\x48\xdd\x96\x6d\xe2\x88\x17\x84\x24\x8c\x22\xba\x1d\xb0\x68\xa8\xe3\x34\xe7\x93\xd3\x19\xb5\x2b\xb8\xc0\xff\xe0\x0d\x82\x13\x8f\xd0\xd5\xf5\x79\xc7\x92\x1c\xdd\x2a\xee\x2c\xea\x7a\x71\x4c\x2b\xf9\x79\x4a\x5b\xe0\xf1\x14\xfd\x7b\x57\x16\x79\x69\x0c\x7d\x5f\xff\xcb\x12\x5c\xe1\x9c\xe0\x4d\xd8\x7f\x44\xdb\x19\x92\xd5\x0b\xfc\x77\x1c\xbf\x02\x00\x00\xff\xff\x19\x4c\x16\x4a\x76\x07\x00\x00") func templatesStructfieldGotmplBytes() ([]byte, error) { return bindataRead( @@ -635,12 +802,12 @@ func templatesStructfieldGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/structfield.gotmpl", size: 1522, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc2, 0x6c, 0xf7, 0x9a, 0xf2, 0xd2, 0xba, 0x1b, 0xe, 0x9b, 0xd0, 0x12, 0xcd, 0xdc, 0x1f, 0xba, 0xab, 0x3b, 0xea, 0xf5, 0xa4, 0x6e, 0x1e, 0x9a, 0x8e, 0xb9, 0x9a, 0xc, 0x33, 0xbe, 0x46, 0xc8}} + info := bindataFileInfo{name: "templates/structfield.gotmpl", size: 1910, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x52, 0x92, 0x5, 0x7b, 0xfd, 0x5c, 0x15, 0xc8, 0x62, 0x64, 0x3a, 0xd1, 0xd4, 0x9, 0xca, 0xfd, 0x38, 0x1d, 0xa9, 0x4c, 0xdc, 0x5b, 0x30, 0xb9, 0x5a, 0xc6, 0xd8, 0x22, 0xa8, 0xd6, 0xb8, 0x6f}} return a, nil } -var _templatesSwagger_json_embedGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x92\x41\x6b\xdb\x40\x10\x85\xef\xf3\x2b\x1e\x26\x05\x1b\x6a\xe9\xde\x92\x43\x89\x53\x70\xa1\x71\x68\x7c\x2b\x85\xac\xb5\xa3\xf5\x36\xd2\xae\xba\x1a\xd9\x08\xb1\xff\xbd\xac\xec\x94\x48\x94\x5e\x7a\x14\xf3\xe6\x7b\xef\x8d\x36\xcf\x71\xe7\x35\xc3\xb0\xe3\xa0\x84\x35\x0e\x3d\x8c\x5f\xb7\x67\x65\x0c\x87\x8f\xd8\xec\xf0\xb0\xdb\xe3\x7e\xb3\xdd\x67\x44\x34\x0c\xb0\x25\xb2\x3b\xdf\xf4\xc1\x9a\xa3\x60\x1d\x63\x9e\x63\x18\x50\xf8\xba\x66\x27\xb3\xd9\x30\x80\x9d\x46\x8c\x44\xd4\xa8\xe2\x45\x19\x4e\xe2\xec\xd3\xe3\xf6\xf1\xfa\x99\x66\x79\x8e\xfd\xd1\xb6\x28\x6d\xc5\x38\xab\x76\x9a\x47\x8e\x8c\x6b\x20\x88\xf7\x55\x96\xf4\xf7\xda\x8a\x75\x06\xf2\x67\xaf\x1e\x4d\x9b\xe0\x4f\x8c\xb2\x93\x11\x75\x64\x87\xde\x77\x08\xbc\x0e\x9d\x9b\x90\x5e\x2d\xc6\xe4\xca\x69\x22\x5b\x37\x3e\x08\x96\x04\x2c\xd8\x15\x5e\x5b\x67\xf2\x9f\xad\x77\x0b\x22\xa4\xd8\x41\x39\xc3\xc8\x36\x5c\xaa\xae\x92\xed\x28\x6f\x31\xb6\x6c\x82\x75\x52\x62\xf1\xee\xd7\x02\x59\x8c\x17\xfd\xb5\xfa\x9b\xdd\x9b\x17\xee\xdf\xe3\xe6\xa4\xaa\x8e\xf1\xe1\x16\xd9\x04\x92\xa6\x88\x11\x33\xde\x55\x3e\xa3\xae\x88\xe8\xa4\xc2\x18\x37\xcf\xf1\x74\xa9\xf5\xe5\x69\xf7\x00\xae\x0f\xac\x35\x6b\x9c\x38\xb4\xd6\x3b\xf8\x72\x52\x5d\xfb\xa2\x1b\x7f\x56\xd7\xb2\x86\x92\xd7\x5b\x24\xa9\xd8\x9a\x09\x13\x5c\x3a\x41\xf6\x4d\x9d\xbf\x72\xdb\x2a\xc3\x17\xbf\xcf\x95\x92\xbf\x7a\x96\x95\x12\x61\xf7\x5f\xee\x73\xf8\x3c\xc1\x8a\xa8\xec\x5c\x01\xeb\xac\x2c\x57\x18\x08\xd3\xc4\xb7\xf3\x8d\xe5\xf7\x1f\x87\x5e\x78\xf9\x9c\x1e\xdf\x5b\x65\x8c\xcf\xab\x55\x5a\x9f\x5b\xfe\x1b\x31\x57\x5f\x30\x91\x7e\x07\x00\x00\xff\xff\xa2\xf1\x2d\xd6\x50\x03\x00\x00") +var _templatesSwagger_json_embedGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xa4\x92\xc1\x8a\xdb\x30\x14\x45\xf7\xef\x2b\x2e\xb3\x8a\x17\xb1\x3e\xa0\x74\x51\x26\x53\x48\xa1\x93\xa1\x93\x5d\x29\x8c\x62\x3d\x2b\x6a\x6d\x29\x48\xcf\x09\xc1\xe8\xdf\x8b\xed\x4c\x89\x4d\xe9\xa6\x4b\x71\xef\xbb\xe7\x60\xac\x14\x1e\x83\x61\x58\xf6\x1c\xb5\xb0\xc1\xe1\x0a\x1b\xd6\xe9\xa2\xad\xe5\xf8\x01\x9b\x1d\x9e\x77\x7b\x3c\x6d\xb6\xfb\x92\x88\xfa\x1e\xae\x46\xf9\x18\x4e\xd7\xe8\xec\x51\xb0\xce\x59\x29\xf4\x3d\xaa\xd0\xb6\xec\x65\x91\xf5\x3d\xd8\x1b\xe4\x4c\x44\x27\x5d\xfd\xd2\x96\x87\x72\xf9\xe9\x65\xfb\x72\x7b\x0e\x99\x52\xd8\x1f\x5d\x42\xed\x1a\xc6\x45\xa7\xb9\x8f\x1c\x19\x37\x21\x48\x08\x4d\x39\xf4\x9f\x8c\x13\xe7\x2d\xe4\xcf\x5d\x3b\x42\x4f\x31\x9c\x19\x75\x27\xe3\xd4\x91\x3d\xae\xa1\x43\xe4\x75\xec\xfc\x6c\xe9\x1d\x31\x9a\x6b\x6f\x88\x5c\x7b\x0a\x51\xb0\x22\xe0\x81\x7d\x15\x8c\xf3\x56\xfd\x4c\xc1\x3f\x10\x61\xd0\x9e\x0a\x09\xe5\x86\x6b\xdd\x35\xb2\xbd\xbd\x73\x5e\xe4\x77\x41\x41\x44\x67\x1d\xc7\x55\xa5\xf0\x3a\xd1\xbf\xbc\xee\x9e\xc1\xed\x81\x8d\x61\x83\x33\xc7\xe4\x82\x47\xa8\x67\x86\x26\x54\xdd\xf8\x4d\xbb\xc4\x06\x5a\xde\x95\x87\xaa\xb8\x96\x09\xb3\xb9\xc1\xb4\xfc\xa6\x2f\x5f\x39\x25\x6d\x79\xe2\x7d\x6e\xb4\xfc\x95\x59\x37\x5a\x84\xfd\x7f\xd1\x97\xe3\x4b\x83\x82\xa8\xee\x7c\x05\xe7\x9d\xac\x0a\xf4\x84\xb9\xf1\xc7\xe5\xc5\xea\xfb\x8f\xc3\x55\x78\xf5\x36\xfc\x23\xf7\xcd\x9c\xdf\x8a\x62\x38\x5f\x22\xff\x3d\xb1\x6c\x4f\x33\x99\x7e\x07\x00\x00\xff\xff\x33\xd6\x13\x77\xf7\x02\x00\x00") func templatesSwagger_json_embedGotmplBytes() ([]byte, error) { return bindataRead( @@ -655,32 +822,12 @@ func templatesSwagger_json_embedGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/swagger_json_embed.gotmpl", size: 848, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x42, 0xd7, 0xa7, 0x80, 0xfd, 0xe8, 0xcb, 0x6d, 0xa5, 0x9c, 0x80, 0x99, 0xa8, 0x5b, 0xb0, 0xa4, 0x52, 0x8d, 0x77, 0x82, 0x7a, 0xe2, 0x27, 0xf2, 0xf, 0xd6, 0xc8, 0xf1, 0xfe, 0x7f, 0xd0, 0x98}} + info := bindataFileInfo{name: "templates/swagger_json_embed.gotmpl", size: 759, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb3, 0x32, 0x18, 0x55, 0xc1, 0x8b, 0x29, 0xe6, 0xb, 0xf7, 0x7f, 0x45, 0x23, 0xb3, 0x7d, 0x9c, 0x4c, 0xd, 0xc8, 0x3f, 0x9b, 0x47, 0x3a, 0x30, 0x53, 0x11, 0x71, 0x2e, 0xc4, 0x93, 0x4d, 0x4f}} return a, nil } -var _templatesTupleserializerGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5b\x6f\xdc\x36\x16\x7e\xb6\x7e\xc5\xd9\x81\xeb\x1d\x79\x65\x4d\x93\xec\x93\x17\x2e\x90\x5b\xb7\x29\x50\x3b\x88\xd3\xdd\x07\xc3\x48\xe9\x11\xc7\x66\xa2\x5b\x28\xca\x13\xaf\xa0\xff\xbe\x20\x29\x89\xa4\x44\x4a\x72\xe2\x38\x0d\xea\x97\xc4\x33\xe2\xe5\xdc\xcf\x77\xce\xd1\x54\x15\x44\x78\x43\x52\x0c\x0b\x56\xe6\x31\x3e\xc5\x94\xa0\x98\xfc\x0f\xd3\x05\xd4\xb5\xb7\x5a\xc1\xef\x69\x82\x68\x71\x85\xe2\x5f\x4f\x4f\x8e\xa1\x6c\x3f\x15\xc0\xae\x48\x01\x62\x13\xb0\x9b\x1c\xc3\x86\x66\x09\x20\x10\xcb\x10\xa5\xe8\xc6\xdb\x94\xe9\x1a\x96\x55\x15\xbe\xc1\x6b\x4c\xae\x31\x3d\x46\x09\xae\x6b\xd8\xaf\x2a\xc8\x51\xb1\x16\x17\x41\xc8\xbf\x85\xba\xf6\xcd\xab\x96\x14\x6d\xe1\xec\xfc\xe2\x86\x61\x1f\x30\xa5\x19\x85\xca\x03\x58\xad\xa0\x60\xe8\x12\xc3\xa3\x00\x2e\x31\x03\x76\x85\xe5\x6d\x70\x51\x32\x78\x5f\x16\xda\x57\x1e\xc0\x35\xa2\x72\xfd\x23\x38\x3b\x7f\x5f\x64\x69\xf8\x06\x6d\x7f\xc3\x45\x81\x2e\xb1\x07\x70\x51\x6e\xe0\xf0\x08\xf8\x25\x45\x78\x8c\xb7\xcf\xca\xcd\x06\x53\x7e\xb5\xef\x01\x44\x78\xcd\x9f\x8a\x6d\xc7\x78\xfb\x02\xaf\xb3\x08\xd3\xe5\x45\xb9\x69\x9e\x86\xbf\x17\xf8\xb8\x4c\x2e\x30\x5d\xfa\x9e\x07\x40\x36\x9c\x52\xbe\x87\x3f\x94\xeb\x97\x7b\xf2\x7e\xff\x5f\xe2\xd9\xdf\x8e\x20\x25\xb1\x60\x05\x80\x62\x56\xd2\x94\x7f\xef\x01\xd4\x9e\xce\xde\xe3\x43\xb8\xba\x89\x28\x62\xb8\x80\x82\xd1\x72\xcd\x20\xc1\xfc\xa6\x02\xb6\x84\x5d\x35\x82\xc7\x31\x4e\x70\xca\x0a\x0f\xa0\xaa\xf8\xf5\xe1\xd3\x28\x22\x8c\x64\x29\x8a\x5f\x31\x9c\x14\x5c\x89\x52\x0a\x31\x2a\xd8\xab\x34\xc2\x9f\x80\xa4\x4c\xae\xc7\x69\x24\x9f\x57\x15\x50\x94\x5e\x62\xd8\x25\xd1\xa7\x00\x76\xaf\x51\xcc\x99\x08\x5f\xd3\x2c\xc7\x94\x11\xcc\xcf\x21\x1b\x88\x71\xba\x6c\xb8\x81\x9f\xf8\x2e\xbe\x1e\xea\xba\x61\x87\x5f\x13\x21\x86\xac\xea\xe5\xcb\x19\x4e\xf2\x18\x31\x0c\x8b\x08\x53\xbc\xd9\xe0\xe8\x74\x7d\x85\x13\xf4\xf6\x26\xc7\x0b\x08\x25\x31\x52\x2b\x43\xa5\xc8\x8b\xcf\xd4\xad\xe7\xbe\x58\x3d\xae\xa5\xa1\x9e\xf8\x77\x76\x45\x39\x69\xb7\xe9\xae\xa7\x3d\xae\x3f\xfe\x6f\x55\x81\x61\xee\x50\xd7\x61\xa3\x9a\x57\xc5\xcb\x4f\x79\x46\x19\xe6\x52\xb7\xde\xc3\x75\x12\x17\xcd\x5f\x6b\x94\xe0\xc1\x53\xa1\x31\x38\x82\xee\xc8\xe3\x32\x8e\xd1\x45\xcc\x9f\xef\x75\x0b\x9c\x8c\xb4\x24\x92\x0d\xec\xda\x4d\x05\x34\x43\x39\xd2\x54\xdc\xee\xec\x6c\xa6\x1e\xda\x90\xd3\xfe\x3a\xab\x7e\xa2\x59\x75\x6f\xa5\x74\x1f\xd3\xc2\x3a\x52\xfe\xf1\xa8\x91\xfa\x26\xa3\xf0\x2e\x80\xc6\x40\xa5\xd1\x36\x86\xa1\x2d\x3e\x3c\xef\x94\xc4\x6d\x92\x65\x28\x8a\x4c\xfb\x2b\x74\xbb\x73\x08\xc2\x65\x88\xd7\x28\xf6\x9b\x05\x53\xb6\x67\xb7\x3e\x87\xfd\x49\x09\xa6\x19\x1b\x50\xe4\xd2\xb3\x60\xcc\x6e\x9c\x03\xf3\x6c\x0d\x54\x68\x4a\x84\x90\x01\xdf\x07\x1d\xe3\x62\xd1\x6e\xf8\x1f\x14\x97\xf8\xe5\xa7\x9c\xe2\xa2\x20\x59\x2a\x6d\xf9\xe0\xce\x8d\x19\xe5\x39\x4e\xa3\xe5\xbd\x5d\x19\x48\x8b\xf0\x3b\x79\x1c\x28\x33\x96\x62\xea\x1b\x77\x23\xcb\x94\xc4\x5e\xed\xf1\xac\xf8\x9b\x96\x13\x9d\x19\x91\xa4\x2c\x9b\x97\x11\x1d\x09\x51\xbb\x65\xe9\xc3\x52\x66\xc3\x40\x66\x43\x5f\xa8\x9a\x7b\x3a\x37\xa3\xb3\x73\x92\x32\x4c\x37\x68\x8d\xab\xba\xd2\x43\xba\x1e\xc4\x0f\x3a\x3f\xee\x11\x10\x5a\x09\x08\x3c\xab\xcb\xdb\x8d\x47\xac\x68\xdd\x53\x39\xa7\x5b\xa9\x77\x6c\x46\xd2\xf0\x85\x3c\x3a\x8b\xe2\x9f\x02\xb8\xf6\xdd\x1a\x15\x9e\xdb\x88\x59\x2c\xf7\xbd\xda\x53\xeb\x3c\x0d\x1f\x5d\xa1\xe2\x05\x29\xd6\x94\x24\x24\x45\x0c\x47\xb7\x85\x4a\xd9\xc5\x7b\xbc\x66\x52\x7a\x08\xf2\x2c\xbe\x49\x32\x9a\x5f\x91\xf5\x10\x3e\xc9\x84\x5f\x52\xfc\x55\x20\x54\x9b\xa6\xcd\x88\xc8\xe9\xca\x4a\xf6\x0c\x15\x98\x87\xc5\x67\x59\x74\xd3\xa5\xe4\x7b\x81\x49\x42\xfa\x83\x58\xb6\x33\xc4\x48\xd2\x74\x32\xca\xad\xa7\x25\x97\xff\x7d\x5a\x5e\x88\x3f\x3b\xc8\x73\x81\x0a\x6c\x32\xf9\x6b\x59\xb8\x39\x1c\x65\xf0\xcb\xf9\xe3\xd4\xcc\x00\x81\xba\x99\x1a\x7e\xfc\x34\x8e\x4f\x36\x66\x0e\x17\xb9\x42\x13\x42\xad\x85\xf8\xa1\xf7\x9b\xd1\x7d\x28\xc2\x65\x73\x5c\xeb\x91\xbe\xbe\xc3\xb8\xf2\x0d\xfe\x58\x12\x8a\x23\x25\x6a\xc4\x89\x73\xe2\x3e\xe9\xe9\x4f\x05\x4c\xaf\xeb\xb3\x73\x73\xa1\x4c\x71\xff\xce\x1a\x16\x0c\x87\xd7\x96\x19\x0b\x5a\x37\x26\x1b\xee\x2c\x24\xbd\x14\xce\x6b\x0f\x63\x3e\x97\xf7\x22\x2d\xe3\x78\xd1\x88\xdc\x16\x49\x82\x56\x67\x9d\x0b\x0d\x08\x1f\x25\xfb\x34\x26\x6b\x3c\x9f\xf6\x65\xdf\xd6\x46\xe8\x0f\x80\x96\x29\x23\x09\x0e\xb9\x57\x3f\xcf\xd2\xa2\x4c\xb8\xad\x19\x58\xb6\xb1\xa9\xbd\xbd\xf6\x13\xc9\xc2\x97\x27\x3f\x8f\xa3\xd5\x11\xb5\x1d\x59\xa5\xe4\x29\x18\x21\x05\xc9\xd9\x15\x5f\xbb\x8f\xfa\x4e\x25\x3b\x4b\xae\x03\xe7\xd5\xbc\x45\xc3\x14\xb6\x6f\xcc\xcf\x3d\x28\x3d\x2c\xcd\x2c\x9e\x7c\x5b\x2f\x1e\xf5\xe0\x9c\x66\xf9\x83\x03\x7f\x6f\x0e\xec\xd6\xda\xa4\xff\x6a\xbe\xeb\x3c\xe5\x3b\x95\xe9\xe7\xbb\xee\x1c\xa7\x6c\x1c\x86\xe2\xa2\x8c\x99\x1d\xba\x1b\x99\x7b\xf7\x5d\x00\xbb\x39\xa2\x38\x65\xa2\xab\x62\x49\xe4\xcd\x63\x2e\xd6\x34\x4b\x6f\x92\xac\x2c\xfa\x6e\xab\x96\x0c\xd3\xbd\xb3\x83\xd3\x6e\xb2\xa3\x80\x2e\x22\xe0\x6e\xa1\x86\x70\x33\xfa\x33\xc1\x71\x24\xce\x32\xfa\x07\xe6\x66\xf1\xd8\x80\xf1\x02\x5d\x73\xd9\x84\xba\x05\xea\xc7\xc8\x83\x8f\x04\x40\x33\xd5\x3b\x76\x59\x63\x44\xf3\x8f\x1f\xa6\xa4\xd1\xe3\xcd\x70\xdd\xbb\x92\x6c\x26\xa8\xe5\xf6\xa5\xe8\xb2\xaf\x59\xfa\x8d\xed\xad\xf6\xe1\x38\x93\x9d\x4a\x01\xfe\xb7\xf8\xef\x14\x43\x9c\x65\x1f\x48\x7a\xc9\xab\xa8\x10\xf6\x57\x3d\x2b\xcd\xa8\xf0\x8c\xe5\x3f\x1f\x3f\x0e\x60\x41\xd2\x6b\x14\x93\x08\xaa\xaa\xbb\xa0\xae\xe1\x9a\x17\x5a\x87\xf0\xc3\xc7\x45\x30\x41\xae\xff\x59\xf9\xaa\x13\xc7\x1d\x58\x5d\x63\x38\xa6\x35\xdf\xb5\x66\x1d\x66\xe3\x50\xe1\x11\x0c\x03\xce\xc8\xc1\xb7\xcd\xef\x86\xf4\xa4\x10\x50\x1a\xd9\x3c\x5b\x7d\x65\xfa\xd5\x83\xb3\x3f\x38\xfb\xfd\x3b\xbb\xe2\xb4\xb5\x9c\x2e\x75\x6b\x2e\x33\x78\x76\x47\x38\x77\xb5\x12\x4d\x75\xa5\x48\x45\x8e\x44\x22\x5a\x04\xb1\x41\x1e\x61\x20\x2e\x0c\x32\xd6\x5a\xd7\xce\x75\x02\x24\x75\xae\x03\xaa\x98\x68\x57\xff\x7b\xdf\x32\x2a\x80\xd6\xac\x54\x9f\x83\x63\x82\xae\xd5\x66\x91\x8d\x7a\x08\xea\xe9\x21\x50\x8c\x22\xa0\x68\x1b\x00\xc5\x49\x76\x8d\x21\x45\x09\x8e\x04\xd2\x93\x4b\x02\x11\x7b\x50\x14\x01\xcb\x20\x41\x39\x17\x2c\xda\xf2\x23\x0a\x1e\x4c\x12\xf4\x01\x2f\x13\x94\x9f\x49\x74\x7e\x3e\x68\xef\x1b\xa4\xf4\x26\x6b\x4a\x2a\x7a\x57\xb2\xe5\xdd\x37\x5a\x24\x62\x6b\x07\x2f\x97\x82\xe4\xbd\x96\x92\x79\x43\xb3\xd1\x6e\x67\x84\x63\xcc\xf0\xb2\x3d\x31\x10\x80\x8d\x92\x94\x6d\x60\xf1\xc3\xc7\x05\xe8\x3e\xd2\x43\x79\x96\xa1\x46\x5f\x01\xcd\xc8\xa2\xa3\x17\x7e\x82\x1f\x55\x8d\x62\x69\x7c\x82\x55\xb4\x93\x83\x09\xe3\x5e\xbf\x1b\x85\x7c\x30\x7a\xad\x9d\xfe\x3e\x6f\xf8\x61\xcb\x1b\x4e\x3d\x5d\x73\x41\x0e\xc7\x15\xea\x8c\x3b\x9f\x59\x58\x84\x79\xf6\xe1\x1c\x8e\x24\x87\x46\xeb\xde\x9e\x6e\xed\xda\x68\x85\x36\x0e\xf8\x6f\x31\x00\x98\xe8\xf3\xaa\x91\xc0\x74\x97\xf7\xf3\xc6\x02\xa2\xe7\x4e\xf5\xc0\xc2\xab\x8e\x5e\xa4\xf1\x76\x44\x87\xf4\x51\x00\x17\x8f\x03\xb8\x78\xd2\xf4\x89\xe5\xd7\x5c\x37\xe2\x34\x6f\x87\xaf\xe0\x1f\x8f\xcc\x56\xf9\x54\xeb\xf8\x84\x1e\x67\x69\x0b\x13\x64\x97\xd5\xf7\x76\xcc\xba\xac\xf2\x76\x76\x94\x5c\xc5\x35\xde\x4e\xed\xed\x70\x82\xe6\x5c\xa9\xdf\xf7\x34\x8d\x3e\xfb\xc2\x59\x91\xb6\x71\x74\xbb\x19\xe9\x6e\xbf\x5a\x09\x07\x97\x2a\x6e\x6c\x81\xbb\xaa\x78\x2b\x41\xc5\x6a\x15\x88\xe5\xc8\xfb\x89\x8b\x67\xdb\x75\x96\xb6\x41\xaf\x4b\xd0\xf1\x07\xd6\x89\x96\xd7\xca\xa1\xd8\xa2\xcb\xf0\x79\x96\xae\x11\x13\xe6\xa4\x0c\xc2\x0f\x1a\x6b\xb7\x4f\x43\x04\xdc\xea\x8d\x40\xe4\x28\x6d\xda\xf4\xe6\x8e\x4a\xee\x6f\x24\xc2\xe9\xb6\xb5\xd9\x25\xf6\x70\xce\xd1\x0f\x5a\x08\x6f\x14\xee\x26\x82\xa9\xaa\xd5\xbe\x62\x30\xe6\x90\x4f\xe9\x1e\x48\xca\x81\x2b\x64\xfc\x98\x76\xbf\xe4\xbe\x80\xfd\x95\x16\xbd\x0e\x04\xbe\x12\x0d\x04\x17\x3d\xc6\x0b\x18\x72\x75\x5d\xb7\x2f\x8f\x54\xda\x49\x13\xa3\x81\x83\xd1\xd1\x42\x6f\xcd\xae\xa3\x46\x69\xa2\xa9\xf2\xd8\x9c\x92\x6b\x49\xcb\x86\x03\x32\xed\x75\x0f\x75\x66\xbf\xbe\x6c\x0e\x19\x40\xaa\x91\x74\xc6\x59\xfe\x83\xfb\xd0\xe1\x82\x3b\xcf\x09\x25\x97\x24\x45\xb1\x82\x6b\x8d\xc6\x96\x46\x1b\xd4\x17\x1d\xd3\x24\x67\x37\x27\x09\x61\x92\x95\x20\x4b\x08\xbf\x84\xdd\x74\x1e\xb0\xf8\xa3\x4f\xf0\x10\x45\x0f\x58\x50\x5d\xd7\x3b\x94\xd5\x7c\x51\xf5\xa0\xd9\xbd\x09\x67\xba\xc2\x38\x18\x7e\xc1\xa3\xf0\x2f\x68\x24\x0c\xdb\x18\xb5\xa2\x0f\x83\xa7\x5e\x4b\x5c\x2f\x0a\x24\xea\xff\x12\x34\xd6\x4a\xf4\xa0\x13\x80\x93\x35\xe7\x8b\x26\x6e\x96\x64\x43\xd5\xe0\x26\xa3\x96\x26\xbf\x31\xff\xec\x71\x77\x36\x8b\xa9\x96\xa4\x09\x7e\x6a\x03\xbd\x8b\xfc\xf1\x06\xa3\xa8\x0d\xae\x01\xec\xf5\x22\xd0\xac\x99\x27\x8c\x0e\x2d\x07\x80\xc6\xf5\xc6\x42\x53\x8e\x6a\xb7\xdb\xd7\x39\x4a\xd3\x26\x02\x35\x58\xc0\xec\xc4\xf2\xd8\x5a\x55\xfc\x3f\x5e\x49\x19\xd3\x11\xa3\xe4\x55\xb2\x19\x14\x92\x75\xad\xb7\xd1\xd5\xae\x41\xdb\x9b\xa2\xad\x1f\xc0\x9e\xe5\x3a\x5f\xb9\xbe\x55\xf6\xae\x2d\x82\xcb\x99\xc3\x67\x3b\x4e\xb6\x9c\xec\x59\x8c\xdd\x4c\x1f\xba\x0c\x2d\x89\x50\x80\x88\xa6\x32\xed\x65\xbd\xbf\x90\xb8\x2d\xaf\x0b\xf2\x58\x94\xbf\x46\xeb\x0f\x3c\x62\xb7\x94\x2f\x16\x53\x9a\x70\xb5\x56\x64\xf4\x19\xc6\xd2\xd5\x0a\xd2\x6c\x2b\xe0\x29\xc5\x97\x65\xdc\x8c\x01\x35\x5c\x3a\x0b\x78\xb4\xe3\xc3\xc2\x89\x3b\x26\x50\xc7\x34\xe6\x98\x85\x38\x6e\x91\x43\xed\x68\xe3\x4f\x8a\x35\xac\xf9\x64\xd8\x8b\xff\x66\x12\xfa\x16\x10\xc3\x2e\x13\x7b\x9f\xb1\x4d\x31\xe3\x69\xab\x6f\xc1\x8e\x1e\x85\xe3\xad\xdf\x09\xfb\x9e\x9f\xbf\xfa\x64\x8c\x24\xb0\xbe\x93\xf7\xdf\xc5\x1d\x45\x52\xab\x15\xbc\x3d\x79\x71\x72\x08\xb6\x25\xc3\x03\x47\x00\x8c\xe5\xa4\xf6\x8d\x5e\xe3\x90\xdb\xf7\x50\xbe\x7e\xaf\xc4\x03\x78\xc7\x05\xad\x7a\x9e\x67\xe7\xed\x9a\x1f\x45\xaf\x30\xc6\xa9\x2a\x0a\xfd\xb1\x37\xb2\xe6\x54\x83\xf3\xeb\xb9\xfb\xab\xe5\xbe\x69\x79\xf2\xed\xa3\xab\xbd\x58\x71\x04\xbf\xbf\x6a\x25\xd7\x97\x8d\x7b\xd0\x39\x2f\xfa\xd8\xd8\xfc\x13\xd6\x71\x56\xc6\xbe\xdb\x2a\x4e\x2f\xe2\x26\x6b\xae\x59\x75\x54\xf3\x13\x91\x59\xb9\x6d\x40\x86\x07\xc2\xa4\x5f\x98\x17\x89\xd8\xac\x07\xbd\x36\x5d\xff\x97\x12\x86\x45\x1c\xef\x17\x98\x5d\x19\xa0\x6f\xb3\xe1\xee\xb6\x2b\xaa\xad\x6b\x70\x78\x93\x04\xba\x37\xc7\xe5\xe7\xc0\x46\xa0\x3f\x55\x2c\xda\x0a\x9d\xee\xb1\x98\x01\xac\xb3\x24\xcf\x0a\xa1\xb1\xb6\xde\xb1\x80\xfa\xc0\x40\x2b\x8a\x7d\x77\x53\xd8\xd6\x12\x1e\x36\x84\xc7\xf8\xb5\x15\x34\xf6\x32\xcf\x51\xe5\xdd\x9a\x15\x9b\xf1\xb8\xcb\x9f\xaf\xce\xe5\x43\x09\xf5\x50\x42\x3d\x94\x50\xce\x12\x6a\xd4\x0a\xe7\x95\x2e\xb7\xce\x19\x26\x1d\x6d\x44\x7e\xdd\xbb\x6c\x46\xde\x18\x54\x78\x5a\x55\xe8\x4c\x1d\x93\xe9\xa3\x15\xcd\x54\x0a\xe9\x13\xec\xbb\x8a\xac\x51\xe0\x34\xbd\x43\x03\x25\xb6\xf2\xab\x3f\xf1\x93\x64\x86\x61\x38\x31\xf0\x93\x6e\x6b\x9d\xf8\xa9\xb2\xa7\x05\x2f\xd2\x34\x7f\x41\x5d\x20\xf2\x35\x65\x2a\xf7\x19\xfb\x49\x55\xa8\xa2\xb0\x4a\xb3\x6f\xc5\x8f\xeb\x6c\x47\x0d\x7e\xbd\x6e\xd9\xaf\xd1\xa3\xfd\x14\xee\x4b\xe8\x19\x03\xb8\xc6\xc9\xc8\xb2\xd0\x7a\xba\x42\x15\xc2\xc5\x2f\x19\x2c\x55\x05\xea\xc3\x8f\x7e\x87\x1a\x5b\x59\xfb\x76\x5e\x06\x03\xda\x21\x03\x8d\xd2\x9e\x67\x49\x1e\xe3\x4f\x27\xb2\xe6\x0e\x4f\x19\x25\x6b\x36\x9b\xb3\x34\xb3\x2d\x75\x5c\x9c\x46\x82\x58\x65\x61\xff\x0f\x00\x00\xff\xff\xf7\x50\xc1\x64\x80\x40\x00\x00") - -func templatesTupleserializerGotmplBytes() ([]byte, error) { - return bindataRead( - _templatesTupleserializerGotmpl, - "templates/tupleserializer.gotmpl", - ) -} - -func templatesTupleserializerGotmpl() (*asset, error) { - bytes, err := templatesTupleserializerGotmplBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "templates/tupleserializer.gotmpl", size: 16512, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x2b, 0xb6, 0xfd, 0xcf, 0x74, 0x6, 0x9a, 0x2a, 0x84, 0xef, 0x17, 0x4b, 0x97, 0x48, 0x4c, 0x3a, 0x69, 0x42, 0x61, 0x93, 0xb2, 0x26, 0x23, 0xf, 0x53, 0x13, 0x6f, 0x39, 0xd9, 0xd9, 0x9b, 0x42}} - return a, nil -} - -var _templatesValidationCustomformatGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x92\xcf\x4b\xfc\x30\x10\xc5\xef\xfd\x2b\xde\x37\xf0\x85\x16\x76\xb3\x17\xf1\xa0\xec\xc1\x83\x82\x20\x28\xac\x78\x9f\xb5\xd3\x6d\x20\x9b\xd6\x24\x75\x2d\x43\xfe\x77\xe9\x0f\x64\x0b\x7b\xf0\xe8\x6d\x48\xde\xbc\x79\x9f\x64\x44\x60\x2a\x38\x86\xde\x9d\xe8\x70\x60\xff\xd0\xf8\x23\x45\xa8\x7d\x1f\x59\x61\x9d\x52\x06\x88\xac\x07\x95\x7e\x0c\x77\xd6\x50\xe0\x12\xe3\xb1\xa9\xc0\xde\xe3\x66\x8b\x4f\xb2\xa6\xa4\xc8\x7a\xea\x7e\xae\xf2\xc9\x57\xbf\x50\xac\x91\x92\xc8\x79\xc9\x36\x30\x52\x52\x6a\xa8\xdd\x60\xb6\x82\x08\x5a\x6f\x5c\xac\xa0\xfe\x7f\x28\xe8\xa7\xe6\x9d\xa2\x69\xdc\xc5\xcb\x65\xd4\x59\xa1\xe7\x6c\xaf\x7d\x3b\xb8\xe7\x22\xfa\x8d\x6c\xc7\xf7\x5f\xad\xe7\x10\x26\xaf\x42\xef\xa2\x37\xee\x90\x17\x2b\x54\x63\x7b\x28\x6e\x47\x8a\x7f\x5b\x38\x63\x21\x33\xee\x9c\xf1\xaf\x51\x5e\x40\xfa\x35\x91\x9b\xbf\xcd\x73\xec\xbc\x1b\x24\x19\x90\xb2\x25\xed\x66\x83\xe5\x06\xe4\x7b\x0a\x7c\x7d\x85\x30\x4e\x29\x60\x02\xc8\x7a\xa6\xb2\xff\x79\x8f\x12\xa7\x9a\x1d\x3a\x77\x24\x1f\x6a\xb2\x96\xcb\xec\x6c\xe2\x77\x00\x00\x00\xff\xff\x55\xbf\xa4\xbb\x63\x02\x00\x00") +var _templatesValidationCustomformatGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x91\xcd\x4a\x04\x31\x10\x84\xef\x79\x8a\x32\x20\xcc\xc0\x9a\x07\x50\xf6\xe0\x41\x41\x10\x14\x56\xbc\x37\x6e\x67\x0c\xc4\xcc\xd8\xc9\xfa\x43\x93\x77\x97\xcc\x8e\xe0\x61\x0e\x1e\xf7\x56\x24\x55\x95\xfa\x88\xea\x05\x82\x87\xbb\xcb\xd7\x31\x50\xe6\x3d\x6a\x35\x68\x47\x2c\x82\xcb\x2d\x3e\x28\x86\x3d\x15\x76\xb7\xa3\xbc\x51\x79\xf0\x9d\xea\x9c\x78\xa4\xf2\x8a\x5a\x55\xff\x4a\x8e\x99\x51\xab\xb5\x4d\xa7\x56\xb6\x81\x2a\x26\x09\xa9\x78\xd8\xf3\x77\x0b\x77\x3f\xbe\x50\x09\x63\x5a\xbd\xdc\x7d\xd2\x30\xb0\x1c\x1f\xfb\x75\xb8\x65\xdb\xd3\xf7\xd4\xda\x3b\x55\xf7\x4c\xf1\xc0\x37\x5f\x93\x70\xce\xc7\xae\xde\xed\x8a\x84\x34\x74\xfd\x06\x7e\x8e\xe7\xfe\x6a\xa6\x38\xdb\x22\x85\x08\x35\x0d\x76\x59\x78\x6a\x8c\x2b\x40\xff\xe4\x49\xcb\x97\x09\x97\x83\xa4\x66\x30\x40\x35\x3f\x01\x00\x00\xff\xff\x01\xdb\x67\xc9\xd9\x01\x00\x00") func templatesValidationCustomformatGotmplBytes() ([]byte, error) { return bindataRead( @@ -695,12 +842,12 @@ func templatesValidationCustomformatGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/validation/customformat.gotmpl", size: 611, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x92, 0xe7, 0x93, 0x76, 0x84, 0x44, 0xed, 0x9b, 0x9, 0xdf, 0xa, 0xaa, 0x1d, 0x36, 0xf, 0xff, 0x66, 0x5f, 0xbf, 0xa5, 0xa5, 0x42, 0x83, 0x88, 0xe9, 0xf0, 0xeb, 0x6, 0xb2, 0xe6, 0xe1, 0xd3}} + info := bindataFileInfo{name: "templates/validation/customformat.gotmpl", size: 473, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x21, 0x62, 0x2d, 0xb8, 0x17, 0x7, 0xcb, 0xa3, 0xb, 0xe0, 0xa4, 0xc4, 0xc7, 0x3c, 0xc4, 0x11, 0x74, 0x28, 0x61, 0x83, 0x41, 0x6f, 0xe1, 0x5, 0x73, 0xcb, 0x2f, 0x47, 0xe0, 0xa3, 0x22, 0xeb}} return a, nil } -var _templatesValidationPrimitiveGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x95\xc1\x8e\xd3\x40\x0c\x86\xef\x79\x0a\x13\x84\x94\x20\x94\x13\xe2\x00\xda\x03\x82\x22\x2a\x2d\xb0\xd2\x22\xce\x3b\xb4\x4e\xd6\xd2\xc4\xe9\x7a\x9c\xd2\xd5\x68\xde\x1d\x4d\x9a\x34\x15\x6c\x23\x22\x7a\xda\xbd\x75\xe6\xf7\xd8\xfe\xbf\xda\x8a\xf7\x54\x42\xf1\x85\xf8\x12\xb9\xd2\xdb\x10\x12\x2a\x01\x45\xe0\xed\x05\x6c\x8d\xa5\xb5\x51\x1c\xe5\xcc\x7b\x88\xf1\x57\x46\x6f\x21\x04\xef\x8f\x7e\xa2\x75\x18\x42\x9a\x7a\x8f\xbc\x0e\xe1\x15\x78\x0f\x1b\x21\xd6\x12\xd2\x17\x77\x29\x14\x97\xcd\xca\x28\x35\x0c\xbd\x18\x13\x2d\xdd\xd7\xd6\x5a\xf3\xd3\x22\x84\x90\xbd\xf4\x1e\x90\xd7\x5d\xba\xe2\x87\xb1\x2d\x2e\x76\x1b\x41\xe7\xa8\xe1\xae\xda\x5f\x4f\xf2\xa3\x17\xbd\xfa\xa1\x75\xda\xd4\x9f\x1a\xa9\x8d\x2a\x0a\x84\x50\x5c\xab\x10\x57\xd9\x18\x1c\xeb\x1f\x9b\xce\xdf\x75\x9e\x9f\x5d\x00\x93\x05\x9f\x00\x08\x6a\x2b\x1c\x6f\x93\x90\xf4\x96\x92\x1e\x96\xd9\x4d\xc2\x1a\xe4\xc7\x05\x6b\x34\x3d\x0b\xd6\x55\x97\x97\x1f\x46\xd5\x8b\x8f\x07\xd4\x8d\xf7\xa3\xe3\x9b\x79\x53\x45\x4c\x75\x5b\x9f\x5c\xc0\x28\xee\xbb\xc1\x3b\x28\xae\x7f\x99\xaa\x42\xf9\x7e\xbf\x41\x48\x89\x15\x2b\x94\x14\x42\x58\xb2\x1e\xda\x39\x37\xd6\xa9\xba\xb4\xaf\x6b\x5d\xc4\x57\xda\xc6\x8c\x6d\xbc\x79\x9d\x3d\xc4\x78\xfa\x5f\xc9\x87\x0d\xdd\x33\xe9\x4e\x8b\xdd\xca\xb6\x8e\xb6\x78\xb8\x9e\xbb\xb6\x13\x80\xf7\xe2\x93\x03\x3c\x30\xf9\x03\xf0\x70\x3d\x0f\x70\x6b\x95\x36\x16\xbf\x95\x27\x18\x1f\xf4\xf3\x81\xeb\x48\xfc\x0f\x80\xa3\x9e\x67\x99\x5d\xf0\xa9\x51\x8a\xca\xb9\x27\xc3\xf0\x1a\x32\x6e\x34\x3a\x7c\x2f\x62\xee\xf3\xfe\xf8\xd9\xb8\x8f\xe4\x56\x42\x35\xb1\xd1\x46\xf2\x43\xd8\x92\x15\xa5\x34\x2b\xcc\x67\x61\x99\xfd\x65\x18\x7b\x7f\xbe\x4d\x07\x2e\xff\x88\xf2\x77\x00\x00\x00\xff\xff\x27\x99\x58\x83\x7d\x08\x00\x00") +var _templatesValidationPrimitiveGotmpl = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\x95\xcf\x6e\xd3\x40\x10\xc6\xef\x79\x8a\xc1\x08\xc9\x46\xc8\x27\xc4\x01\xd4\x03\x2a\x41\x44\x2a\x50\xa9\x88\x73\x97\x64\xec\x8e\xb4\x1e\xa7\xb3\xe3\x90\x6a\xb5\xef\x8e\xd6\xf1\x3f\x41\x13\x61\x91\x53\xb9\x79\xf7\xdb\x9d\x99\xef\xe7\x19\xdb\x7b\x2a\x20\xff\x4c\x7c\x85\x5c\xea\x5d\x08\x0b\x2a\x00\x45\xe0\xed\x05\xec\x8c\xa5\x8d\x51\x1c\xe5\xd4\x7b\x88\xe7\xaf\x8d\xde\x41\x08\xde\x4f\x1e\xd1\x3a\x0c\x21\x49\xbc\x47\xde\x84\xf0\x0a\xbc\x87\xad\x10\x6b\x01\xc9\x8b\xfb\x04\xf2\xab\x7a\x6d\x94\x6a\x86\x4e\x8c\x81\x56\xee\x4b\x63\xad\xf9\x61\x11\x42\x48\x5f\x7a\x0f\xc8\x9b\x36\x5c\xfe\xdd\xd8\x06\x97\xfb\xad\xa0\x73\x54\x73\x9b\xed\x8f\x2b\xd9\xe4\x46\xa7\x5e\x36\x4e\xeb\xea\x63\x2d\x95\x51\x45\x81\x10\xf2\x1b\x15\xe2\x32\x1d\x0f\xc7\xfc\x53\xd3\xd9\xbb\xd6\xf3\xb3\x0b\x60\xb2\xe0\x17\x00\x82\xda\x08\xc7\xdd\x45\x58\x74\x96\x16\x1d\x2c\xb3\x3f\x09\xab\x97\x9f\x16\xac\xd1\xf4\x2c\x58\xd7\x6d\x5c\x7e\x1c\x55\x27\x3e\x1d\x50\xb7\xde\x8f\x8e\x6f\xe7\x75\x15\x31\x55\x4d\x75\x74\x00\xa3\x78\xa8\x06\xef\x21\xbf\xf9\x69\xca\x12\xe5\xdb\xc3\x16\x21\x21\x56\x2c\x51\x12\x08\x61\xc5\x3a\x94\x73\x6e\xac\xa7\xf2\xd2\x21\xaf\x75\x11\x5f\x61\x6b\x33\x96\xf1\xe6\x75\xfa\x18\xe3\xd3\x6f\x25\xeb\x27\xf4\xc0\xa4\x5d\x2d\xf7\x6b\xdb\x38\xda\xe1\xb0\x3d\x77\x6c\x4f\x00\x3e\x88\xff\x1d\xe0\x9e\xc9\x6f\x80\xfb\xed\x79\x80\x1b\xab\xb4\xb5\xf8\xb5\x38\xc2\x78\xd0\xcf\x07\xae\x25\xf1\x2f\x00\x26\x35\xcf\x32\xbb\xe4\x63\xad\x14\x95\x4b\xe3\xf0\xdc\xdd\x61\x78\x03\x29\xd7\x1a\x5d\xbe\x17\x31\x0f\x59\xb7\xfc\x64\xdc\x07\x72\x6b\xa1\x8a\xd8\x68\x2d\xd9\x70\x6c\xc5\x8a\x52\x98\x35\x66\xb3\xd0\xcc\xfe\x3b\x8c\xb5\x3f\xdf\x25\x3d\x9b\xc9\xd7\xb8\x45\xb2\x8a\x8d\x6b\xac\xc3\xb1\x8f\x55\x1a\x1c\x02\xfd\x25\xfe\x5f\x01\x00\x00\xff\xff\xaa\xd3\x6b\x2e\xb1\x08\x00\x00") func templatesValidationPrimitiveGotmplBytes() ([]byte, error) { return bindataRead( @@ -715,8 +862,8 @@ func templatesValidationPrimitiveGotmpl() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/validation/primitive.gotmpl", size: 2173, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x25, 0xbe, 0x74, 0x9c, 0x71, 0xed, 0xcf, 0xcd, 0xb, 0x28, 0x65, 0x23, 0xe9, 0x2e, 0xb1, 0x83, 0x23, 0x14, 0x82, 0xb0, 0x5d, 0x77, 0xa1, 0x0, 0x72, 0x9f, 0xd6, 0xa2, 0x24, 0xd, 0x91, 0xb5}} + info := bindataFileInfo{name: "templates/validation/primitive.gotmpl", size: 2225, mode: os.FileMode(0644), modTime: time.Unix(1482416923, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa5, 0xc1, 0x1f, 0x2b, 0x1c, 0x3c, 0xf9, 0xf1, 0x51, 0xcb, 0xc2, 0xbe, 0xbc, 0x41, 0xca, 0x4d, 0x31, 0x2f, 0x60, 0xf, 0x71, 0x54, 0xaa, 0x40, 0x1b, 0x71, 0xc4, 0xa8, 0xaa, 0xdb, 0xfc, 0x22}} return a, nil } @@ -831,70 +978,49 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ - "templates/additionalpropertiesserializer.gotmpl": templatesAdditionalpropertiesserializerGotmpl, - - "templates/client/client.gotmpl": templatesClientClientGotmpl, - - "templates/client/facade.gotmpl": templatesClientFacadeGotmpl, - - "templates/client/parameter.gotmpl": templatesClientParameterGotmpl, - - "templates/client/response.gotmpl": templatesClientResponseGotmpl, - - "templates/contrib/stratoscale/client/client.gotmpl": templatesContribStratoscaleClientClientGotmpl, - - "templates/contrib/stratoscale/client/facade.gotmpl": templatesContribStratoscaleClientFacadeGotmpl, - - "templates/contrib/stratoscale/server/configureapi.gotmpl": templatesContribStratoscaleServerConfigureapiGotmpl, - - "templates/contrib/stratoscale/server/server.gotmpl": templatesContribStratoscaleServerServerGotmpl, - - "templates/docstring.gotmpl": templatesDocstringGotmpl, - - "templates/header.gotmpl": templatesHeaderGotmpl, - - "templates/model.gotmpl": templatesModelGotmpl, - - "templates/modelvalidator.gotmpl": templatesModelvalidatorGotmpl, - - "templates/schema.gotmpl": templatesSchemaGotmpl, - - "templates/schemabody.gotmpl": templatesSchemabodyGotmpl, - - "templates/schematype.gotmpl": templatesSchematypeGotmpl, - - "templates/schemavalidator.gotmpl": templatesSchemavalidatorGotmpl, - - "templates/server/builder.gotmpl": templatesServerBuilderGotmpl, - - "templates/server/configureapi.gotmpl": templatesServerConfigureapiGotmpl, - - "templates/server/doc.gotmpl": templatesServerDocGotmpl, - - "templates/server/main.gotmpl": templatesServerMainGotmpl, - - "templates/server/operation.gotmpl": templatesServerOperationGotmpl, - - "templates/server/parameter.gotmpl": templatesServerParameterGotmpl, - - "templates/server/responses.gotmpl": templatesServerResponsesGotmpl, - - "templates/server/server.gotmpl": templatesServerServerGotmpl, - - "templates/server/urlbuilder.gotmpl": templatesServerUrlbuilderGotmpl, - - "templates/structfield.gotmpl": templatesStructfieldGotmpl, - - "templates/swagger_json_embed.gotmpl": templatesSwagger_json_embedGotmpl, - - "templates/tupleserializer.gotmpl": templatesTupleserializerGotmpl, - - "templates/validation/customformat.gotmpl": templatesValidationCustomformatGotmpl, - - "templates/validation/primitive.gotmpl": templatesValidationPrimitiveGotmpl, - - "templates/validation/structfield.gotmpl": templatesValidationStructfieldGotmpl, -} + "templates/client/client.gotmpl": templatesClientClientGotmpl, + "templates/client/facade.gotmpl": templatesClientFacadeGotmpl, + "templates/client/parameter.gotmpl": templatesClientParameterGotmpl, + "templates/client/response.gotmpl": templatesClientResponseGotmpl, + "templates/contrib/stratoscale/client/client.gotmpl": templatesContribStratoscaleClientClientGotmpl, + "templates/contrib/stratoscale/client/facade.gotmpl": templatesContribStratoscaleClientFacadeGotmpl, + "templates/contrib/stratoscale/server/configureapi.gotmpl": templatesContribStratoscaleServerConfigureapiGotmpl, + "templates/contrib/stratoscale/server/server.gotmpl": templatesContribStratoscaleServerServerGotmpl, + "templates/docstring.gotmpl": templatesDocstringGotmpl, + "templates/header.gotmpl": templatesHeaderGotmpl, + "templates/model.gotmpl": templatesModelGotmpl, + "templates/schema.gotmpl": templatesSchemaGotmpl, + "templates/schemabody.gotmpl": templatesSchemabodyGotmpl, + "templates/schemaembedded.gotmpl": templatesSchemaembeddedGotmpl, + "templates/schemapolymorphic.gotmpl": templatesSchemapolymorphicGotmpl, + "templates/schematype.gotmpl": templatesSchematypeGotmpl, + "templates/schemavalidator.gotmpl": templatesSchemavalidatorGotmpl, + "templates/serializers/additionalpropertiesserializer.gotmpl": templatesSerializersAdditionalpropertiesserializerGotmpl, + "templates/serializers/aliasedserializer.gotmpl": templatesSerializersAliasedserializerGotmpl, + "templates/serializers/allofserializer.gotmpl": templatesSerializersAllofserializerGotmpl, + "templates/serializers/basetypeserializer.gotmpl": templatesSerializersBasetypeserializerGotmpl, + "templates/serializers/marshalbinaryserializer.gotmpl": templatesSerializersMarshalbinaryserializerGotmpl, + "templates/serializers/schemaserializer.gotmpl": templatesSerializersSchemaserializerGotmpl, + "templates/serializers/subtypeserializer.gotmpl": templatesSerializersSubtypeserializerGotmpl, + "templates/serializers/tupleserializer.gotmpl": templatesSerializersTupleserializerGotmpl, + "templates/server/builder.gotmpl": templatesServerBuilderGotmpl, + "templates/server/configureapi.gotmpl": templatesServerConfigureapiGotmpl, + "templates/server/doc.gotmpl": templatesServerDocGotmpl, + "templates/server/main.gotmpl": templatesServerMainGotmpl, + "templates/server/operation.gotmpl": templatesServerOperationGotmpl, + "templates/server/parameter.gotmpl": templatesServerParameterGotmpl, + "templates/server/responses.gotmpl": templatesServerResponsesGotmpl, + "templates/server/server.gotmpl": templatesServerServerGotmpl, + "templates/server/urlbuilder.gotmpl": templatesServerUrlbuilderGotmpl, + "templates/structfield.gotmpl": templatesStructfieldGotmpl, + "templates/swagger_json_embed.gotmpl": templatesSwagger_json_embedGotmpl, + "templates/validation/customformat.gotmpl": templatesValidationCustomformatGotmpl, + "templates/validation/primitive.gotmpl": templatesValidationPrimitiveGotmpl, + "templates/validation/structfield.gotmpl": templatesValidationStructfieldGotmpl, +} + +// AssetDebug is true if the assets were built with the debug flag enabled. +const AssetDebug = false // AssetDir returns the file names below a certain // directory embedded in the file by go-bindata. @@ -938,7 +1064,6 @@ type bintree struct { var _bintree = &bintree{nil, map[string]*bintree{ "templates": &bintree{nil, map[string]*bintree{ - "additionalpropertiesserializer.gotmpl": &bintree{templatesAdditionalpropertiesserializerGotmpl, map[string]*bintree{}}, "client": &bintree{nil, map[string]*bintree{ "client.gotmpl": &bintree{templatesClientClientGotmpl, map[string]*bintree{}}, "facade.gotmpl": &bintree{templatesClientFacadeGotmpl, map[string]*bintree{}}, @@ -957,14 +1082,25 @@ var _bintree = &bintree{nil, map[string]*bintree{ }}, }}, }}, - "docstring.gotmpl": &bintree{templatesDocstringGotmpl, map[string]*bintree{}}, - "header.gotmpl": &bintree{templatesHeaderGotmpl, map[string]*bintree{}}, - "model.gotmpl": &bintree{templatesModelGotmpl, map[string]*bintree{}}, - "modelvalidator.gotmpl": &bintree{templatesModelvalidatorGotmpl, map[string]*bintree{}}, - "schema.gotmpl": &bintree{templatesSchemaGotmpl, map[string]*bintree{}}, - "schemabody.gotmpl": &bintree{templatesSchemabodyGotmpl, map[string]*bintree{}}, - "schematype.gotmpl": &bintree{templatesSchematypeGotmpl, map[string]*bintree{}}, - "schemavalidator.gotmpl": &bintree{templatesSchemavalidatorGotmpl, map[string]*bintree{}}, + "docstring.gotmpl": &bintree{templatesDocstringGotmpl, map[string]*bintree{}}, + "header.gotmpl": &bintree{templatesHeaderGotmpl, map[string]*bintree{}}, + "model.gotmpl": &bintree{templatesModelGotmpl, map[string]*bintree{}}, + "schema.gotmpl": &bintree{templatesSchemaGotmpl, map[string]*bintree{}}, + "schemabody.gotmpl": &bintree{templatesSchemabodyGotmpl, map[string]*bintree{}}, + "schemaembedded.gotmpl": &bintree{templatesSchemaembeddedGotmpl, map[string]*bintree{}}, + "schemapolymorphic.gotmpl": &bintree{templatesSchemapolymorphicGotmpl, map[string]*bintree{}}, + "schematype.gotmpl": &bintree{templatesSchematypeGotmpl, map[string]*bintree{}}, + "schemavalidator.gotmpl": &bintree{templatesSchemavalidatorGotmpl, map[string]*bintree{}}, + "serializers": &bintree{nil, map[string]*bintree{ + "additionalpropertiesserializer.gotmpl": &bintree{templatesSerializersAdditionalpropertiesserializerGotmpl, map[string]*bintree{}}, + "aliasedserializer.gotmpl": &bintree{templatesSerializersAliasedserializerGotmpl, map[string]*bintree{}}, + "allofserializer.gotmpl": &bintree{templatesSerializersAllofserializerGotmpl, map[string]*bintree{}}, + "basetypeserializer.gotmpl": &bintree{templatesSerializersBasetypeserializerGotmpl, map[string]*bintree{}}, + "marshalbinaryserializer.gotmpl": &bintree{templatesSerializersMarshalbinaryserializerGotmpl, map[string]*bintree{}}, + "schemaserializer.gotmpl": &bintree{templatesSerializersSchemaserializerGotmpl, map[string]*bintree{}}, + "subtypeserializer.gotmpl": &bintree{templatesSerializersSubtypeserializerGotmpl, map[string]*bintree{}}, + "tupleserializer.gotmpl": &bintree{templatesSerializersTupleserializerGotmpl, map[string]*bintree{}}, + }}, "server": &bintree{nil, map[string]*bintree{ "builder.gotmpl": &bintree{templatesServerBuilderGotmpl, map[string]*bintree{}}, "configureapi.gotmpl": &bintree{templatesServerConfigureapiGotmpl, map[string]*bintree{}}, @@ -978,7 +1114,6 @@ var _bintree = &bintree{nil, map[string]*bintree{ }}, "structfield.gotmpl": &bintree{templatesStructfieldGotmpl, map[string]*bintree{}}, "swagger_json_embed.gotmpl": &bintree{templatesSwagger_json_embedGotmpl, map[string]*bintree{}}, - "tupleserializer.gotmpl": &bintree{templatesTupleserializerGotmpl, map[string]*bintree{}}, "validation": &bintree{nil, map[string]*bintree{ "customformat.gotmpl": &bintree{templatesValidationCustomformatGotmpl, map[string]*bintree{}}, "primitive.gotmpl": &bintree{templatesValidationPrimitiveGotmpl, map[string]*bintree{}}, diff --git a/vendor/github.com/go-swagger/go-swagger/generator/client.go b/vendor/github.com/go-swagger/go-swagger/generator/client.go index 7eda6c3904..65915bc6d9 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/client.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/client.go @@ -15,102 +15,54 @@ package generator import ( - "encoding/json" "errors" - "fmt" - "os" - "path" - "path/filepath" - "sort" - - "github.com/go-openapi/analysis" - "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" ) // GenerateClient generates a client library for a swagger spec document. func GenerateClient(name string, modelNames, operationIDs []string, opts *GenOpts) error { - templates.LoadDefaults() - if opts == nil { - return errors.New("gen opts are required") - } - - if opts.Template != "" { - if err := templates.LoadContrib(opts.Template); err != nil { - return err - } - } - - templates.SetAllowOverride(opts.AllowTemplateOverride) - - if opts.TemplateDir != "" { - if err := templates.LoadDir(opts.TemplateDir); err != nil { - return err - } - } - if err := opts.CheckOpts(); err != nil { return err } - // Load the spec - _, specDoc, err := loadSpec(opts.Spec) - if err != nil { + if err := opts.setTemplates(); err != nil { return err } - // Validate and Expand. specDoc is in/out param. - specDoc, err = validateAndFlattenSpec(opts, specDoc) + specDoc, analyzed, err := opts.analyzeSpec() if err != nil { return err } - analyzed := analysis.New(specDoc.Spec()) - models, err := gatherModels(specDoc, modelNames) if err != nil { return err } operations := gatherOperations(analyzed, operationIDs) - if len(operations) == 0 { return errors.New("no operations were selected") } - defaultScheme := opts.DefaultScheme - if defaultScheme == "" { - defaultScheme = sHTTP - } - - defaultConsumes := opts.DefaultConsumes - if defaultConsumes == "" { - defaultConsumes = runtime.JSONMime - } - - defaultProduces := opts.DefaultProduces - if defaultProduces == "" { - defaultProduces = runtime.JSONMime - } - generator := appGenerator{ - Name: appNameOrDefault(specDoc, name, "rest"), + Name: appNameOrDefault(specDoc, name, defaultClientName), SpecDoc: specDoc, Analyzed: analyzed, Models: models, Operations: operations, Target: opts.Target, DumpData: opts.DumpData, - Package: opts.LanguageOpts.ManglePackageName(opts.ClientPackage, "client"), - APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api"), - ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"), - ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"), - ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), - OperationsPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), - Principal: opts.Principal, - DefaultScheme: defaultScheme, - DefaultProduces: defaultProduces, - DefaultConsumes: defaultConsumes, + Package: opts.LanguageOpts.ManglePackageName(opts.ClientPackage, defaultClientTarget), + APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, defaultOperationsTarget), + ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, defaultModelsTarget), + ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, defaultServerTarget), + ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, defaultClientTarget), + OperationsPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, defaultClientTarget), + Principal: opts.PrincipalAlias(), + DefaultScheme: opts.DefaultScheme, + DefaultProduces: opts.DefaultProduces, + DefaultConsumes: opts.DefaultConsumes, GenOpts: opts, } generator.Receiver = "o" @@ -123,69 +75,33 @@ type clientGenerator struct { func (c *clientGenerator) Generate() error { app, err := c.makeCodegenApp() - if app.Name == "" { - app.Name = "APIClient" - } - baseImport := c.GenOpts.LanguageOpts.baseImport(c.Target) - - if c.GenOpts.ExistingModels == "" { - if app.Imports == nil { - app.Imports = make(map[string]string) - } - pkgAlias := c.GenOpts.LanguageOpts.ManglePackageName(c.ModelsPackage, "models") - app.Imports[pkgAlias] = path.Join( - filepath.ToSlash(baseImport), - c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ModelPackage, "models")) - } else { - app.DefaultImports = append(app.DefaultImports, c.GenOpts.LanguageOpts.ManglePackagePath(c.GenOpts.ExistingModels, "")) - } if err != nil { return err } if c.DumpData { - bb, _ := json.MarshalIndent(swag.ToDynamicJSON(app), "", " ") - fmt.Fprintln(os.Stdout, string(bb)) - return nil + return dumpData(swag.ToDynamicJSON(app)) } if c.GenOpts.IncludeModel { for _, mod := range app.Models { - modCopy := mod - modCopy.IncludeValidator = true - if !mod.IsStream { - if err := c.GenOpts.renderDefinition(&modCopy); err != nil { - return err - } + if mod.IsStream { + continue + } + if err := c.GenOpts.renderDefinition(&mod); err != nil { + return err } } } if c.GenOpts.IncludeHandler { - sort.Sort(app.OperationGroups) - for i := range app.OperationGroups { - opGroup := app.OperationGroups[i] - opGroup.DefaultImports = app.DefaultImports - opGroup.RootPackage = c.ClientPackage - opGroup.GenOpts = c.GenOpts - app.OperationGroups[i] = opGroup - sort.Sort(opGroup.Operations) - for _, op := range opGroup.Operations { - opCopy := op - if opCopy.Package == "" { - opCopy.Package = c.Package - } - if err := c.GenOpts.renderOperation(&opCopy); err != nil { + for _, opg := range app.OperationGroups { + for _, op := range opg.Operations { + if err := c.GenOpts.renderOperation(&op); err != nil { return err } } - app.DefaultImports = append(app.DefaultImports, - path.Join( - filepath.ToSlash(baseImport), - c.GenOpts.LanguageOpts.ManglePackagePath(c.ClientPackage, "client"), - opGroup.Name)) - - if err := c.GenOpts.renderOperationGroup(&opGroup); err != nil { + if err := c.GenOpts.renderOperationGroup(&opg); err != nil { return err } } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/debug.go b/vendor/github.com/go-swagger/go-swagger/generator/debug.go index 050b01f195..61b4b8d48d 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/debug.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/debug.go @@ -31,10 +31,6 @@ var ( generatorLogger *log.Logger ) -func init() { - debugOptions() -} - func debugOptions() { generatorLogger = log.New(os.Stdout, "generator:", log.LstdFlags) } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/language.go b/vendor/github.com/go-swagger/go-swagger/generator/language.go new file mode 100644 index 0000000000..a8dc0cfdea --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/generator/language.go @@ -0,0 +1,433 @@ +package generator + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "log" + "os" + "path" + "path/filepath" + "regexp" + goruntime "runtime" + "sort" + "strings" + + "github.com/go-openapi/swag" + "golang.org/x/tools/imports" +) + +var ( + // DefaultLanguageFunc defines the default generation language + DefaultLanguageFunc func() *LanguageOpts + + moduleRe *regexp.Regexp +) + +func initLanguage() { + DefaultLanguageFunc = GoLangOpts + + moduleRe = regexp.MustCompile(`module[ \t]+([^\s]+)`) +} + +// LanguageOpts to describe a language to the code generator +type LanguageOpts struct { + ReservedWords []string + BaseImportFunc func(string) string `json:"-"` + ImportsFunc func(map[string]string) string `json:"-"` + ArrayInitializerFunc func(interface{}) (string, error) `json:"-"` + reservedWordsSet map[string]struct{} + initialized bool + formatFunc func(string, []byte) ([]byte, error) + fileNameFunc func(string) string // language specific source file naming rules + dirNameFunc func(string) string // language specific directory naming rules +} + +// Init the language option +func (l *LanguageOpts) Init() { + if l.initialized { + return + } + l.initialized = true + l.reservedWordsSet = make(map[string]struct{}) + for _, rw := range l.ReservedWords { + l.reservedWordsSet[rw] = struct{}{} + } +} + +// MangleName makes sure a reserved word gets a safe name +func (l *LanguageOpts) MangleName(name, suffix string) string { + if _, ok := l.reservedWordsSet[swag.ToFileName(name)]; !ok { + return name + } + return strings.Join([]string{name, suffix}, "_") +} + +// MangleVarName makes sure a reserved word gets a safe name +func (l *LanguageOpts) MangleVarName(name string) string { + nm := swag.ToVarName(name) + if _, ok := l.reservedWordsSet[nm]; !ok { + return nm + } + return nm + "Var" +} + +// MangleFileName makes sure a file name gets a safe name +func (l *LanguageOpts) MangleFileName(name string) string { + if l.fileNameFunc != nil { + return l.fileNameFunc(name) + } + return swag.ToFileName(name) +} + +// ManglePackageName makes sure a package gets a safe name. +// In case of a file system path (e.g. name contains "/" or "\" on Windows), this return only the last element. +func (l *LanguageOpts) ManglePackageName(name, suffix string) string { + if name == "" { + return suffix + } + if l.dirNameFunc != nil { + name = l.dirNameFunc(name) + } + pth := filepath.ToSlash(filepath.Clean(name)) // preserve path + pkg := importAlias(pth) // drop path + return l.MangleName(swag.ToFileName(prefixForName(pkg)+pkg), suffix) +} + +// ManglePackagePath makes sure a full package path gets a safe name. +// Only the last part of the path is altered. +func (l *LanguageOpts) ManglePackagePath(name string, suffix string) string { + if name == "" { + return suffix + } + target := filepath.ToSlash(filepath.Clean(name)) // preserve path + parts := strings.Split(target, "/") + parts[len(parts)-1] = l.ManglePackageName(parts[len(parts)-1], suffix) + return strings.Join(parts, "/") +} + +// FormatContent formats a file with a language specific formatter +func (l *LanguageOpts) FormatContent(name string, content []byte) ([]byte, error) { + if l.formatFunc != nil { + return l.formatFunc(name, content) + } + return content, nil +} + +// imports generate the code to import some external packages, possibly aliased +func (l *LanguageOpts) imports(imports map[string]string) string { + if l.ImportsFunc != nil { + return l.ImportsFunc(imports) + } + return "" +} + +// arrayInitializer builds a litteral array +func (l *LanguageOpts) arrayInitializer(data interface{}) (string, error) { + if l.ArrayInitializerFunc != nil { + return l.ArrayInitializerFunc(data) + } + return "", nil +} + +// baseImport figures out the base path to generate import statements +func (l *LanguageOpts) baseImport(tgt string) string { + if l.BaseImportFunc != nil { + return l.BaseImportFunc(tgt) + } + debugLog("base import func is nil") + return "" +} + +// GoLangOpts for rendering items as golang code +func GoLangOpts() *LanguageOpts { + var goOtherReservedSuffixes = map[string]bool{ + // see: + // https://golang.org/src/go/build/syslist.go + // https://golang.org/doc/install/source#environment + + // goos + "aix": true, + "android": true, + "darwin": true, + "dragonfly": true, + "freebsd": true, + "hurd": true, + "illumos": true, + "js": true, + "linux": true, + "nacl": true, + "netbsd": true, + "openbsd": true, + "plan9": true, + "solaris": true, + "windows": true, + "zos": true, + + // arch + "386": true, + "amd64": true, + "amd64p32": true, + "arm": true, + "armbe": true, + "arm64": true, + "arm64be": true, + "mips": true, + "mipsle": true, + "mips64": true, + "mips64le": true, + "mips64p32": true, + "mips64p32le": true, + "ppc": true, + "ppc64": true, + "ppc64le": true, + "riscv": true, + "riscv64": true, + "s390": true, + "s390x": true, + "sparc": true, + "sparc64": true, + "wasm": true, + + // other reserved suffixes + "test": true, + } + + opts := new(LanguageOpts) + opts.ReservedWords = []string{ + "break", "default", "func", "interface", "select", + "case", "defer", "go", "map", "struct", + "chan", "else", "goto", "package", "switch", + "const", "fallthrough", "if", "range", "type", + "continue", "for", "import", "return", "var", + } + + opts.formatFunc = func(ffn string, content []byte) ([]byte, error) { + opts := new(imports.Options) + opts.TabIndent = true + opts.TabWidth = 2 + opts.Fragment = true + opts.Comments = true + return imports.Process(ffn, content, opts) + } + + opts.fileNameFunc = func(name string) string { + // whenever a generated file name ends with a suffix + // that is meaningful to go build, adds a "swagger" + // suffix + parts := strings.Split(swag.ToFileName(name), "_") + if goOtherReservedSuffixes[parts[len(parts)-1]] { + // file name ending with a reserved arch or os name + // are appended an innocuous suffix "swagger" + parts = append(parts, "swagger") + } + return strings.Join(parts, "_") + } + + opts.dirNameFunc = func(name string) string { + // whenever a generated directory name is a special + // golang directory, append an innocuous suffix + switch name { + case "vendor", "internal": + return strings.Join([]string{name, "swagger"}, "_") + } + return name + } + + opts.ImportsFunc = func(imports map[string]string) string { + if len(imports) == 0 { + return "" + } + result := make([]string, 0, len(imports)) + for k, v := range imports { + _, name := path.Split(v) + if name != k { + result = append(result, fmt.Sprintf("\t%s %q", k, v)) + } else { + result = append(result, fmt.Sprintf("\t%q", v)) + } + } + sort.Strings(result) + return strings.Join(result, "\n") + } + + opts.ArrayInitializerFunc = func(data interface{}) (string, error) { + // ArrayInitializer constructs a Go literal initializer from interface{} literals. + // e.g. []interface{}{"a", "b"} is transformed in {"a","b",} + // e.g. map[string]interface{}{ "a": "x", "b": "y"} is transformed in {"a":"x","b":"y",}. + // + // NOTE: this is currently used to construct simple slice intializers for default values. + // This allows for nicer slice initializers for slices of primitive types and avoid systematic use for json.Unmarshal(). + b, err := json.Marshal(data) + if err != nil { + return "", err + } + return strings.Replace(strings.Replace(strings.Replace(string(b), "}", ",}", -1), "[", "{", -1), "]", ",}", -1), nil + } + + opts.BaseImportFunc = func(tgt string) string { + tgt = filepath.Clean(tgt) + // On Windows, filepath.Abs("") behaves differently than on Unix. + // Windows: yields an error, since Abs() does not know the volume. + // UNIX: returns current working directory + if tgt == "" { + tgt = "." + } + tgtAbsPath, err := filepath.Abs(tgt) + if err != nil { + log.Fatalf("could not evaluate base import path with target \"%s\": %v", tgt, err) + } + + var tgtAbsPathExtended string + tgtAbsPathExtended, err = filepath.EvalSymlinks(tgtAbsPath) + if err != nil { + log.Fatalf("could not evaluate base import path with target \"%s\" (with symlink resolution): %v", tgtAbsPath, err) + } + + gopath := os.Getenv("GOPATH") + if gopath == "" { + gopath = filepath.Join(os.Getenv("HOME"), "go") + } + + var pth string + for _, gp := range filepath.SplitList(gopath) { + // EvalSymLinks also calls the Clean + gopathExtended, er := filepath.EvalSymlinks(gp) + if er != nil { + log.Fatalln(er) + } + gopathExtended = filepath.Join(gopathExtended, "src") + gp = filepath.Join(gp, "src") + + // At this stage we have expanded and unexpanded target path. GOPATH is fully expanded. + // Expanded means symlink free. + // We compare both types of targetpath<s> with gopath. + // If any one of them coincides with gopath , it is imperative that + // target path lies inside gopath. How? + // - Case 1: Irrespective of symlinks paths coincide. Both non-expanded paths. + // - Case 2: Symlink in target path points to location inside GOPATH. (Expanded Target Path) + // - Case 3: Symlink in target path points to directory outside GOPATH (Unexpanded target path) + + // Case 1: - Do nothing case. If non-expanded paths match just generate base import path as if + // there are no symlinks. + + // Case 2: - Symlink in target path points to location inside GOPATH. (Expanded Target Path) + // First if will fail. Second if will succeed. + + // Case 3: - Symlink in target path points to directory outside GOPATH (Unexpanded target path) + // First if will succeed and break. + + // compares non expanded path for both + if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPath, gp); ok { + pth = relativepath + break + } + + // Compares non-expanded target path + if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPath, gopathExtended); ok { + pth = relativepath + break + } + + // Compares expanded target path. + if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPathExtended, gopathExtended); ok { + pth = relativepath + break + } + + } + + mod, goModuleAbsPath, err := tryResolveModule(tgtAbsPath) + switch { + case err != nil: + log.Fatalf("Failed to resolve module using go.mod file: %s", err) + case mod != "": + relTgt := relPathToRelGoPath(goModuleAbsPath, tgtAbsPath) + if !strings.HasSuffix(mod, relTgt) { + return filepath.ToSlash(mod + relTgt) + } + return filepath.ToSlash(mod) + } + + if pth == "" { + log.Fatalln("target must reside inside a location in the $GOPATH/src or be a module") + } + return filepath.ToSlash(pth) + } + opts.Init() + return opts +} + +// resolveGoModFile walks up the directory tree starting from 'dir' until it +// finds a go.mod file. If go.mod is found it will return the related file +// object. If no go.mod file is found it will return an error. +func resolveGoModFile(dir string) (*os.File, string, error) { + goModPath := filepath.Join(dir, "go.mod") + f, err := os.Open(goModPath) + if err != nil { + if os.IsNotExist(err) && dir != filepath.Dir(dir) { + return resolveGoModFile(filepath.Dir(dir)) + } + return nil, "", err + } + return f, dir, nil +} + +// relPathToRelGoPath takes a relative os path and returns the relative go +// package path. For unix nothing will change but for windows \ will be +// converted to /. +func relPathToRelGoPath(modAbsPath, absPath string) string { + if absPath == "." { + return "" + } + + path := strings.TrimPrefix(absPath, modAbsPath) + pathItems := strings.Split(path, string(filepath.Separator)) + return strings.Join(pathItems, "/") +} + +func tryResolveModule(baseTargetPath string) (string, string, error) { + f, goModAbsPath, err := resolveGoModFile(baseTargetPath) + switch { + case os.IsNotExist(err): + return "", "", nil + case err != nil: + return "", "", err + } + + src, err := ioutil.ReadAll(f) + if err != nil { + return "", "", err + } + + match := moduleRe.FindSubmatch(src) + if len(match) != 2 { + return "", "", nil + } + + return string(match[1]), goModAbsPath, nil +} + +// 1. Checks if the child path and parent path coincide. +// 2. If they do return child path relative to parent path. +// 3. Everything else return false +func checkPrefixAndFetchRelativePath(childpath string, parentpath string) (bool, string) { + // Windows (local) file systems - NTFS, as well as FAT and variants + // are case insensitive. + cp, pp := childpath, parentpath + if goruntime.GOOS == "windows" { + cp = strings.ToLower(cp) + pp = strings.ToLower(pp) + } + + if strings.HasPrefix(cp, pp) { + pth, err := filepath.Rel(parentpath, childpath) + if err != nil { + log.Fatalln(err) + } + return true, pth + } + + return false, "" + +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/media.go b/vendor/github.com/go-swagger/go-swagger/generator/media.go new file mode 100644 index 0000000000..f9dad9fa4b --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/generator/media.go @@ -0,0 +1,191 @@ +package generator + +import ( + "regexp" + "sort" + "strings" + + "github.com/go-openapi/runtime" + "github.com/go-openapi/swag" +) + +const jsonSerializer = "json" + +var mediaTypeNames = map[*regexp.Regexp]string{ + regexp.MustCompile("application/.*json"): jsonSerializer, + regexp.MustCompile("application/.*yaml"): "yaml", + regexp.MustCompile("application/.*protobuf"): "protobuf", + regexp.MustCompile("application/.*capnproto"): "capnproto", + regexp.MustCompile("application/.*thrift"): "thrift", + regexp.MustCompile("(?:application|text)/.*xml"): "xml", + regexp.MustCompile("text/.*markdown"): "markdown", + regexp.MustCompile("text/.*html"): "html", + regexp.MustCompile("text/.*csv"): "csv", + regexp.MustCompile("text/.*tsv"): "tsv", + regexp.MustCompile("text/.*javascript"): "js", + regexp.MustCompile("text/.*css"): "css", + regexp.MustCompile("text/.*plain"): "txt", + regexp.MustCompile("application/.*octet-stream"): "bin", + regexp.MustCompile("application/.*tar"): "tar", + regexp.MustCompile("application/.*gzip"): "gzip", + regexp.MustCompile("application/.*gz"): "gzip", + regexp.MustCompile("application/.*raw-stream"): "bin", + regexp.MustCompile("application/x-www-form-urlencoded"): "urlform", + regexp.MustCompile("application/javascript"): "txt", + regexp.MustCompile("multipart/form-data"): "multipartform", + regexp.MustCompile("image/.*"): "bin", + regexp.MustCompile("audio/.*"): "bin", + regexp.MustCompile("application/pdf"): "bin", +} + +var knownProducers = map[string]string{ + jsonSerializer: "runtime.JSONProducer()", + "yaml": "yamlpc.YAMLProducer()", + "xml": "runtime.XMLProducer()", + "txt": "runtime.TextProducer()", + "bin": "runtime.ByteStreamProducer()", + "urlform": "runtime.DiscardProducer", + "multipartform": "runtime.DiscardProducer", +} + +var knownConsumers = map[string]string{ + jsonSerializer: "runtime.JSONConsumer()", + "yaml": "yamlpc.YAMLConsumer()", + "xml": "runtime.XMLConsumer()", + "txt": "runtime.TextConsumer()", + "bin": "runtime.ByteStreamConsumer()", + "urlform": "runtime.DiscardConsumer", + "multipartform": "runtime.DiscardConsumer", +} + +func wellKnownMime(tn string) (string, bool) { + for k, v := range mediaTypeNames { + if k.MatchString(tn) { + return v, true + } + } + return "", false +} + +func mediaMime(orig string) string { + return strings.SplitN(orig, ";", 2)[0] +} + +func mediaParameters(orig string) string { + parts := strings.SplitN(orig, ";", 2) + if len(parts) < 2 { + return "" + } + return parts[1] +} + +func (a *appGenerator) makeSerializers(mediaTypes []string, known func(string) (string, bool)) (GenSerGroups, bool) { + supportsJSON := false + uniqueSerializers := make(map[string]*GenSerializer, len(mediaTypes)) + uniqueSerializerGroups := make(map[string]*GenSerGroup, len(mediaTypes)) + + // build all required serializers + for _, media := range mediaTypes { + key := mediaMime(media) + nm, ok := wellKnownMime(key) + if !ok { + // keep this serializer named, even though its implementation is empty (cf. #1557) + nm = key + } + name := swag.ToJSONName(nm) + impl, _ := known(name) + + ser, ok := uniqueSerializers[key] + if !ok { + ser = &GenSerializer{ + AppName: a.Name, + ReceiverName: a.Receiver, + Name: name, + MediaType: key, + Implementation: impl, + Parameters: []string{}, + } + uniqueSerializers[key] = ser + } + // provide all known parameters (currently unused by codegen templates) + if params := strings.TrimSpace(mediaParameters(media)); params != "" { + found := false + for _, p := range ser.Parameters { + if params == p { + found = true + break + } + } + if !found { + ser.Parameters = append(ser.Parameters, params) + } + } + + uniqueSerializerGroups[name] = &GenSerGroup{ + GenSerializer: GenSerializer{ + AppName: a.Name, + ReceiverName: a.Receiver, + Name: name, + Implementation: impl, + }, + } + } + + if len(uniqueSerializers) == 0 { + impl, _ := known(jsonSerializer) + uniqueSerializers[runtime.JSONMime] = &GenSerializer{ + AppName: a.Name, + ReceiverName: a.Receiver, + Name: jsonSerializer, + MediaType: runtime.JSONMime, + Implementation: impl, + Parameters: []string{}, + } + uniqueSerializerGroups[jsonSerializer] = &GenSerGroup{ + GenSerializer: GenSerializer{ + AppName: a.Name, + ReceiverName: a.Receiver, + Name: jsonSerializer, + Implementation: impl, + }, + } + supportsJSON = true + } + + // group serializers by consumer/producer to serve several mime media types + serializerGroups := make(GenSerGroups, 0, len(uniqueSerializers)) + + for _, group := range uniqueSerializerGroups { + if group.Name == jsonSerializer { + supportsJSON = true + } + serializers := make(GenSerializers, 0, len(uniqueSerializers)) + for _, ser := range uniqueSerializers { + if group.Name == ser.Name { + sort.Strings(ser.Parameters) + serializers = append(serializers, *ser) + } + } + sort.Sort(serializers) + group.AllSerializers = serializers // provides the full list of mime media types for this serializer group + serializerGroups = append(serializerGroups, *group) + } + sort.Sort(serializerGroups) + return serializerGroups, supportsJSON +} + +func (a *appGenerator) makeConsumes() (GenSerGroups, bool) { + // builds a codegen struct from all consumes in the spec + return a.makeSerializers(a.Analyzed.RequiredConsumes(), func(media string) (string, bool) { + c, ok := knownConsumers[media] + return c, ok + }) +} + +func (a *appGenerator) makeProduces() (GenSerGroups, bool) { + // builds a codegen struct from all produces in the spec + return a.makeSerializers(a.Analyzed.RequiredProduces(), func(media string) (string, bool) { + p, ok := knownProducers[media] + return p, ok + }) +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/model.go b/vendor/github.com/go-swagger/go-swagger/generator/model.go index 9b6bd19849..c005d02845 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/model.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/model.go @@ -15,11 +15,9 @@ package generator import ( - "encoding/json" "errors" "fmt" "log" - "os" "path" "path/filepath" "sort" @@ -49,30 +47,38 @@ Every action that happens tracks the path which is a linked list of refs */ -// GenerateDefinition generates a model file for a schema definition. -func GenerateDefinition(modelNames []string, opts *GenOpts) error { - if opts == nil { - return errors.New("gen opts are required") +// GenerateModels generates all model files for some schema definitions +func GenerateModels(modelNames []string, opts *GenOpts) error { + // overide any default or incompatible options setting + opts.IncludeModel = true + opts.IgnoreOperations = true + opts.ExistingModels = "" + opts.IncludeHandler = false + opts.IncludeMain = false + opts.IncludeSupport = false + generator, err := newAppGenerator("", modelNames, nil, opts) + if err != nil { + return err } + return generator.Generate() +} - templates.SetAllowOverride(opts.AllowTemplateOverride) - - if opts.TemplateDir != "" { - if err := templates.LoadDir(opts.TemplateDir); err != nil { - return err - } +// GenerateDefinition generates a single model file for some schema definitions +func GenerateDefinition(modelNames []string, opts *GenOpts) error { + if err := opts.CheckOpts(); err != nil { + return err } - if err := opts.CheckOpts(); err != nil { + if err := opts.setTemplates(); err != nil { return err } - // Load the spec - specPath, specDoc, err := loadSpec(opts.Spec) + specDoc, _, err := opts.analyzeSpec() if err != nil { return err } + modelNames = pruneEmpty(modelNames) if len(modelNames) == 0 { for k := range specDoc.Spec().Definitions { modelNames = append(modelNames, k) @@ -83,7 +89,7 @@ func GenerateDefinition(modelNames []string, opts *GenOpts) error { // lookup schema model, ok := specDoc.Spec().Definitions[modelName] if !ok { - return fmt.Errorf("model %q not found in definitions given by %q", modelName, specPath) + return fmt.Errorf("model %q not found in definitions given by %q", modelName, opts.Spec) } // generate files @@ -121,9 +127,7 @@ func (m *definitionGenerator) Generate() error { } if m.opts.DumpData { - bb, _ := json.MarshalIndent(swag.ToDynamicJSON(mod), "", " ") - fmt.Fprintln(os.Stdout, string(bb)) - return nil + return dumpData(swag.ToDynamicJSON(mod)) } if m.opts.IncludeModel { @@ -169,13 +173,17 @@ func shallowValidationLookup(sch GenSchema) bool { // and NeedsValidation (e.g. should have a Validate method with something in it). // The latter was almost not used anyhow. + if sch.HasAdditionalProperties && sch.AdditionalProperties == nil { + log.Printf("warning: schema for additional properties in schema %q is empty. skipped", sch.Name) + } + if sch.IsArray && sch.HasValidations { return true } if sch.IsStream || sch.IsInterface { // these types have no validation - aliased types on those do not implement the Validatable interface return false } - if sch.Required || sch.IsCustomFormatter && !sch.IsStream { + if sch.Required || hasFormatValidation(sch.resolvedType) { return true } if sch.MaxLength != nil || sch.MinLength != nil || sch.Pattern != "" || sch.MultipleOf != nil || sch.Minimum != nil || sch.Maximum != nil || len(sch.Enum) > 0 || len(sch.ItemsEnum) > 0 { @@ -196,11 +204,11 @@ func shallowValidationLookup(sch GenSchema) bool { if sch.IsTuple && (sch.AdditionalItems != nil && (sch.AdditionalItems.HasValidations || sch.AdditionalItems.Required)) { return true } - if sch.HasAdditionalProperties && (sch.AdditionalProperties.IsInterface || sch.AdditionalProperties.IsStream) { + if sch.HasAdditionalProperties && sch.AdditionalProperties != nil && (sch.AdditionalProperties.IsInterface || sch.AdditionalProperties.IsStream) { return false } - if sch.HasAdditionalProperties && (sch.AdditionalProperties.HasValidations || sch.AdditionalProperties.Required || sch.AdditionalProperties.IsAliased && !(sch.AdditionalProperties.IsInterface || sch.AdditionalProperties.IsStream)) { + if sch.HasAdditionalProperties && sch.AdditionalProperties != nil && (sch.AdditionalProperties.HasValidations || sch.AdditionalProperties.Required || sch.AdditionalProperties.IsAliased && !(sch.AdditionalProperties.IsInterface || sch.AdditionalProperties.IsStream)) { return true } @@ -213,10 +221,13 @@ func shallowValidationLookup(sch GenSchema) bool { return false } +func isExternal(schema spec.Schema) bool { + extType, ok := hasExternalType(schema.Extensions) + return ok && !extType.Embedded +} + func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, specDoc *loads.Document, opts *GenOpts) (*GenDefinition, error) { // Check if model is imported from external package using x-go-type - _, external := schema.Extensions[xGoType] - receiver := "m" // models are resolved in the current package resolver := newTypeResolver("", specDoc) @@ -241,6 +252,8 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, IncludeValidator: opts.IncludeValidator, IncludeModel: opts.IncludeModel, StrictAdditionalProperties: opts.StrictAdditionalProperties, + WithXML: opts.WithXML, + StructTags: opts.StructTags, } if err := pg.makeGenSchema(); err != nil { return nil, fmt.Errorf("could not generate schema for %s: %v", name, err) @@ -282,6 +295,10 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, // replace the ref with this new genschema swsp := specDoc.Spec() for i, ss := range schema.AllOf { + if pg.GenSchema.AllOf == nil { + log.Printf("warning: resolved schema for subtype %q.AllOf[%d] is empty. skipped", name, i) + continue + } ref := ss.Ref for ref.String() != "" { var rsch *spec.Schema @@ -290,7 +307,6 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, if err != nil { return nil, err } - ref = rsch.Ref if rsch != nil && rsch.Ref.String() != "" { ref = rsch.Ref continue @@ -336,17 +352,17 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, } - defaultImports := []string{ - "github.com/go-openapi/errors", - "github.com/go-openapi/runtime", - "github.com/go-openapi/swag", - "github.com/go-openapi/validate", + defaultImports := map[string]string{ + "errors": "github.com/go-openapi/errors", + "runtime": "github.com/go-openapi/runtime", + "swag": "github.com/go-openapi/swag", + "validate": "github.com/go-openapi/validate", } return &GenDefinition{ GenCommon: GenCommon{ Copyright: opts.Copyright, - TargetImportPath: filepath.ToSlash(opts.LanguageOpts.baseImport(opts.Target)), + TargetImportPath: opts.LanguageOpts.baseImport(opts.Target), }, Package: opts.LanguageOpts.ManglePackageName(path.Base(filepath.ToSlash(pkg)), "definitions"), GenSchema: pg.GenSchema, @@ -354,7 +370,7 @@ func makeGenDefinitionHierarchy(name, pkg, container string, schema spec.Schema, DefaultImports: defaultImports, ExtraSchemas: gatherExtraSchemas(pg.ExtraSchemas), Imports: findImports(&pg.GenSchema), - External: external, + External: isExternal(schema), }, nil } @@ -364,6 +380,11 @@ func findImports(sch *GenSchema) map[string]string { if t.Pkg != "" && t.PkgAlias != "" { imp[t.PkgAlias] = t.Pkg } + if t.IsEmbedded && t.ElemType != nil { + if t.ElemType.Pkg != "" && t.ElemType.PkgAlias != "" { + imp[t.ElemType.PkgAlias] = t.ElemType.Pkg + } + } if sch.Items != nil { sub := findImports(sch.Items) for k, v := range sub { @@ -404,6 +425,9 @@ func findImports(sch *GenSchema) map[string]string { } } } + for k, v := range sch.ExtraImports { + imp[k] = v + } return imp } @@ -418,6 +442,7 @@ type schemaGenContext struct { IncludeValidator bool IncludeModel bool StrictAdditionalProperties bool + WithXML bool Index int Path string @@ -431,6 +456,7 @@ type schemaGenContext struct { Container string Schema spec.Schema TypeResolver *typeResolver + StructTags []string GenSchema GenSchema Dependencies []string // NOTE: Dependencies is actually set nowhere @@ -438,6 +464,9 @@ type schemaGenContext struct { Discriminator *discor Discriminated *discee Discrimination *discInfo + + // force to use container in inlined definitions (for deconflicting) + UseContainerInName bool } func (sg *schemaGenContext) NewSliceBranch(schema *spec.Schema) *schemaGenContext { @@ -548,7 +577,7 @@ func (sg *schemaGenContext) shallowClone() *schemaGenContext { if pg.Container == "" { pg.Container = sg.Name } - pg.GenSchema = GenSchema{} + pg.GenSchema = GenSchema{StructTags: sg.StructTags} pg.Dependencies = nil pg.Named = false pg.Index = 0 @@ -621,6 +650,16 @@ func hasValidations(model *spec.Schema, isRequired bool) (hasValidation bool) { return } +func hasFormatValidation(tpe resolvedType) bool { + if tpe.IsCustomFormatter && !tpe.IsStream && !tpe.IsBase64 { + return true + } + if tpe.IsArray && tpe.ElemType != nil { + return hasFormatValidation(*tpe.ElemType) + } + return false +} + // handleFormatConflicts handles all conflicting model properties when a format is set func handleFormatConflicts(model *spec.Schema) { switch model.Format { @@ -690,6 +729,14 @@ func (sg *schemaGenContext) MergeResult(other *schemaGenContext, liftsRequired b if other.GenSchema.IsMapNullOverride { sg.GenSchema.IsMapNullOverride = true } + + // lift extra imports + if other.GenSchema.Pkg != "" && other.GenSchema.PkgAlias != "" { + sg.GenSchema.ExtraImports[other.GenSchema.PkgAlias] = other.GenSchema.Pkg + } + for k, v := range other.GenSchema.ExtraImports { + sg.GenSchema.ExtraImports[k] = v + } } func (sg *schemaGenContext) buildProperties() error { @@ -702,7 +749,7 @@ func (sg *schemaGenContext) buildProperties() error { sg.Name, k, sg.IsTuple, sg.GenSchema.HasValidations) // check if this requires de-anonymizing, if so lift this as a new struct and extra schema - tpe, err := sg.TypeResolver.ResolveSchema(&v, true, sg.IsTuple || containsString(sg.Schema.Required, k)) + tpe, err := sg.TypeResolver.ResolveSchema(&v, true, sg.IsTuple || swag.ContainsStrings(sg.Schema.Required, k)) if sg.Schema.Discriminator == k { tpe.IsNullable = false } @@ -714,7 +761,7 @@ func (sg *schemaGenContext) buildProperties() error { var hasValidation bool if tpe.IsComplexObject && tpe.IsAnonymous && len(v.Properties) > 0 { // this is an anonymous complex construct: build a new new type for it - pg := sg.makeNewStruct(sg.Name+swag.ToGoName(k), v) + pg := sg.makeNewStruct(sg.makeRefName()+swag.ToGoName(k), v) pg.IsTuple = sg.IsTuple if sg.Path != "" { pg.Path = sg.Path + "+ \".\"+" + fmt.Sprintf("%q", k) @@ -754,7 +801,7 @@ func (sg *schemaGenContext) buildProperties() error { } // generates format validation on property - emprop.GenSchema.HasValidations = emprop.GenSchema.HasValidations || (tpe.IsCustomFormatter && !tpe.IsStream) || (tpe.IsArray && tpe.ElemType.IsCustomFormatter && !tpe.ElemType.IsStream) + emprop.GenSchema.HasValidations = emprop.GenSchema.HasValidations || hasFormatValidation(tpe) if emprop.Schema.Ref.String() != "" { // expand the schema of this property, so we take informed decisions about its type @@ -768,7 +815,9 @@ func (sg *schemaGenContext) buildProperties() error { if err != nil { return err } - ref = rsch.Ref + if rsch == nil { + return errors.New("spec.ResolveRef returned nil schema") + } if rsch != nil && rsch.Ref.String() != "" { ref = rsch.Ref continue @@ -804,7 +853,7 @@ func (sg *schemaGenContext) buildProperties() error { hv := hasValidations(sch, false) // include format validation, excluding binary - hv = hv || (ttpe.IsCustomFormatter && !ttpe.IsStream) || (ttpe.IsArray && ttpe.ElemType.IsCustomFormatter && !ttpe.ElemType.IsStream) + hv = hv || hasFormatValidation(ttpe) // a base type property is always validated against the base type // exception: for the base type definition itself (see shallowValidationLookup()) @@ -898,7 +947,7 @@ func (sg *schemaGenContext) buildAllOf() error { // - nested allOf: this one is itself a AllOf: build a new type for it // - anonymous simple types for edge cases: array, primitive, interface{} // NOTE: when branches are aliased or anonymous, the nullable property in the branch type is lost. - name := swag.ToVarName(goName(&sch, sg.Name+"AllOf"+strconv.Itoa(i))) + name := swag.ToVarName(goName(&sch, sg.makeRefName()+"AllOf"+strconv.Itoa(i))) debugLog("building anonymous nested allOf in %s: %s", sg.Name, name) ng := sg.makeNewStruct(name, sch) if err := ng.makeGenSchema(); err != nil { @@ -991,7 +1040,7 @@ func newMapStack(context *schemaGenContext) (first, last *mapStack, err error) { //reached the end of the rabbit hole if tpe.IsComplexObject && tpe.IsAnonymous { // found an anonymous object: create the struct from a newly created definition - nw := l.Context.makeNewStruct(l.Context.Name+" Anon", *l.Type.AdditionalProperties.Schema) + nw := l.Context.makeNewStruct(l.Context.makeRefName()+" Anon", *l.Type.AdditionalProperties.Schema) sch := spec.RefProperty("#/definitions/" + nw.Name) l.NewObj = nw @@ -1216,7 +1265,7 @@ func (sg *schemaGenContext) buildAdditionalProperties() error { if tpe.IsComplexObject && tpe.IsAnonymous { // if the AdditionalProperties is an anonymous complex object, generate a new type for it - pg := sg.makeNewStruct(sg.Name+" Anon", *addp.Schema) + pg := sg.makeNewStruct(sg.makeRefName()+" Anon", *addp.Schema) if err := pg.makeGenSchema(); err != nil { return err } @@ -1311,7 +1360,7 @@ func (sg *schemaGenContext) buildAdditionalProperties() error { } hasMapNullOverride := sg.GenSchema.IsMapNullOverride - sg.GenSchema = GenSchema{} + sg.GenSchema = GenSchema{StructTags: sg.StructTags} sg.Schema = *spec.RefProperty("#/definitions/" + newObj.Name) if err := sg.makeGenSchema(); err != nil { return err @@ -1356,6 +1405,7 @@ func (sg *schemaGenContext) makeNewStruct(name string, schema spec.Schema) *sche IncludeValidator: sg.IncludeValidator, IncludeModel: sg.IncludeModel, StrictAdditionalProperties: sg.StrictAdditionalProperties, + StructTags: sg.StructTags, } if schema.Ref.String() == "" { pg.TypeResolver = sg.TypeResolver.NewWithModelName(name) @@ -1374,7 +1424,7 @@ func (sg *schemaGenContext) buildArray() error { // check if the element is a complex object, if so generate a new type for it if tpe.IsComplexObject && tpe.IsAnonymous { - pg := sg.makeNewStruct(sg.Name+" items"+strconv.Itoa(sg.Index), *sg.Schema.Items.Schema) + pg := sg.makeNewStruct(sg.makeRefName()+" items"+strconv.Itoa(sg.Index), *sg.Schema.Items.Schema) if err := pg.makeGenSchema(); err != nil { return err } @@ -1419,10 +1469,8 @@ func (sg *schemaGenContext) buildArray() error { schemaCopy.Required = false // validations of items - hv := hasValidations(sg.Schema.Items.Schema, false) - - // include format validation, excluding binary - hv = hv || (schemaCopy.IsCustomFormatter && !schemaCopy.IsStream) || (schemaCopy.IsArray && schemaCopy.ElemType.IsCustomFormatter && !schemaCopy.ElemType.IsStream) + // include format validation, excluding binary and base64 format validation + hv := hasValidations(sg.Schema.Items.Schema, false) || hasFormatValidation(schemaCopy.resolvedType) // base types of polymorphic types must be validated // NOTE: IsNullable is not useful to figure out a validation: we use Refed and IsAliased below instead @@ -1478,7 +1526,7 @@ func (sg *schemaGenContext) buildItems() error { } if tpe.IsComplexObject && tpe.IsAnonymous { // if the tuple element is an anonymous complex object, build a new type for it - pg := sg.makeNewStruct(sg.Name+" Items"+strconv.Itoa(i), s) + pg := sg.makeNewStruct(sg.makeRefName()+" Items"+strconv.Itoa(i), s) if err := pg.makeGenSchema(); err != nil { return err } @@ -1546,7 +1594,7 @@ func (sg *schemaGenContext) buildAdditionalItems() error { return err } if tpe.IsComplexObject && tpe.IsAnonymous { - pg := sg.makeNewStruct(sg.Name+" Items", *sg.Schema.AdditionalItems.Schema) + pg := sg.makeNewStruct(sg.makeRefName()+" Items", *sg.Schema.AdditionalItems.Schema) if err := pg.makeGenSchema(); err != nil { return err } @@ -1581,16 +1629,21 @@ func (sg *schemaGenContext) buildAdditionalItems() error { return nil } -func (sg *schemaGenContext) buildXMLName() error { - if sg.Schema.XML == nil { - return nil - } - sg.GenSchema.XMLName = sg.Name +func (sg *schemaGenContext) buildXMLNameWithTags() error { + if sg.WithXML || sg.Schema.XML != nil { + sg.GenSchema.XMLName = sg.Name + + if sg.Schema.XML != nil { + if sg.Schema.XML.Name != "" { + sg.GenSchema.XMLName = sg.Schema.XML.Name + } + if sg.Schema.XML.Attribute { + sg.GenSchema.XMLName += ",attr" + } + } - if sg.Schema.XML.Name != "" { - sg.GenSchema.XMLName = sg.Schema.XML.Name - if sg.Schema.XML.Attribute { - sg.GenSchema.XMLName += ",attr" + if !sg.GenSchema.Required && sg.GenSchema.IsEmptyOmitted { + sg.GenSchema.XMLName += ",omitempty" } } return nil @@ -1646,6 +1699,7 @@ func (sg *schemaGenContext) shortCircuitNamedRef() (bool, error) { tpe.IsNullable = tpx.IsNullable // TODO tpe.IsInterface = tpx.IsInterface tpe.IsStream = tpx.IsStream + tpe.IsEmbedded = tpx.IsEmbedded tpe.SwaggerType = tpx.SwaggerType sch := spec.Schema{} @@ -1764,6 +1818,15 @@ func (sg *schemaGenContext) buildAliased() error { return nil } +func (sg schemaGenContext) makeRefName() string { + // figure out a longer name for deconflicting anonymous models. + // This is used when makeNewStruct() is followed by the creation of a new ref to definitions + if sg.UseContainerInName && sg.Container != sg.Name { + return sg.Container + swag.ToGoName(sg.Name) + } + return sg.Name +} + func (sg *schemaGenContext) GoName() string { return goName(&sg.Schema, sg.Name) } @@ -1852,6 +1915,8 @@ func (sg *schemaGenContext) makeGenSchema() error { sg.GenSchema.IncludeModel = sg.IncludeModel sg.GenSchema.StrictAdditionalProperties = sg.StrictAdditionalProperties sg.GenSchema.Default = sg.Schema.Default + sg.GenSchema.StructTags = sg.StructTags + sg.GenSchema.ExtraImports = make(map[string]string) var err error returns, err := sg.shortCircuitNamedRef() @@ -1893,7 +1958,7 @@ func (sg *schemaGenContext) makeGenSchema() error { sg.GenSchema.HasDiscriminator = tpe.HasDiscriminator // include format validations, excluding binary - sg.GenSchema.HasValidations = sg.GenSchema.HasValidations || (tpe.IsCustomFormatter && !tpe.IsStream) || (tpe.IsArray && tpe.ElemType != nil && tpe.ElemType.IsCustomFormatter && !tpe.ElemType.IsStream) + sg.GenSchema.HasValidations = sg.GenSchema.HasValidations || hasFormatValidation(tpe) // usage of a polymorphic base type is rendered with getter funcs on private properties. // In the case of aliased types, the value expression remains unchanged to the receiver. @@ -1940,7 +2005,7 @@ func (sg *schemaGenContext) makeGenSchema() error { return err } - if err := sg.buildXMLName(); err != nil { + if err := sg.buildXMLNameWithTags(); err != nil { return err } @@ -1958,6 +2023,21 @@ func (sg *schemaGenContext) makeGenSchema() error { sg.buildMapOfNullable(nil) + // extra serializers & interfaces + + // generate MarshalBinary for: + // - tuple + // - struct + // - map + // - aliased primitive of a formatter type which is not a stringer + // + // but not for: + // - interface{} + // - io.Reader + gs := sg.GenSchema + sg.GenSchema.WantsMarshalBinary = !(gs.IsInterface || gs.IsStream || gs.IsBaseType) && + (gs.IsTuple || gs.IsComplexObject || gs.IsAdditionalProperties || (gs.IsPrimitive && gs.IsAliased && gs.IsCustomFormatter && !strings.Contains(gs.Zero(), `("`))) + debugLog("finished gen schema for %q", sg.Name) return nil } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/operation.go b/vendor/github.com/go-swagger/go-swagger/generator/operation.go index 48a3c6ef76..0beef7040b 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/operation.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/operation.go @@ -18,8 +18,6 @@ import ( "encoding/json" "errors" "fmt" - "os" - "path" "path/filepath" "sort" "strings" @@ -55,86 +53,58 @@ func sortedResponses(input map[int]spec.Response) responses { return res } -// GenerateServerOperation generates a parameter model, parameter validator, http handler implementations for a given operation +// GenerateServerOperation generates a parameter model, parameter validator, http handler implementations for a given operation. +// // It also generates an operation handler interface that uses the parameter model for handling a valid request. // Allows for specifying a list of tags to include only certain tags for the generation func GenerateServerOperation(operationNames []string, opts *GenOpts) error { - if opts == nil { - return errors.New("gen opts are required") - } - templates.LoadDefaults() - - templates.SetAllowOverride(opts.AllowTemplateOverride) - - if opts.TemplateDir != "" { - if err := templates.LoadDir(opts.TemplateDir); err != nil { - return err - } - } - if err := opts.CheckOpts(); err != nil { return err } - // Load the spec - _, specDoc, err := loadSpec(opts.Spec) - if err != nil { + if err := opts.setTemplates(); err != nil { return err } - // Validate and Expand. specDoc is in/out param. - specDoc, err = validateAndFlattenSpec(opts, specDoc) + specDoc, analyzed, err := opts.analyzeSpec() if err != nil { return err } - analyzed := analysis.New(specDoc.Spec()) - ops := gatherOperations(analyzed, operationNames) + if len(ops) == 0 { return errors.New("no operations were selected") } for operationName, opRef := range ops { method, path, operation := opRef.Method, opRef.Path, opRef.Op - defaultScheme := opts.DefaultScheme - if defaultScheme == "" { - defaultScheme = sHTTP - } - defaultProduces := opts.DefaultProduces - if defaultProduces == "" { - defaultProduces = runtime.JSONMime - } - defaultConsumes := opts.DefaultConsumes - if defaultConsumes == "" { - defaultConsumes = runtime.JSONMime - } - serverPackage := opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server") + serverPackage := opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, defaultServerTarget) generator := operationGenerator{ Name: operationName, Method: method, Path: path, BasePath: specDoc.BasePath(), - APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api"), - ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"), - ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), + APIPackage: opts.LanguageOpts.ManglePackagePath(opts.APIPackage, defaultOperationsTarget), + ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, defaultModelsTarget), + ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, defaultClientTarget), ServerPackage: serverPackage, Operation: *operation, SecurityRequirements: analyzed.SecurityRequirementsFor(operation), SecurityDefinitions: analyzed.SecurityDefinitionsFor(operation), - Principal: opts.Principal, + Principal: opts.PrincipalAlias(), Target: filepath.Join(opts.Target, filepath.FromSlash(serverPackage)), Base: opts.Target, Tags: opts.Tags, IncludeHandler: opts.IncludeHandler, IncludeParameters: opts.IncludeParameters, IncludeResponses: opts.IncludeResponses, - IncludeValidator: true, // we no more support the CLI option to disable validation + IncludeValidator: opts.IncludeValidator, DumpData: opts.DumpData, - DefaultScheme: defaultScheme, - DefaultProduces: defaultProduces, - DefaultConsumes: defaultConsumes, + DefaultScheme: opts.DefaultScheme, + DefaultProduces: opts.DefaultProduces, + DefaultConsumes: opts.DefaultConsumes, Doc: specDoc, Analyzed: analyzed, GenOpts: opts, @@ -177,78 +147,55 @@ type operationGenerator struct { GenOpts *GenOpts } -func intersectTags(left, right []string) (filtered []string) { - if len(right) == 0 { - filtered = left - return - } - for _, l := range left { - if containsString(right, l) { - filtered = append(filtered, l) - } - } - return -} - +// Generate a single operation func (o *operationGenerator) Generate() error { - // Build a list of codegen operations based on the tags, - // the tag decides the actual package for an operation - // the user specified package serves as root for generating the directory structure - var operations GenOperations - authed := len(o.SecurityRequirements) > 0 - - var bldr codeGenOpBuilder - bldr.Name = o.Name - bldr.Method = o.Method - bldr.Path = o.Path - bldr.BasePath = o.BasePath - bldr.ModelsPackage = o.ModelsPackage - bldr.Principal = o.Principal - bldr.Target = o.Target - bldr.Operation = o.Operation - bldr.Authed = authed - bldr.Security = o.SecurityRequirements - bldr.SecurityDefinitions = o.SecurityDefinitions - bldr.Doc = o.Doc - bldr.Analyzed = o.Analyzed - bldr.DefaultScheme = o.DefaultScheme - bldr.DefaultProduces = o.DefaultProduces - bldr.RootAPIPackage = o.GenOpts.LanguageOpts.ManglePackageName(o.ServerPackage, "server") - bldr.GenOpts = o.GenOpts - bldr.DefaultConsumes = o.DefaultConsumes - bldr.IncludeValidator = o.IncludeValidator - - bldr.DefaultImports = []string{o.GenOpts.ExistingModels} - if o.GenOpts.ExistingModels == "" { - bldr.DefaultImports = []string{ - path.Join( - filepath.ToSlash(o.GenOpts.LanguageOpts.baseImport(o.Base)), - o.GenOpts.LanguageOpts.ManglePackagePath(o.ModelsPackage, "")), - } - } - bldr.APIPackage = o.APIPackage - st := o.Tags - if o.GenOpts != nil { - st = o.GenOpts.Tags - } - intersected := intersectTags(o.Operation.Tags, st) - if len(intersected) > 0 { - tag := intersected[0] - bldr.APIPackage = o.GenOpts.LanguageOpts.ManglePackagePath(tag, o.APIPackage) + defaultImports := o.GenOpts.defaultImports() + + apiPackage := o.GenOpts.LanguageOpts.ManglePackagePath(o.GenOpts.APIPackage, defaultOperationsTarget) + imports := o.GenOpts.initImports( + filepath.Join(o.GenOpts.LanguageOpts.ManglePackagePath(o.GenOpts.ServerPackage, defaultServerTarget), apiPackage)) + + bldr := codeGenOpBuilder{ + ModelsPackage: o.ModelsPackage, + Principal: o.GenOpts.PrincipalAlias(), + Target: o.Target, + DefaultImports: defaultImports, + Imports: imports, + DefaultScheme: o.DefaultScheme, + Doc: o.Doc, + Analyzed: o.Analyzed, + BasePath: o.BasePath, + GenOpts: o.GenOpts, + Name: o.Name, + Operation: o.Operation, + Method: o.Method, + Path: o.Path, + IncludeValidator: o.IncludeValidator, + APIPackage: o.APIPackage, // defaults to main operations package + DefaultProduces: o.DefaultProduces, + DefaultConsumes: o.DefaultConsumes, + Authed: len(o.Analyzed.SecurityRequirementsFor(&o.Operation)) > 0, + Security: o.Analyzed.SecurityRequirementsFor(&o.Operation), + SecurityDefinitions: o.Analyzed.SecurityDefinitionsFor(&o.Operation), + RootAPIPackage: o.GenOpts.LanguageOpts.ManglePackageName(o.ServerPackage, defaultServerTarget), } + + _, tags, _ := bldr.analyzeTags() + op, err := bldr.MakeOperation() if err != nil { return err } - op.Tags = intersected + + op.Tags = tags + operations := make(GenOperations, 0, 1) operations = append(operations, op) sort.Sort(operations) for _, op := range operations { if o.GenOpts.DumpData { - bb, _ := json.MarshalIndent(swag.ToDynamicJSON(op), "", " ") - fmt.Fprintln(os.Stdout, string(bb)) + _ = dumpData(swag.ToDynamicJSON(op)) continue } if err := o.GenOpts.renderOperation(&op); err != nil { @@ -268,14 +215,16 @@ type codeGenOpBuilder struct { Path string BasePath string APIPackage string + APIPackageAlias string RootAPIPackage string ModelsPackage string Principal string Target string Operation spec.Operation Doc *loads.Document + PristineDoc *loads.Document Analyzed *analysis.Spec - DefaultImports []string + DefaultImports map[string]string Imports map[string]string DefaultScheme string DefaultProduces string @@ -286,16 +235,57 @@ type codeGenOpBuilder struct { GenOpts *GenOpts } +// paramMappings yields a map of safe parameter names for an operation +func paramMappings(params map[string]spec.Parameter) (map[string]map[string]string, string) { + idMapping := map[string]map[string]string{ + "query": make(map[string]string, len(params)), + "path": make(map[string]string, len(params)), + "formData": make(map[string]string, len(params)), + "header": make(map[string]string, len(params)), + "body": make(map[string]string, len(params)), + } + + // In order to avoid unstable generation, adopt same naming convention + // for all parameters with same name across locations. + seenIds := make(map[string]interface{}, len(params)) + for id, p := range params { + if val, ok := seenIds[p.Name]; ok { + previous := val.(struct{ id, in string }) + idMapping[p.In][p.Name] = swag.ToGoName(id) + // rewrite the previously found one + idMapping[previous.in][p.Name] = swag.ToGoName(previous.id) + } else { + idMapping[p.In][p.Name] = swag.ToGoName(p.Name) + } + seenIds[strings.ToLower(idMapping[p.In][p.Name])] = struct{ id, in string }{id: id, in: p.In} + } + + // pick a deconflicted private name for timeout for this operation + timeoutName := renameTimeout(seenIds, "timeout") + + return idMapping, timeoutName +} + // renameTimeout renames the variable in use by client template to avoid conflicting // with param names. -func renameTimeout(seenIds map[string][]string, current string) string { +// +// NOTE: this merely protects the timeout field in the client parameter struct, +// fields "Context" and "HTTPClient" remain exposed to name conflicts. +func renameTimeout(seenIds map[string]interface{}, timeoutName string) string { + if seenIds == nil { + return timeoutName + } + current := strings.ToLower(timeoutName) + if _, ok := seenIds[current]; !ok { + return timeoutName + } var next string - switch strings.ToLower(current) { + switch current { case "timeout": next = "requestTimeout" case "requesttimeout": next = "httpRequestTimeout" - case "httptrequesttimeout": + case "httprequesttimeout": next = "swaggerTimeout" case "swaggertimeout": next = "operationTimeout" @@ -303,11 +293,10 @@ func renameTimeout(seenIds map[string][]string, current string) string { next = "opTimeout" case "optimeout": next = "operTimeout" + default: + next = timeoutName + "1" } - if _, ok := seenIds[next]; ok { - return renameTimeout(seenIds, next) - } - return next + return renameTimeout(seenIds, next) } func (b *codeGenOpBuilder) MakeOperation() (GenOperation, error) { @@ -323,35 +312,15 @@ func (b *codeGenOpBuilder) MakeOperation() (GenOperation, error) { // // In all cases, resetting definitions to the _original_ (untransformed) spec is not an option: // we take from there the spec possibly already transformed by the GenDefinitions stage. - resolver := newTypeResolver(b.GenOpts.LanguageOpts.ManglePackageName(b.ModelsPackage, "models"), b.Doc) + resolver := newTypeResolver(b.GenOpts.LanguageOpts.ManglePackageName(b.ModelsPackage, defaultModelsTarget), b.Doc) receiver := "o" operation := b.Operation var params, qp, pp, hp, fp GenParameters var hasQueryParams, hasPathParams, hasHeaderParams, hasFormParams, hasFileParams, hasFormValueParams, hasBodyParams bool paramsForOperation := b.Analyzed.ParamsFor(b.Method, b.Path) - timeoutName := "timeout" - idMapping := map[string]map[string]string{ - "query": make(map[string]string, len(paramsForOperation)), - "path": make(map[string]string, len(paramsForOperation)), - "formData": make(map[string]string, len(paramsForOperation)), - "header": make(map[string]string, len(paramsForOperation)), - "body": make(map[string]string, len(paramsForOperation)), - } - - seenIds := make(map[string][]string, len(paramsForOperation)) - for id, p := range paramsForOperation { - if _, ok := seenIds[p.Name]; ok { - idMapping[p.In][p.Name] = swag.ToGoName(id) - } else { - idMapping[p.In][p.Name] = swag.ToGoName(p.Name) - } - seenIds[p.Name] = append(seenIds[p.Name], p.In) - if strings.EqualFold(p.Name, timeoutName) { - timeoutName = renameTimeout(seenIds, timeoutName) - } - } + idMapping, timeoutName := paramMappings(paramsForOperation) for _, p := range paramsForOperation { cp, err := b.MakeParameter(receiver, resolver, p, idMapping) @@ -489,15 +458,17 @@ func (b *codeGenOpBuilder) MakeOperation() (GenOperation, error) { return GenOperation{ GenCommon: GenCommon{ Copyright: b.GenOpts.Copyright, - TargetImportPath: filepath.ToSlash(b.GenOpts.LanguageOpts.baseImport(b.GenOpts.Target)), + TargetImportPath: b.GenOpts.LanguageOpts.baseImport(b.GenOpts.Target), }, - Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, "api"), + Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, defaultOperationsTarget), + PackageAlias: b.APIPackageAlias, RootPackage: b.RootAPIPackage, Name: b.Name, Method: b.Method, Path: b.Path, BasePath: b.BasePath, Tags: operation.Tags, + UseTags: len(operation.Tags) > 0 && !b.GenOpts.SkipTagPackages, Description: trimBOM(operation.Description), ReceiverName: receiver, DefaultImports: b.DefaultImports, @@ -531,6 +502,7 @@ func (b *codeGenOpBuilder) MakeOperation() (GenOperation, error) { ExtraSchemes: extraSchemes, TimeoutName: timeoutName, Extensions: operation.Extensions, + StrictResponders: b.GenOpts.StrictResponders, }, nil } @@ -573,18 +545,20 @@ func (b *codeGenOpBuilder) MakeResponse(receiver, name string, isSuccess bool, r // assume minimal flattening has been carried on, so there is not $ref in response (but some may remain in response schema) res := GenResponse{ - Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, "api"), - ModelsPackage: b.ModelsPackage, - ReceiverName: receiver, - Name: name, - Description: trimBOM(resp.Description), - DefaultImports: b.DefaultImports, - Imports: b.Imports, - IsSuccess: isSuccess, - Code: code, - Method: b.Method, - Path: b.Path, - Extensions: resp.Extensions, + Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, defaultOperationsTarget), + ModelsPackage: b.ModelsPackage, + ReceiverName: receiver, + Name: name, + Description: trimBOM(resp.Description), + DefaultImports: b.DefaultImports, + Imports: b.Imports, + IsSuccess: isSuccess, + Code: code, + Method: b.Method, + Path: b.Path, + Extensions: resp.Extensions, + StrictResponders: b.GenOpts.StrictResponders, + OperationName: b.Name, } // prepare response headers @@ -615,7 +589,7 @@ func (b *codeGenOpBuilder) MakeHeader(receiver, name string, hdr spec.Header) (G res := GenHeader{ sharedValidations: sharedValidationsFromSimple(hdr.CommonValidations, true), // NOTE: Required is not defined by the Swagger schema for header. Set arbitrarily to true for convenience in templates. resolvedType: tpe, - Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, "api"), + Package: b.GenOpts.LanguageOpts.ManglePackageName(b.APIPackage, defaultOperationsTarget), ReceiverName: receiver, ID: id, Name: name, @@ -662,6 +636,7 @@ func (b *codeGenOpBuilder) MakeHeaderItem(receiver, paramName, indexVar, path, v res.Formatter = stringFormatters[res.GoType] res.IndexVar = indexVar res.HasValidations, res.HasSliceValidations = b.HasValidations(items.CommonValidations, res.resolvedType) + res.IsEnumCI = b.GenOpts.AllowEnumCI || hasEnumCI(items.Extensions) if items.Items != nil { // Recursively follows nested arrays @@ -684,7 +659,7 @@ func (b *codeGenOpBuilder) HasValidations(sh spec.CommonValidations, rt resolved hasNumberValidation := sh.Maximum != nil || sh.Minimum != nil || sh.MultipleOf != nil hasStringValidation := sh.MaxLength != nil || sh.MinLength != nil || sh.Pattern != "" hasSliceValidations = sh.MaxItems != nil || sh.MinItems != nil || sh.UniqueItems || len(sh.Enum) > 0 - hasValidations = (hasNumberValidation || hasStringValidation || hasSliceValidations || rt.IsCustomFormatter) && !rt.IsStream && !rt.IsInterface + hasValidations = hasNumberValidation || hasStringValidation || hasSliceValidations || hasFormatValidation(rt) return } @@ -703,6 +678,8 @@ func (b *codeGenOpBuilder) MakeParameterItem(receiver, paramName, indexVar, path res.IndexVar = indexVar res.HasValidations, res.HasSliceValidations = b.HasValidations(items.CommonValidations, res.resolvedType) + res.IsEnumCI = b.GenOpts.AllowEnumCI || hasEnumCI(items.Extensions) + res.NeedsIndex = res.HasValidations || res.Converter != "" || (res.IsCustomFormatter && !res.SkipParse) if items.Items != nil { // Recursively follows nested arrays @@ -715,6 +692,7 @@ func (b *codeGenOpBuilder) MakeParameterItem(receiver, paramName, indexVar, path pi.Parent = &res // Propagates HasValidations flag to outer Items definition res.HasValidations = res.HasValidations || pi.HasValidations + res.NeedsIndex = res.NeedsIndex || pi.NeedsIndex } return res, nil @@ -727,7 +705,13 @@ func (b *codeGenOpBuilder) MakeParameter(receiver string, resolver *typeResolver var child *GenItems id := swag.ToGoName(param.Name) - if len(idMapping) > 0 { + if goName, ok := param.Extensions["x-go-name"]; ok { + id, ok = goName.(string) + if !ok { + return GenParameter{}, fmt.Errorf(`%s %s, parameter %q: "x-go-name" field must be a string, not a %T`, + b.Method, b.Path, param.Name, goName) + } + } else if len(idMapping) > 0 { id = idMapping[param.In][param.Name] } @@ -776,6 +760,7 @@ func (b *codeGenOpBuilder) MakeParameter(receiver string, resolver *typeResolver res.IsNullable = !param.Required && !param.AllowEmptyValue res.HasValidations, res.HasSliceValidations = b.HasValidations(param.CommonValidations, res.resolvedType) res.HasValidations = res.HasValidations || hasChildValidations + res.IsEnumCI = b.GenOpts.AllowEnumCI || hasEnumCI(param.Extensions) } // Select codegen strategy for body param validation @@ -875,9 +860,10 @@ func (b *codeGenOpBuilder) MakeBodyParameterItemsAndMaps(res *GenParameter, it * next.IsAliased = true break } - if next.IsInterface || next.IsStream { + if next.IsInterface || next.IsStream || next.IsBase64 { next.HasValidations = false } + next.NeedsIndex = next.HasValidations || next.Converter != "" || (next.IsCustomFormatter && !next.SkipParse) prev = next next = new(GenItems) @@ -891,15 +877,17 @@ func (b *codeGenOpBuilder) MakeBodyParameterItemsAndMaps(res *GenParameter, it * } } // propagate HasValidations - var propag func(child *GenItems) bool - propag = func(child *GenItems) bool { + var propag func(child *GenItems) (bool, bool) + propag = func(child *GenItems) (bool, bool) { if child == nil { - return false + return false, false } - child.HasValidations = child.HasValidations || propag(child.Child) - return child.HasValidations + cValidations, cIndex := propag(child.Child) + child.HasValidations = child.HasValidations || cValidations + child.NeedsIndex = child.HasValidations || child.Converter != "" || (child.IsCustomFormatter && !child.SkipParse) || cIndex + return child.HasValidations, child.NeedsIndex } - items.HasValidations = propag(items) + items.HasValidations, items.NeedsIndex = propag(items) // resolve nullability conflicts when declaring body as a map of array of an anonymous complex object // (e.g. refer to an extra schema type, which is nullable, but not rendered as a pointer in arrays or maps) @@ -938,7 +926,7 @@ func (b *codeGenOpBuilder) setBodyParamValidation(p *GenParameter) { var hasSimpleBodyParams, hasSimpleBodyItems, hasSimpleBodyMap, hasModelBodyParams, hasModelBodyItems, hasModelBodyMap bool s := p.Schema if s != nil { - doNot := s.IsInterface || s.IsStream + doNot := s.IsInterface || s.IsStream || s.IsBase64 // composition of primitive fields must be properly identified: hack this through _, isPrimitive := primitives[s.GoType] _, isFormatter := customFormatters[s.GoType] @@ -949,7 +937,7 @@ func (b *codeGenOpBuilder) setBodyParamValidation(p *GenParameter) { if s.IsArray && s.Items != nil { it := s.Items - doNot = it.IsInterface || it.IsStream + doNot = it.IsInterface || it.IsStream || it.IsBase64 hasSimpleBodyItems = !it.IsComplexObject && !(it.IsAliased || doNot) hasModelBodyItems = (it.IsComplexObject || it.IsAliased) && !doNot } @@ -1015,7 +1003,10 @@ func (b *codeGenOpBuilder) cloneSchema(schema *spec.Schema) *spec.Schema { // This uses a deep clone the spec document to construct a type resolver which knows about definitions when the making of this operation started, // and only these definitions. We are not interested in the "original spec", but in the already transformed spec. func (b *codeGenOpBuilder) saveResolveContext(resolver *typeResolver, schema *spec.Schema) (*typeResolver, *spec.Schema) { - rslv := newTypeResolver(b.GenOpts.LanguageOpts.ManglePackageName(resolver.ModelsPackage, "models"), b.Doc.Pristine()) + if b.PristineDoc == nil { + b.PristineDoc = b.Doc.Pristine() + } + rslv := newTypeResolver(b.GenOpts.LanguageOpts.ManglePackageName(resolver.ModelsPackage, defaultModelsTarget), b.PristineDoc) return rslv, b.cloneSchema(schema) } @@ -1027,19 +1018,23 @@ func (b *codeGenOpBuilder) saveResolveContext(resolver *typeResolver, schema *sp // these ExtraSchemas in the operation's package. // We need to rebuild the schema with a new type resolver to reflect this change in the // models package. -func (b *codeGenOpBuilder) liftExtraSchemas(resolver, br *typeResolver, bs *spec.Schema, sc *schemaGenContext) (schema *GenSchema, err error) { +func (b *codeGenOpBuilder) liftExtraSchemas(resolver, rslv *typeResolver, bs *spec.Schema, sc *schemaGenContext) (schema *GenSchema, err error) { // restore resolving state before previous call to makeGenSchema() - rslv := br sc.Schema = *bs pg := sc.shallowClone() - pkg := b.GenOpts.LanguageOpts.ManglePackageName(resolver.ModelsPackage, "models") + pkg := b.GenOpts.LanguageOpts.ManglePackageName(resolver.ModelsPackage, defaultModelsTarget) + + // make a resolver for current package (i.e. operations) pg.TypeResolver = newTypeResolver("", rslv.Doc).withKeepDefinitionsPackage(pkg) pg.ExtraSchemas = make(map[string]GenSchema, len(sc.ExtraSchemas)) + pg.UseContainerInName = true + // rebuild schema within local package if err = pg.makeGenSchema(); err != nil { return } + // lift nested extra schemas (inlined types) if b.ExtraSchemas == nil { b.ExtraSchemas = make(map[string]GenSchema, len(pg.ExtraSchemas)) @@ -1079,17 +1074,20 @@ func (b *codeGenOpBuilder) buildOperationSchema(schemaPath, containerName, schem TypeResolver: rslv, Named: false, IncludeModel: true, - IncludeValidator: true, + IncludeValidator: b.GenOpts.IncludeValidator, StrictAdditionalProperties: b.GenOpts.StrictAdditionalProperties, ExtraSchemas: make(map[string]GenSchema), + StructTags: b.GenOpts.StructTags, } var ( br *typeResolver bs *spec.Schema ) - // these backups are not needed when sch has name. + if sch.Ref.String() == "" { + // backup the type resolver context + // (not needed when the schema has a name) br, bs = b.saveResolveContext(rslv, sch) } @@ -1148,3 +1146,119 @@ func (b *codeGenOpBuilder) buildOperationSchema(schemaPath, containerName, schem } return schema, nil } + +func intersectTags(left, right []string) []string { + // dedupe + uniqueTags := make(map[string]struct{}, maxInt(len(left), len(right))) + for _, l := range left { + if len(right) == 0 || swag.ContainsStrings(right, l) { + uniqueTags[l] = struct{}{} + } + } + filtered := make([]string, 0, len(uniqueTags)) + // stable output across generations, preserving original order + for _, k := range left { + if _, ok := uniqueTags[k]; !ok { + continue + } + filtered = append(filtered, k) + delete(uniqueTags, k) + } + return filtered +} + +// analyze tags for an operation +func (b *codeGenOpBuilder) analyzeTags() (string, []string, bool) { + var ( + filter []string + tag string + hasTagOverride bool + ) + if b.GenOpts != nil { + filter = b.GenOpts.Tags + } + intersected := intersectTags(pruneEmpty(b.Operation.Tags), filter) + if !b.GenOpts.SkipTagPackages && len(intersected) > 0 { + // override generation with: x-go-operation-tag + tag, hasTagOverride = b.Operation.Extensions.GetString(xGoOperationTag) + if !hasTagOverride { + // TODO(fred): this part should be delegated to some new TagsFor(operation) in go-openapi/analysis + tag = intersected[0] + gtags := b.Doc.Spec().Tags + for _, gtag := range gtags { + if gtag.Name != tag { + continue + } + // honor x-go-name in tag + if name, hasGoName := gtag.Extensions.GetString(xGoName); hasGoName { + tag = name + break + } + // honor x-go-operation-tag in tag + if name, hasOpName := gtag.Extensions.GetString(xGoOperationTag); hasOpName { + tag = name + break + } + } + } + } + if tag == b.APIPackage { + // confict with "operations" package is handled separately + tag = renameOperationPackage(intersected, tag) + } + b.APIPackage = b.GenOpts.LanguageOpts.ManglePackageName(tag, b.APIPackage) // actual package name + b.APIPackageAlias = deconflictTag(intersected, b.APIPackage) // deconflicted import alias + return tag, intersected, len(filter) == 0 || len(filter) > 0 && len(intersected) > 0 +} + +func maxInt(a, b int) int { + if a > b { + return a + } + return b +} + +// deconflictTag ensures generated packages for operations based on tags do not conflict +// with other imports +func deconflictTag(seenTags []string, pkg string) string { + return deconflictPkg(pkg, func(pkg string) string { return renameOperationPackage(seenTags, pkg) }) +} + +// deconflictPrincipal ensures that whenever an external principal package is added, it doesn't conflict +// with standard inports +func deconflictPrincipal(pkg string) string { + switch pkg { + case "principal": + return renamePrincipalPackage(pkg) + default: + return deconflictPkg(pkg, renamePrincipalPackage) + } +} + +// deconflictPkg renames package names which conflict with standard imports +func deconflictPkg(pkg string, renamer func(string) string) string { + switch pkg { + case "api", "httptransport", "formats": + fallthrough + case "errors", "runtime", "middleware", "security", "spec", "strfmt", "loads", "swag", "validate": + fallthrough + case "tls", "http", "fmt", "strings", "log": + return renamer(pkg) + } + return pkg +} + +func renameOperationPackage(seenTags []string, pkg string) string { + current := strings.ToLower(pkg) + "ops" + if len(seenTags) == 0 { + return current + } + for swag.ContainsStringsCI(seenTags, current) { + current += "1" + } + return current +} + +func renamePrincipalPackage(pkg string) string { + return "auth" +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/shared.go b/vendor/github.com/go-swagger/go-swagger/generator/shared.go index fcbc45d13d..9321bf00f6 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/shared.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/shared.go @@ -16,6 +16,7 @@ package generator import ( "bytes" + "encoding/json" "errors" "fmt" "io/ioutil" @@ -24,360 +25,36 @@ import ( "path" "path/filepath" "reflect" - "regexp" "sort" "strings" "text/template" - "unicode" - - swaggererrors "github.com/go-openapi/errors" "github.com/go-openapi/analysis" "github.com/go-openapi/loads" + "github.com/go-openapi/runtime" "github.com/go-openapi/spec" - "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" - "github.com/go-openapi/validate" - "golang.org/x/tools/imports" ) //go:generate go-bindata -mode 420 -modtime 1482416923 -pkg=generator -ignore=.*\.sw? -ignore=.*\.md ./templates/... -// LanguageOpts to describe a language to the code generator -type LanguageOpts struct { - ReservedWords []string - BaseImportFunc func(string) string `json:"-"` - reservedWordsSet map[string]struct{} - initialized bool - formatFunc func(string, []byte) ([]byte, error) - fileNameFunc func(string) string -} - -// Init the language option -func (l *LanguageOpts) Init() { - if !l.initialized { - l.initialized = true - l.reservedWordsSet = make(map[string]struct{}) - for _, rw := range l.ReservedWords { - l.reservedWordsSet[rw] = struct{}{} - } - } -} - -// MangleName makes sure a reserved word gets a safe name -func (l *LanguageOpts) MangleName(name, suffix string) string { - if _, ok := l.reservedWordsSet[swag.ToFileName(name)]; !ok { - return name - } - return strings.Join([]string{name, suffix}, "_") -} - -// MangleVarName makes sure a reserved word gets a safe name -func (l *LanguageOpts) MangleVarName(name string) string { - nm := swag.ToVarName(name) - if _, ok := l.reservedWordsSet[nm]; !ok { - return nm - } - return nm + "Var" -} - -// MangleFileName makes sure a file name gets a safe name -func (l *LanguageOpts) MangleFileName(name string) string { - if l.fileNameFunc != nil { - return l.fileNameFunc(name) - } - return swag.ToFileName(name) -} - -// ManglePackageName makes sure a package gets a safe name. -// In case of a file system path (e.g. name contains "/" or "\" on Windows), this return only the last element. -func (l *LanguageOpts) ManglePackageName(name, suffix string) string { - if name == "" { - return suffix - } - pth := filepath.ToSlash(filepath.Clean(name)) // preserve path - _, pkg := path.Split(pth) // drop path - return l.MangleName(swag.ToFileName(pkg), suffix) -} - -// ManglePackagePath makes sure a full package path gets a safe name. -// Only the last part of the path is altered. -func (l *LanguageOpts) ManglePackagePath(name string, suffix string) string { - if name == "" { - return suffix - } - target := filepath.ToSlash(filepath.Clean(name)) // preserve path - parts := strings.Split(target, "/") - parts[len(parts)-1] = l.ManglePackageName(parts[len(parts)-1], suffix) - return strings.Join(parts, "/") -} - -// FormatContent formats a file with a language specific formatter -func (l *LanguageOpts) FormatContent(name string, content []byte) ([]byte, error) { - if l.formatFunc != nil { - return l.formatFunc(name, content) - } - return content, nil -} - -func (l *LanguageOpts) baseImport(tgt string) string { - if l.BaseImportFunc != nil { - return l.BaseImportFunc(tgt) - } - return "" -} - -var golang = GoLangOpts() - -// GoLangOpts for rendering items as golang code -func GoLangOpts() *LanguageOpts { - var goOtherReservedSuffixes = map[string]bool{ - // see: - // https://golang.org/src/go/build/syslist.go - // https://golang.org/doc/install/source#environment - - // goos - "android": true, - "darwin": true, - "dragonfly": true, - "freebsd": true, - "js": true, - "linux": true, - "nacl": true, - "netbsd": true, - "openbsd": true, - "plan9": true, - "solaris": true, - "windows": true, - "zos": true, - - // arch - "386": true, - "amd64": true, - "amd64p32": true, - "arm": true, - "armbe": true, - "arm64": true, - "arm64be": true, - "mips": true, - "mipsle": true, - "mips64": true, - "mips64le": true, - "mips64p32": true, - "mips64p32le": true, - "ppc": true, - "ppc64": true, - "ppc64le": true, - "riscv": true, - "riscv64": true, - "s390": true, - "s390x": true, - "sparc": true, - "sparc64": true, - "wasm": true, - - // other reserved suffixes - "test": true, - } - - opts := new(LanguageOpts) - opts.ReservedWords = []string{ - "break", "default", "func", "interface", "select", - "case", "defer", "go", "map", "struct", - "chan", "else", "goto", "package", "switch", - "const", "fallthrough", "if", "range", "type", - "continue", "for", "import", "return", "var", - } - opts.formatFunc = func(ffn string, content []byte) ([]byte, error) { - opts := new(imports.Options) - opts.TabIndent = true - opts.TabWidth = 2 - opts.Fragment = true - opts.Comments = true - return imports.Process(ffn, content, opts) - } - opts.fileNameFunc = func(name string) string { - // whenever a generated file name ends with a suffix - // that is meaningful to go build, adds a "swagger" - // suffix - parts := strings.Split(swag.ToFileName(name), "_") - if goOtherReservedSuffixes[parts[len(parts)-1]] { - // file name ending with a reserved arch or os name - // are appended an innocuous suffix "swagger" - parts = append(parts, "swagger") - } - return strings.Join(parts, "_") - } - - opts.BaseImportFunc = func(tgt string) string { - tgt = filepath.Clean(tgt) - // On Windows, filepath.Abs("") behaves differently than on Unix. - // Windows: yields an error, since Abs() does not know the volume. - // UNIX: returns current working directory - if tgt == "" { - tgt = "." - } - tgtAbsPath, err := filepath.Abs(tgt) - if err != nil { - log.Fatalf("could not evaluate base import path with target \"%s\": %v", tgt, err) - } - - var tgtAbsPathExtended string - tgtAbsPathExtended, err = filepath.EvalSymlinks(tgtAbsPath) - if err != nil { - log.Fatalf("could not evaluate base import path with target \"%s\" (with symlink resolution): %v", tgtAbsPath, err) - } - - gopath := os.Getenv("GOPATH") - if gopath == "" { - gopath = filepath.Join(os.Getenv("HOME"), "go") - } - - var pth string - for _, gp := range filepath.SplitList(gopath) { - // EvalSymLinks also calls the Clean - gopathExtended, er := filepath.EvalSymlinks(gp) - if er != nil { - log.Fatalln(er) - } - gopathExtended = filepath.Join(gopathExtended, "src") - gp = filepath.Join(gp, "src") - - // At this stage we have expanded and unexpanded target path. GOPATH is fully expanded. - // Expanded means symlink free. - // We compare both types of targetpath<s> with gopath. - // If any one of them coincides with gopath , it is imperative that - // target path lies inside gopath. How? - // - Case 1: Irrespective of symlinks paths coincide. Both non-expanded paths. - // - Case 2: Symlink in target path points to location inside GOPATH. (Expanded Target Path) - // - Case 3: Symlink in target path points to directory outside GOPATH (Unexpanded target path) - - // Case 1: - Do nothing case. If non-expanded paths match just generate base import path as if - // there are no symlinks. - - // Case 2: - Symlink in target path points to location inside GOPATH. (Expanded Target Path) - // First if will fail. Second if will succeed. - - // Case 3: - Symlink in target path points to directory outside GOPATH (Unexpanded target path) - // First if will succeed and break. - - //compares non expanded path for both - if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPath, gp); ok { - pth = relativepath - break - } - - // Compares non-expanded target path - if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPath, gopathExtended); ok { - pth = relativepath - break - } - - // Compares expanded target path. - if ok, relativepath := checkPrefixAndFetchRelativePath(tgtAbsPathExtended, gopathExtended); ok { - pth = relativepath - break - } - - } - - mod, goModuleAbsPath, err := tryResolveModule(tgtAbsPath) - switch { - case err != nil: - log.Fatalf("Failed to resolve module using go.mod file: %s", err) - case mod != "": - relTgt := relPathToRelGoPath(goModuleAbsPath, tgtAbsPath) - if !strings.HasSuffix(mod, relTgt) { - return mod + relTgt - } - return mod - } - - if pth == "" { - log.Fatalln("target must reside inside a location in the $GOPATH/src or be a module") - } - return pth - } - opts.Init() - return opts -} - -var moduleRe = regexp.MustCompile(`module[ \t]+([^\s]+)`) - -// resolveGoModFile walks up the directory tree starting from 'dir' until it -// finds a go.mod file. If go.mod is found it will return the related file -// object. If no go.mod file is found it will return an error. -func resolveGoModFile(dir string) (*os.File, string, error) { - goModPath := filepath.Join(dir, "go.mod") - f, err := os.Open(goModPath) - if err != nil { - if os.IsNotExist(err) && dir != filepath.Dir(dir) { - return resolveGoModFile(filepath.Dir(dir)) - } - return nil, "", err - } - return f, dir, nil -} - -// relPathToRelGoPath takes a relative os path and returns the relative go -// package path. For unix nothing will change but for windows \ will be -// converted to /. -func relPathToRelGoPath(modAbsPath, absPath string) string { - if absPath == "." { - return "" - } - - path := strings.TrimPrefix(absPath, modAbsPath) - pathItems := strings.Split(path, string(filepath.Separator)) - return strings.Join(pathItems, "/") -} - -func tryResolveModule(baseTargetPath string) (string, string, error) { - f, goModAbsPath, err := resolveGoModFile(baseTargetPath) - switch { - case os.IsNotExist(err): - return "", "", nil - case err != nil: - return "", "", err - } - - src, err := ioutil.ReadAll(f) - if err != nil { - return "", "", err - } - - match := moduleRe.FindSubmatch(src) - if len(match) != 2 { - return "", "", nil - } - - return string(match[1]), goModAbsPath, nil -} +const ( + // default generation targets structure + defaultModelsTarget = "models" + defaultServerTarget = "restapi" + defaultClientTarget = "client" + defaultOperationsTarget = "operations" + defaultClientName = "rest" + defaultServerName = "swagger" + defaultScheme = "http" +) -func findSwaggerSpec(nm string) (string, error) { - specs := []string{"swagger.json", "swagger.yml", "swagger.yaml"} - if nm != "" { - specs = []string{nm} - } - var name string - for _, nn := range specs { - f, err := os.Stat(nn) - if err != nil && !os.IsNotExist(err) { - return "", err - } - if err != nil && os.IsNotExist(err) { - continue - } - if f.IsDir() { - return "", fmt.Errorf("%s is a directory", nn) - } - name = nn - break - } - if name == "" { - return "", errors.New("couldn't find a swagger spec") - } - return name, nil +func init() { + // all initializations for the generator package + debugOptions() + initLanguage() + initTemplateRepo() + initTypes() } // DefaultSectionOpts for a given opts, this is used when no config file is passed @@ -411,14 +88,13 @@ func DefaultSectionOpts(gen *GenOpts) { FileName: "{{ (snakize (pascalize .Name)) }}_responses.go", }, } - } else { ops := []TemplateOpts{} if gen.IncludeParameters { ops = append(ops, TemplateOpts{ Name: "parameters", Source: "asset:serverParameter", - Target: "{{ if gt (len .Tags) 0 }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", + Target: "{{ if .UseTags }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", FileName: "{{ (snakize (pascalize .Name)) }}_parameters.go", }) } @@ -426,7 +102,7 @@ func DefaultSectionOpts(gen *GenOpts) { ops = append(ops, TemplateOpts{ Name: "urlbuilder", Source: "asset:serverUrlbuilder", - Target: "{{ if gt (len .Tags) 0 }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", + Target: "{{ if .UseTags }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", FileName: "{{ (snakize (pascalize .Name)) }}_urlbuilder.go", }) } @@ -434,7 +110,7 @@ func DefaultSectionOpts(gen *GenOpts) { ops = append(ops, TemplateOpts{ Name: "responses", Source: "asset:serverResponses", - Target: "{{ if gt (len .Tags) 0 }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", + Target: "{{ if .UseTags }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", FileName: "{{ (snakize (pascalize .Name)) }}_responses.go", }) } @@ -442,7 +118,7 @@ func DefaultSectionOpts(gen *GenOpts) { ops = append(ops, TemplateOpts{ Name: "handler", Source: "asset:serverOperation", - Target: "{{ if gt (len .Tags) 0 }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", + Target: "{{ if .UseTags }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .APIPackage) (toPackagePath .Package) }}{{ else }}{{ joinFilePath .Target (toPackagePath .ServerPackage) (toPackagePath .Package) }}{{ end }}", FileName: "{{ (snakize (pascalize .Name)) }}.go", }) } @@ -487,7 +163,7 @@ func DefaultSectionOpts(gen *GenOpts) { { Name: "main", Source: "asset:serverMain", - Target: "{{ joinFilePath .Target \"cmd\" (dasherize (pascalize .Name)) }}-server", + Target: "{{ joinFilePath .Target \"cmd\" .MainPackage }}", FileName: "main.go", }, { @@ -521,7 +197,7 @@ func DefaultSectionOpts(gen *GenOpts) { } -// TemplateOpts allows +// TemplateOpts allows for codegen customization type TemplateOpts struct { Name string `mapstructure:"name"` Source string `mapstructure:"source"` @@ -573,37 +249,58 @@ type GenOpts struct { DefaultScheme string DefaultProduces string DefaultConsumes string + WithXML bool TemplateDir string Template string RegenerateConfigureAPI bool Operations []string Models []string Tags []string + StructTags []string Name string FlagStrategy string CompatibilityMode string ExistingModels string Copyright string + SkipTagPackages bool + MainPackage string + IgnoreOperations bool + AllowEnumCI bool + StrictResponders bool + AcceptDefinitionsOnly bool } // CheckOpts carries out some global consistency checks on options. -// -// At the moment, these checks simply protect TargetPath() and SpecPath() -// functions. More checks may be added here. func (g *GenOpts) CheckOpts() error { + if g == nil { + return errors.New("gen opts are required") + } + if !filepath.IsAbs(g.Target) { if _, err := filepath.Abs(g.Target); err != nil { return fmt.Errorf("could not locate target %s: %v", g.Target, err) } } + if filepath.IsAbs(g.ServerPackage) { return fmt.Errorf("you shouldn't specify an absolute path in --server-package: %s", g.ServerPackage) } - if !filepath.IsAbs(g.Spec) && !strings.HasPrefix(g.Spec, "http://") && !strings.HasPrefix(g.Spec, "https://") { - if _, err := filepath.Abs(g.Spec); err != nil { - return fmt.Errorf("could not locate spec: %s", g.Spec) - } + + if strings.HasPrefix(g.Spec, "http://") || strings.HasPrefix(g.Spec, "https://") { + return nil + } + + pth, err := findSwaggerSpec(g.Spec) + if err != nil { + return err } + + // ensure spec path is absolute + g.Spec, err = filepath.Abs(pth) + if err != nil { + return fmt.Errorf("could not locate spec: %s", g.Spec) + } + return nil } @@ -670,17 +367,42 @@ func (g *GenOpts) EnsureDefaults() error { if g.defaultsEnsured { return nil } - DefaultSectionOpts(g) + if g.LanguageOpts == nil { - g.LanguageOpts = GoLangOpts() + g.LanguageOpts = DefaultLanguageFunc() } + + DefaultSectionOpts(g) + // set defaults for flattening options - g.FlattenOpts = &analysis.FlattenOpts{ - Minimal: true, - Verbose: true, - RemoveUnused: false, - Expand: false, + if g.FlattenOpts == nil { + g.FlattenOpts = &analysis.FlattenOpts{ + Minimal: true, + Verbose: true, + RemoveUnused: false, + Expand: false, + } + } + + if g.DefaultScheme == "" { + g.DefaultScheme = defaultScheme } + + if g.DefaultConsumes == "" { + g.DefaultConsumes = runtime.JSONMime + } + + if g.DefaultProduces == "" { + g.DefaultProduces = runtime.JSONMime + } + + // always include validator with models + g.IncludeValidator = true + + if g.Principal == "" { + g.Principal = iface + } + g.defaultsEnsured = true return nil } @@ -707,19 +429,29 @@ func (g *GenOpts) location(t *TemplateOpts, data interface{}) (string, string, e tags = tagsF.Interface().([]string) } - pthTpl, err := template.New(t.Name + "-target").Funcs(FuncMap).Parse(t.Target) + var useTags bool + useTagsF := v.FieldByName("UseTags") + if useTagsF.IsValid() { + useTags = useTagsF.Interface().(bool) + } + + funcMap := FuncMapFunc(g.LanguageOpts) + + pthTpl, err := template.New(t.Name + "-target").Funcs(funcMap).Parse(t.Target) if err != nil { return "", "", err } - fNameTpl, err := template.New(t.Name + "-filename").Funcs(FuncMap).Parse(t.FileName) + fNameTpl, err := template.New(t.Name + "-filename").Funcs(funcMap).Parse(t.FileName) if err != nil { return "", "", err } d := struct { - Name, Package, APIPackage, ServerPackage, ClientPackage, ModelPackage, Target string - Tags []string + Name, Package, APIPackage, ServerPackage, ClientPackage, ModelPackage, MainPackage, Target string + Tags []string + UseTags bool + Context interface{} }{ Name: name, Package: pkg, @@ -727,11 +459,13 @@ func (g *GenOpts) location(t *TemplateOpts, data interface{}) (string, string, e ServerPackage: g.ServerPackage, ClientPackage: g.ClientPackage, ModelPackage: g.ModelPackage, + MainPackage: g.MainPackage, Target: g.Target, Tags: tags, + UseTags: useTags, + Context: data, } - // pretty.Println(data) var pthBuf bytes.Buffer if e := pthTpl.Execute(&pthBuf, d); e != nil { return "", "", e @@ -777,7 +511,7 @@ func (g *GenOpts) render(t *TemplateOpts, data interface{}) ([]byte, error) { if err != nil { return nil, fmt.Errorf("error while opening %s template file: %v", templateFile, err) } - tt, err := template.New(t.Source).Funcs(FuncMap).Parse(string(content)) + tt, err := template.New(t.Source).Funcs(FuncMapFunc(g.LanguageOpts)).Parse(string(content)) if err != nil { return nil, fmt.Errorf("template parsing failed on template %s: %v", t.Name, err) } @@ -836,10 +570,10 @@ func (g *GenOpts) write(t *TemplateOpts, data interface{}) error { var writeerr error if !t.SkipFormat { - formatted, err = g.LanguageOpts.FormatContent(fname, content) + formatted, err = g.LanguageOpts.FormatContent(filepath.Join(dir, fname), content) if err != nil { log.Printf("source formatting failed on template-generated source (%q for %s). Check that your template produces valid code", filepath.Join(dir, fname), t.Name) - writeerr = ioutil.WriteFile(filepath.Join(dir, fname), content, 0644) + writeerr = ioutil.WriteFile(filepath.Join(dir, fname), content, 0644) // #nosec if writeerr != nil { return fmt.Errorf("failed to write (unformatted) file %q in %q: %v", fname, dir, writeerr) } @@ -848,7 +582,7 @@ func (g *GenOpts) write(t *TemplateOpts, data interface{}) error { } } - writeerr = ioutil.WriteFile(filepath.Join(dir, fname), formatted, 0644) + writeerr = ioutil.WriteFile(filepath.Join(dir, fname), formatted, 0644) // #nosec if writeerr != nil { return fmt.Errorf("failed to write file %q in %q: %v", fname, dir, writeerr) } @@ -930,42 +664,84 @@ func (g *GenOpts) renderDefinition(gg *GenDefinition) error { return nil } -func validateSpec(path string, doc *loads.Document) (err error) { - if doc == nil { - if path, doc, err = loadSpec(path); err != nil { +func (g *GenOpts) setTemplates() error { + templates.LoadDefaults() + + if g.Template != "" { + // set contrib templates + if err := templates.LoadContrib(g.Template); err != nil { return err } } - result := validate.Spec(doc, strfmt.Default) - if result == nil { - return nil - } + templates.SetAllowOverride(g.AllowTemplateOverride) - str := fmt.Sprintf("The swagger spec at %q is invalid against swagger specification %s. see errors :\n", path, doc.Version()) - for _, desc := range result.(*swaggererrors.CompositeError).Errors { - str += fmt.Sprintf("- %s\n", desc) + if g.TemplateDir != "" { + // set custom templates + if err := templates.LoadDir(g.TemplateDir); err != nil { + return err + } } - return errors.New(str) + return nil } -func loadSpec(specFile string) (string, *loads.Document, error) { - // find swagger spec document, verify it exists - specPath := specFile - var err error - if !strings.HasPrefix(specPath, "http") { - specPath, err = findSwaggerSpec(specFile) - if err != nil { - return "", nil, err +// defaultImports produces a default map for imports with models +func (g *GenOpts) defaultImports() map[string]string { + baseImport := g.LanguageOpts.baseImport(g.Target) + defaultImports := make(map[string]string, 50) + + if g.ExistingModels == "" { + // generated models + importPath := path.Join( + baseImport, + g.LanguageOpts.ManglePackagePath(g.ModelPackage, defaultModelsTarget)) + defaultImports[g.LanguageOpts.ManglePackageName(g.ModelPackage, defaultModelsTarget)] = importPath + } else { + // external models + importPath := g.LanguageOpts.ManglePackagePath(g.ExistingModels, "") + defaultImports["models"] = importPath + } + + alias, _, target := g.resolvePrincipal() + if alias != "" { + if pth, _ := path.Split(target); pth != "" { + // if principal is specified with an path, generate this import + defaultImports[alias] = target + } else { + // if principal is specified with a relative path, assume it is located in generated target + defaultImports[alias] = path.Join(baseImport, target) } } + return defaultImports +} - // load swagger spec - specDoc, err := loads.Spec(specPath) - if err != nil { - return "", nil, err +// initImports produces a default map for import with the specified root for operations +func (g *GenOpts) initImports(operationsPackage string) map[string]string { + baseImport := g.LanguageOpts.baseImport(g.Target) + + imports := make(map[string]string, 50) + imports[g.LanguageOpts.ManglePackageName(operationsPackage, defaultOperationsTarget)] = path.Join( + baseImport, + g.LanguageOpts.ManglePackagePath(operationsPackage, defaultOperationsTarget)) + return imports +} + +// PrincipalAlias returns an aliased type to the principal +func (g *GenOpts) PrincipalAlias() string { + _, principal, _ := g.resolvePrincipal() + return principal +} + +func (g *GenOpts) resolvePrincipal() (string, string, string) { + dotLocation := strings.LastIndex(g.Principal, ".") + if dotLocation < 0 { + return "", g.Principal, "" } - return specPath, specDoc, nil + + // handle possible conflicts with injected principal package + // NOTE(fred): we do not check here for conflicts with packages created from operation tags, only standard imports + alias := deconflictPrincipal(importAlias(g.Principal[:dotLocation])) + return alias, alias + g.Principal[dotLocation:], g.Principal[:dotLocation] } func fileExists(target, name string) bool { @@ -974,6 +750,7 @@ func fileExists(target, name string) bool { } func gatherModels(specDoc *loads.Document, modelNames []string) (map[string]spec.Schema, error) { + modelNames = pruneEmpty(modelNames) models, mnc := make(map[string]spec.Schema), len(modelNames) defs := specDoc.Spec().Definitions @@ -1002,7 +779,8 @@ func gatherModels(specDoc *loads.Document, modelNames []string) (map[string]spec return models, nil } -func appNameOrDefault(specDoc *loads.Document, name, defaultName string) string { +// titleOrDefault infers a name for the app from the title of the spec +func titleOrDefault(specDoc *loads.Document, name, defaultName string) string { if strings.TrimSpace(name) == "" { if specDoc.Spec().Info != nil && strings.TrimSpace(specDoc.Spec().Info.Title) != "" { name = specDoc.Spec().Info.Title @@ -1010,16 +788,21 @@ func appNameOrDefault(specDoc *loads.Document, name, defaultName string) string name = defaultName } } - return strings.TrimSuffix(strings.TrimSuffix(strings.TrimSuffix(swag.ToGoName(name), "Test"), "API"), "Test") + return swag.ToGoName(name) } -func containsString(names []string, name string) bool { - for _, nm := range names { - if nm == name { - return true - } +func mainNameOrDefault(specDoc *loads.Document, name, defaultName string) string { + // *_test won't do as main server name + return strings.TrimSuffix(titleOrDefault(specDoc, name, defaultName), "Test") +} + +func appNameOrDefault(specDoc *loads.Document, name, defaultName string) string { + // *_test won't do as app names + name = strings.TrimSuffix(titleOrDefault(specDoc, name, defaultName), "Test") + if name == "" { + name = swag.ToGoName(defaultName) } - return false + return name } type opRef struct { @@ -1037,14 +820,14 @@ func (o opRefs) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o opRefs) Less(i, j int) bool { return o[i].Key < o[j].Key } func gatherOperations(specDoc *analysis.Spec, operationIDs []string) map[string]opRef { + operationIDs = pruneEmpty(operationIDs) var oprefs opRefs for method, pathItem := range specDoc.Operations() { for path, operation := range pathItem { - // nm := ensureUniqueName(operation.ID, method, path, operations) vv := *operation oprefs = append(oprefs, opRef{ - Key: swag.ToGoName(strings.ToLower(method) + " " + path), + Key: swag.ToGoName(strings.ToLower(method) + " " + strings.Title(path)), Method: method, Path: path, ID: vv.ID, @@ -1066,7 +849,7 @@ func gatherOperations(specDoc *analysis.Spec, operationIDs []string) map[string] if found && oo.Method != opr.Method && oo.Path != opr.Path { nm = opr.Key } - if len(operationIDs) == 0 || containsString(operationIDs, opr.ID) || containsString(operationIDs, nm) { + if len(operationIDs) == 0 || swag.ContainsStrings(operationIDs, opr.ID) || swag.ContainsStrings(operationIDs, nm) { opr.ID = nm opr.Op.ID = nm operations[nm] = opr @@ -1076,43 +859,6 @@ func gatherOperations(specDoc *analysis.Spec, operationIDs []string) map[string] return operations } -func pascalize(arg string) string { - runes := []rune(arg) - switch len(runes) { - case 0: - return "" - case 1: // handle special case when we have a single rune that is not handled by swag.ToGoName - switch runes[0] { - case '+', '-', '#', '_': // those cases are handled differently than swag utility - return prefixForName(arg) - } - } - return swag.ToGoName(swag.ToGoName(arg)) // want to remove spaces -} - -func prefixForName(arg string) string { - first := []rune(arg)[0] - if len(arg) == 0 || unicode.IsLetter(first) { - return "" - } - switch first { - case '+': - return "Plus" - case '-': - return "Minus" - case '#': - return "HashTag" - // other cases ($,@ etc..) handled by swag.ToGoName - } - return "Nr" -} - -func init() { - // this makes the ToGoName func behave with the special - // prefixing rule above - swag.GoNamePrefixFunc = prefixForName -} - func pruneEmpty(in []string) (out []string) { for _, v := range in { if v != "" { @@ -1126,73 +872,6 @@ func trimBOM(in string) string { return strings.Trim(in, "\xef\xbb\xbf") } -func validateAndFlattenSpec(opts *GenOpts, specDoc *loads.Document) (*loads.Document, error) { - - var err error - - // Validate if needed - if opts.ValidateSpec { - log.Printf("validating spec %v", opts.Spec) - if erv := validateSpec(opts.Spec, specDoc); erv != nil { - return specDoc, erv - } - } - - // Restore spec to original - opts.Spec, specDoc, err = loadSpec(opts.Spec) - if err != nil { - return nil, err - } - - absBasePath := specDoc.SpecFilePath() - if !filepath.IsAbs(absBasePath) { - cwd, _ := os.Getwd() - absBasePath = filepath.Join(cwd, absBasePath) - } - - // Some preprocessing is required before codegen - // - // This ensures at least that $ref's in the spec document are canonical, - // i.e all $ref are local to this file and point to some uniquely named definition. - // - // Default option is to ensure minimal flattening of $ref, bundling remote $refs and relocating arbitrary JSON - // pointers as definitions. - // This preprocessing may introduce duplicate names (e.g. remote $ref with same name). In this case, a definition - // suffixed with "OAIGen" is produced. - // - // Full flattening option farther transforms the spec by moving every complex object (e.g. with some properties) - // as a standalone definition. - // - // Eventually, an "expand spec" option is available. It is essentially useful for testing purposes. - // - // NOTE(fredbi): spec expansion may produce some unsupported constructs and is not yet protected against the - // following cases: - // - polymorphic types generation may fail with expansion (expand destructs the reuse intent of the $ref in allOf) - // - name duplicates may occur and result in compilation failures - // The right place to fix these shortcomings is go-openapi/analysis. - - opts.FlattenOpts.BasePath = absBasePath // BasePath must be absolute - opts.FlattenOpts.Spec = analysis.New(specDoc.Spec()) - - var preprocessingOption string - switch { - case opts.FlattenOpts.Expand: - preprocessingOption = "expand" - case opts.FlattenOpts.Minimal: - preprocessingOption = "minimal flattening" - default: - preprocessingOption = "full flattening" - } - log.Printf("preprocessing spec with option: %s", preprocessingOption) - - if err = analysis.Flatten(*opts.FlattenOpts); err != nil { - return nil, err - } - - // yields the preprocessed spec document - return specDoc, nil -} - // gatherSecuritySchemes produces a sorted representation from a map of spec security schemes func gatherSecuritySchemes(securitySchemes map[string]spec.SecurityScheme, appName, principal, receiver string) (security GenSecuritySchemes) { for scheme, req := range securitySchemes { @@ -1285,3 +964,17 @@ func sharedValidationsFromSchema(v spec.Schema, isRequired bool) (sh sharedValid } return } + +func dumpData(data interface{}) error { + bb, err := json.MarshalIndent(data, "", " ") + if err != nil { + return err + } + fmt.Fprintln(os.Stdout, string(bb)) + return nil +} + +func importAlias(pkg string) string { + _, k := path.Split(pkg) + return k +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/spec.go b/vendor/github.com/go-swagger/go-swagger/generator/spec.go new file mode 100644 index 0000000000..68e08ce445 --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/generator/spec.go @@ -0,0 +1,248 @@ +package generator + +import ( + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "log" + "os" + "path/filepath" + + "github.com/go-openapi/analysis" + swaggererrors "github.com/go-openapi/errors" + "github.com/go-openapi/loads" + "github.com/go-openapi/spec" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" + "github.com/go-openapi/validate" + "gopkg.in/yaml.v2" +) + +func (g *GenOpts) validateAndFlattenSpec() (*loads.Document, error) { + // Load spec document + specDoc, err := loads.Spec(g.Spec) + if err != nil { + return nil, err + } + + // If accepts definitions only, add dummy swagger header to pass validation + if g.AcceptDefinitionsOnly { + specDoc, err = applyDefaultSwagger(specDoc) + if err != nil { + return nil, err + } + } + + // Validate if needed + if g.ValidateSpec { + log.Printf("validating spec %v", g.Spec) + validationErrors := validate.Spec(specDoc, strfmt.Default) + if validationErrors != nil { + str := fmt.Sprintf("The swagger spec at %q is invalid against swagger specification %s. see errors :\n", + g.Spec, specDoc.Version()) + for _, desc := range validationErrors.(*swaggererrors.CompositeError).Errors { + str += fmt.Sprintf("- %s\n", desc) + } + return nil, errors.New(str) + } + // TODO(fredbi): due to uncontrolled $ref state in spec, we need to reload the spec atm, or flatten won't + // work properly (validate expansion alters the $ref cache in go-openapi/spec) + specDoc, _ = loads.Spec(g.Spec) + } + + // Flatten spec + // + // Some preprocessing is required before codegen + // + // This ensures at least that $ref's in the spec document are canonical, + // i.e all $ref are local to this file and point to some uniquely named definition. + // + // Default option is to ensure minimal flattening of $ref, bundling remote $refs and relocating arbitrary JSON + // pointers as definitions. + // This preprocessing may introduce duplicate names (e.g. remote $ref with same name). In this case, a definition + // suffixed with "OAIGen" is produced. + // + // Full flattening option farther transforms the spec by moving every complex object (e.g. with some properties) + // as a standalone definition. + // + // Eventually, an "expand spec" option is available. It is essentially useful for testing purposes. + // + // NOTE(fredbi): spec expansion may produce some unsupported constructs and is not yet protected against the + // following cases: + // - polymorphic types generation may fail with expansion (expand destructs the reuse intent of the $ref in allOf) + // - name duplicates may occur and result in compilation failures + // + // The right place to fix these shortcomings is go-openapi/analysis. + + g.FlattenOpts.BasePath = specDoc.SpecFilePath() + g.FlattenOpts.Spec = analysis.New(specDoc.Spec()) + + g.printFlattenOpts() + + if err = analysis.Flatten(*g.FlattenOpts); err != nil { + return nil, err + } + + // yields the preprocessed spec document + return specDoc, nil +} + +func (g *GenOpts) analyzeSpec() (*loads.Document, *analysis.Spec, error) { + // spec preprocessing option + if g.PropertiesSpecOrder { + g.Spec = WithAutoXOrder(g.Spec) + } + + // load, validate and flatten + specDoc, err := g.validateAndFlattenSpec() + if err != nil { + return nil, nil, err + } + + // analyze the spec + analyzed := analysis.New(specDoc.Spec()) + + return specDoc, analyzed, nil +} + +func (g *GenOpts) printFlattenOpts() { + var preprocessingOption string + switch { + case g.FlattenOpts.Expand: + preprocessingOption = "expand" + case g.FlattenOpts.Minimal: + preprocessingOption = "minimal flattening" + default: + preprocessingOption = "full flattening" + } + log.Printf("preprocessing spec with option: %s", preprocessingOption) +} + +//findSwaggerSpec fetches a default swagger spec if none is provided +func findSwaggerSpec(nm string) (string, error) { + specs := []string{"swagger.json", "swagger.yml", "swagger.yaml"} + if nm != "" { + specs = []string{nm} + } + var name string + for _, nn := range specs { + f, err := os.Stat(nn) + if err != nil { + if os.IsNotExist(err) { + continue + } + return "", err + } + if f.IsDir() { + return "", fmt.Errorf("%s is a directory", nn) + } + name = nn + break + } + if name == "" { + return "", errors.New("couldn't find a swagger spec") + } + return name, nil +} + +// WithAutoXOrder amends the spec to specify property order as they appear +// in the spec (supports yaml documents only). +func WithAutoXOrder(specPath string) string { + lookFor := func(ele interface{}, key string) (yaml.MapSlice, bool) { + if slice, ok := ele.(yaml.MapSlice); ok { + for _, v := range slice { + if v.Key == key { + if slice, ok := v.Value.(yaml.MapSlice); ok { + return slice, ok + } + } + } + } + return nil, false + } + + var addXOrder func(interface{}) + addXOrder = func(element interface{}) { + if props, ok := lookFor(element, "properties"); ok { + for i, prop := range props { + if pSlice, ok := prop.Value.(yaml.MapSlice); ok { + isObject := false + xOrderIndex := -1 //Find if x-order already exists + + for i, v := range pSlice { + if v.Key == "type" && v.Value == object { + isObject = true + } + if v.Key == xOrder { + xOrderIndex = i + break + } + } + + if xOrderIndex > -1 { //Override existing x-order + pSlice[xOrderIndex] = yaml.MapItem{Key: xOrder, Value: i} + } else { // append new x-order + pSlice = append(pSlice, yaml.MapItem{Key: xOrder, Value: i}) + } + prop.Value = pSlice + props[i] = prop + + if isObject { + addXOrder(pSlice) + } + } + } + } + } + + yamlDoc, err := swag.YAMLData(specPath) + if err != nil { + panic(err) + } + + if defs, ok := lookFor(yamlDoc, "definitions"); ok { + for _, def := range defs { + addXOrder(def.Value) + } + } + + addXOrder(yamlDoc) + + out, err := yaml.Marshal(yamlDoc) + if err != nil { + panic(err) + } + + tmpFile, err := ioutil.TempFile("", filepath.Base(specPath)) + if err != nil { + panic(err) + } + if err := ioutil.WriteFile(tmpFile.Name(), out, 0); err != nil { + panic(err) + } + return tmpFile.Name() +} + +func applyDefaultSwagger(doc *loads.Document) (*loads.Document, error) { + // bake a minimal swagger spec to pass validation + swspec := doc.Spec() + if swspec.Swagger == "" { + swspec.Swagger = "2.0" + } + if swspec.Info == nil { + info := new(spec.Info) + info.Version = "0.0.0" + info.Title = "minimal" + swspec.Info = info + } + if swspec.Paths == nil { + swspec.Paths = &spec.Paths{} + } + // rewrite the document with the new addition + jazon, err := json.Marshal(swspec) + if err != nil { + return nil, err + } + return loads.Analyzed(jazon, swspec.Swagger) +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/structs.go b/vendor/github.com/go-swagger/go-swagger/generator/structs.go index 145953a95d..16ae892f04 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/structs.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/structs.go @@ -28,7 +28,7 @@ type GenDefinition struct { GenSchema Package string Imports map[string]string - DefaultImports []string + DefaultImports map[string]string ExtraSchemas GenSchemaList DependsOn []string External bool @@ -91,6 +91,9 @@ type GenSchema struct { IncludeValidator bool IncludeModel bool Default interface{} + WantsMarshalBinary bool // do we generate MarshalBinary interface? + StructTags []string + ExtraImports map[string]string // non-standard imports detected when using external types } func (g GenSchemaList) Len() int { return len(g) } @@ -167,9 +170,12 @@ type GenResponse struct { AllowsForStreaming bool Imports map[string]string - DefaultImports []string + DefaultImports map[string]string Extensions map[string]interface{} + + StrictResponders bool + OperationName string } // GenHeader represents a header on a response for code generation @@ -355,6 +361,8 @@ type GenItems struct { // instructs generator to skip the splitting and parsing from CollectionFormat SkipParse bool + // instructs generator that some nested structure needs an higher level loop index + NeedsIndex bool } // ItemsDepth returns a string "items.items..." with as many items as the level of nesting of the array. @@ -378,9 +386,10 @@ type GenOperationGroup struct { Summary string Description string Imports map[string]string - DefaultImports []string + DefaultImports map[string]string RootPackage string GenOpts *GenOpts + PackageAlias string } // GenOperationGroups is a sorted collection of operation groups @@ -398,13 +407,20 @@ func (g GenStatusCodeResponses) Swap(i, j int) { g[i], g[j] = g[j], g[i] } func (g GenStatusCodeResponses) Less(i, j int) bool { return g[i].Code < g[j].Code } // MarshalJSON marshals these responses to json +// +// This is used by DumpData. func (g GenStatusCodeResponses) MarshalJSON() ([]byte, error) { if g == nil { return nil, nil } + responses := make(GenStatusCodeResponses, len(g)) + copy(responses, g) + // order marshalled output + sort.Sort(responses) + var buf bytes.Buffer buf.WriteRune('{') - for i, v := range g { + for i, v := range responses { rb, err := json.Marshal(v) if err != nil { return nil, err @@ -446,11 +462,13 @@ type GenOperation struct { Path string BasePath string Tags []string + UseTags bool RootPackage string Imports map[string]string - DefaultImports []string + DefaultImports map[string]string ExtraSchemas GenSchemaList + PackageAlias string Authorized bool Security []GenSecurityRequirements @@ -483,6 +501,8 @@ type GenOperation struct { TimeoutName string Extensions map[string]interface{} + + StrictResponders bool } // GenOperations represents a list of operations to generate @@ -509,7 +529,7 @@ type GenApp struct { Info *spec.Info ExternalDocs *spec.ExternalDocumentation Imports map[string]string - DefaultImports []string + DefaultImports map[string]string Schemes []string ExtraSchemes []string Consumes GenSerGroups @@ -521,7 +541,7 @@ type GenApp struct { SwaggerJSON string // Embedded specs: this is important for when the generated server adds routes. // NOTE: there is a distinct advantage to having this in runtime rather than generated code. - // We are noti ever going to generate the router. + // We are not ever going to generate the router. // If embedding spec is an issue (e.g. memory usage), this can be excluded with the --exclude-spec // generation option. Alternative methods to serve spec (e.g. from disk, ...) may be implemented by // adding a middleware to the generated API. @@ -563,16 +583,14 @@ type GenSerGroups []GenSerGroup func (g GenSerGroups) Len() int { return len(g) } func (g GenSerGroups) Swap(i, j int) { g[i], g[j] = g[j], g[i] } -func (g GenSerGroups) Less(i, j int) bool { return g[i].MediaType < g[j].MediaType } +func (g GenSerGroups) Less(i, j int) bool { return g[i].Name < g[j].Name } -// GenSerGroup represents a group of serializers, most likely this is a media type to a list of -// prioritized serializers. +// GenSerGroup represents a group of serializers: this links a serializer to a list of +// prioritized media types (mime). type GenSerGroup struct { - ReceiverName string - AppName string - Name string - MediaType string - Implementation string + GenSerializer + + // All media types for this serializer. The redundant representation allows for easier use in templates AllSerializers GenSerializers } @@ -585,11 +603,12 @@ func (g GenSerializers) Less(i, j int) bool { return g[i].MediaType < g[j].Media // GenSerializer represents a single serializer for a particular media type type GenSerializer struct { + AppName string // Application name ReceiverName string - AppName string - Name string - MediaType string - Implementation string + Name string // Name of the Producer/Consumer (e.g. json, yaml, txt, bin) + MediaType string // mime + Implementation string // func implementing the Producer/Consumer + Parameters []string // parameters supported by this serializer } // GenSecurityScheme represents a security scheme for code generation diff --git a/vendor/github.com/go-swagger/go-swagger/generator/support.go b/vendor/github.com/go-swagger/go-swagger/generator/support.go index 9e41175bae..a1184ff8e8 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/support.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/support.go @@ -1,4 +1,5 @@ // Copyright 2015 go-swagger maintainers + // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -19,21 +20,13 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "log" - "os" "path" "path/filepath" - "regexp" - goruntime "runtime" "sort" - "strings" - - yaml "gopkg.in/yaml.v2" "github.com/go-openapi/analysis" "github.com/go-openapi/loads" - "github.com/go-openapi/runtime" "github.com/go-openapi/spec" "github.com/go-openapi/swag" ) @@ -57,85 +50,37 @@ func GenerateSupport(name string, modelNames, operationIDs []string, opts *GenOp } func newAppGenerator(name string, modelNames, operationIDs []string, opts *GenOpts) (*appGenerator, error) { - if opts == nil { - return nil, errors.New("gen opts are required") - } if err := opts.CheckOpts(); err != nil { return nil, err } - templates.LoadDefaults() - if opts.Template != "" { - if err := templates.LoadContrib(opts.Template); err != nil { - return nil, err - } - } - - templates.SetAllowOverride(opts.AllowTemplateOverride) - - if opts.TemplateDir != "" { - if err := templates.LoadDir(opts.TemplateDir); err != nil { - return nil, err - } - } - - // Load the spec - var err error - var specDoc *loads.Document - - opts.Spec, err = findSwaggerSpec(opts.Spec) - if err != nil { + if err := opts.setTemplates(); err != nil { return nil, err } - if !filepath.IsAbs(opts.Spec) { - cwd, _ := os.Getwd() - opts.Spec = filepath.Join(cwd, opts.Spec) - } - - if opts.PropertiesSpecOrder { - opts.Spec = WithAutoXOrder(opts.Spec) - } - - opts.Spec, specDoc, err = loadSpec(opts.Spec) + specDoc, analyzed, err := opts.analyzeSpec() if err != nil { return nil, err } - specDoc, err = validateAndFlattenSpec(opts, specDoc) - if err != nil { - return nil, err - } - - analyzed := analysis.New(specDoc.Spec()) - models, err := gatherModels(specDoc, modelNames) if err != nil { return nil, err } operations := gatherOperations(analyzed, operationIDs) - if len(operations) == 0 { - return nil, errors.New("no operations were selected") - } - defaultScheme := opts.DefaultScheme - if defaultScheme == "" { - defaultScheme = "http" - } - - defaultProduces := opts.DefaultProduces - if defaultProduces == "" { - defaultProduces = runtime.JSONMime + if len(operations) == 0 && !opts.IgnoreOperations { + return nil, errors.New("no operations were selected") } - defaultConsumes := opts.DefaultConsumes - if defaultConsumes == "" { - defaultConsumes = runtime.JSONMime + opts.Name = appNameOrDefault(specDoc, name, defaultServerName) + if opts.IncludeMain && opts.MainPackage == "" { + // default target for the generated main + opts.MainPackage = swag.ToCommandName(mainNameOrDefault(specDoc, name, defaultServerName) + "-server") } - opts.Name = appNameOrDefault(specDoc, name, "swagger") - apiPackage := opts.LanguageOpts.ManglePackagePath(opts.APIPackage, "api") + apiPackage := opts.LanguageOpts.ManglePackagePath(opts.APIPackage, defaultOperationsTarget) return &appGenerator{ Name: opts.Name, Receiver: "o", @@ -145,16 +90,16 @@ func newAppGenerator(name string, modelNames, operationIDs []string, opts *GenOp Operations: operations, Target: opts.Target, DumpData: opts.DumpData, - Package: opts.LanguageOpts.ManglePackageName(apiPackage, "api"), + Package: opts.LanguageOpts.ManglePackageName(apiPackage, defaultOperationsTarget), APIPackage: apiPackage, - ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, "definitions"), - ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"), - ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, "client"), - OperationsPackage: filepath.Join(opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, "server"), apiPackage), - Principal: opts.Principal, - DefaultScheme: defaultScheme, - DefaultProduces: defaultProduces, - DefaultConsumes: defaultConsumes, + ModelsPackage: opts.LanguageOpts.ManglePackagePath(opts.ModelPackage, defaultModelsTarget), + ServerPackage: opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, defaultServerTarget), + ClientPackage: opts.LanguageOpts.ManglePackagePath(opts.ClientPackage, defaultClientTarget), + OperationsPackage: filepath.Join(opts.LanguageOpts.ManglePackagePath(opts.ServerPackage, defaultServerTarget), apiPackage), + Principal: opts.PrincipalAlias(), + DefaultScheme: opts.DefaultScheme, + DefaultProduces: opts.DefaultProduces, + DefaultConsumes: opts.DefaultConsumes, GenOpts: opts, }, nil } @@ -170,6 +115,7 @@ type appGenerator struct { ServerPackage string ClientPackage string OperationsPackage string + MainPackage string Principal string Models map[string]spec.Schema Operations map[string]opRef @@ -181,120 +127,14 @@ type appGenerator struct { GenOpts *GenOpts } -func WithAutoXOrder(specPath string) string { - lookFor := func(ele interface{}, key string) (yaml.MapSlice, bool) { - if slice, ok := ele.(yaml.MapSlice); ok { - for _, v := range slice { - if v.Key == key { - if slice, ok := v.Value.(yaml.MapSlice); ok { - return slice, ok - } - } - } - } - return nil, false - } - - var addXOrder func(interface{}) - addXOrder = func(element interface{}) { - if props, ok := lookFor(element, "properties"); ok { - for i, prop := range props { - if pSlice, ok := prop.Value.(yaml.MapSlice); ok { - isObject := false - xOrderIndex := -1 //Find if x-order already exists - - for i, v := range pSlice { - if v.Key == "type" && v.Value == object { - isObject = true - } - if v.Key == xOrder { - xOrderIndex = i - break - } - } - - if xOrderIndex > -1 { //Override existing x-order - pSlice[xOrderIndex] = yaml.MapItem{Key: xOrder, Value: i} - } else { // append new x-order - pSlice = append(pSlice, yaml.MapItem{Key: xOrder, Value: i}) - } - prop.Value = pSlice - props[i] = prop - - if isObject { - addXOrder(pSlice) - } - } - } - } - } - - yamlDoc, err := swag.YAMLData(specPath) - if err != nil { - panic(err) - } - - if defs, ok := lookFor(yamlDoc, "definitions"); ok { - for _, def := range defs { - addXOrder(def.Value) - } - } - - addXOrder(yamlDoc) - - out, err := yaml.Marshal(yamlDoc) - if err != nil { - panic(err) - } - - tmpFile, err := ioutil.TempFile("", filepath.Base(specPath)) - if err != nil { - panic(err) - } - if err := ioutil.WriteFile(tmpFile.Name(), out, 0); err != nil { - panic(err) - } - return tmpFile.Name() -} - -// 1. Checks if the child path and parent path coincide. -// 2. If they do return child path relative to parent path. -// 3. Everything else return false -func checkPrefixAndFetchRelativePath(childpath string, parentpath string) (bool, string) { - // Windows (local) file systems - NTFS, as well as FAT and variants - // are case insensitive. - cp, pp := childpath, parentpath - if goruntime.GOOS == "windows" { - cp = strings.ToLower(cp) - pp = strings.ToLower(pp) - } - - if strings.HasPrefix(cp, pp) { - pth, err := filepath.Rel(parentpath, childpath) - if err != nil { - log.Fatalln(err) - } - return true, pth - } - - return false, "" - -} - func (a *appGenerator) Generate() error { - app, err := a.makeCodegenApp() if err != nil { return err } if a.DumpData { - bb, err := json.MarshalIndent(app, "", " ") - if err != nil { - return err - } - fmt.Fprintln(os.Stdout, string(bb)) - return nil + return dumpData(app) } // NOTE: relative to previous implem with chan. @@ -303,10 +143,9 @@ func (a *appGenerator) Generate() error { if a.GenOpts.IncludeModel { log.Printf("rendering %d models", len(app.Models)) for _, mod := range app.Models { - modCopy := mod - modCopy.IncludeValidator = true // a.GenOpts.IncludeValidator - modCopy.IncludeModel = true - if err := a.GenOpts.renderDefinition(&modCopy); err != nil { + mod.IncludeModel = true + mod.IncludeValidator = a.GenOpts.IncludeValidator + if err := a.GenOpts.renderDefinition(&mod); err != nil { return err } } @@ -315,19 +154,14 @@ func (a *appGenerator) Generate() error { if a.GenOpts.IncludeHandler { log.Printf("rendering %d operation groups (tags)", app.OperationGroups.Len()) for _, opg := range app.OperationGroups { - opgCopy := opg log.Printf("rendering %d operations for %s", opg.Operations.Len(), opg.Name) - for _, op := range opgCopy.Operations { - opCopy := op - - if err := a.GenOpts.renderOperation(&opCopy); err != nil { + for _, op := range opg.Operations { + if err := a.GenOpts.renderOperation(&op); err != nil { return err } } - // Optional OperationGroups templates generation - opGroup := opg - opGroup.DefaultImports = app.DefaultImports - if err := a.GenOpts.renderOperationGroup(&opGroup); err != nil { + // optional OperationGroups templates generation + if err := a.GenOpts.renderOperationGroup(&opg); err != nil { return fmt.Errorf("error while rendering operation group: %v", err) } } @@ -345,247 +179,23 @@ func (a *appGenerator) Generate() error { func (a *appGenerator) GenerateSupport(ap *GenApp) error { app := ap if ap == nil { + // allows for calling GenerateSupport standalone ca, err := a.makeCodegenApp() if err != nil { return err } app = &ca } + baseImport := a.GenOpts.LanguageOpts.baseImport(a.Target) - importPath := path.Join(filepath.ToSlash(baseImport), a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, "")) - app.DefaultImports = append( - app.DefaultImports, - path.Join(filepath.ToSlash(baseImport), a.GenOpts.LanguageOpts.ManglePackagePath(a.ServerPackage, "")), - importPath, - ) + serverPath := path.Join(baseImport, + a.GenOpts.LanguageOpts.ManglePackagePath(a.ServerPackage, defaultServerTarget)) + app.DefaultImports[importAlias(serverPath)] = serverPath return a.GenOpts.renderApplication(app) } -var mediaTypeNames = map[*regexp.Regexp]string{ - regexp.MustCompile("application/.*json"): "json", - regexp.MustCompile("application/.*yaml"): "yaml", - regexp.MustCompile("application/.*protobuf"): "protobuf", - regexp.MustCompile("application/.*capnproto"): "capnproto", - regexp.MustCompile("application/.*thrift"): "thrift", - regexp.MustCompile("(?:application|text)/.*xml"): "xml", - regexp.MustCompile("text/.*markdown"): "markdown", - regexp.MustCompile("text/.*html"): "html", - regexp.MustCompile("text/.*csv"): "csv", - regexp.MustCompile("text/.*tsv"): "tsv", - regexp.MustCompile("text/.*javascript"): "js", - regexp.MustCompile("text/.*css"): "css", - regexp.MustCompile("text/.*plain"): "txt", - regexp.MustCompile("application/.*octet-stream"): "bin", - regexp.MustCompile("application/.*tar"): "tar", - regexp.MustCompile("application/.*gzip"): "gzip", - regexp.MustCompile("application/.*gz"): "gzip", - regexp.MustCompile("application/.*raw-stream"): "bin", - regexp.MustCompile("application/x-www-form-urlencoded"): "urlform", - regexp.MustCompile("multipart/form-data"): "multipartform", -} - -var knownProducers = map[string]string{ - "json": "runtime.JSONProducer()", - "yaml": "yamlpc.YAMLProducer()", - "xml": "runtime.XMLProducer()", - "txt": "runtime.TextProducer()", - "bin": "runtime.ByteStreamProducer()", - "urlform": "runtime.DiscardProducer", - "multipartform": "runtime.DiscardProducer", -} - -var knownConsumers = map[string]string{ - "json": "runtime.JSONConsumer()", - "yaml": "yamlpc.YAMLConsumer()", - "xml": "runtime.XMLConsumer()", - "txt": "runtime.TextConsumer()", - "bin": "runtime.ByteStreamConsumer()", - "urlform": "runtime.DiscardConsumer", - "multipartform": "runtime.DiscardConsumer", -} - -func getSerializer(sers []GenSerGroup, ext string) (*GenSerGroup, bool) { - for i := range sers { - s := &sers[i] - if s.Name == ext { - return s, true - } - } - return nil, false -} - -func mediaTypeName(tn string) (string, bool) { - for k, v := range mediaTypeNames { - if k.MatchString(tn) { - return v, true - } - } - return "", false -} - -func (a *appGenerator) makeConsumes() (consumes GenSerGroups, consumesJSON bool) { - reqCons := a.Analyzed.RequiredConsumes() - sort.Strings(reqCons) - for _, cons := range reqCons { - cn, ok := mediaTypeName(cons) - if !ok { - nm := swag.ToJSONName(cons) - ser := GenSerializer{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: nm, - MediaType: cons, - Implementation: "", - } - - consumes = append(consumes, GenSerGroup{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: cons, - AllSerializers: []GenSerializer{ser}, - Implementation: ser.Implementation, - }) - continue - } - nm := swag.ToJSONName(cn) - if nm == "json" { - consumesJSON = true - } - - if ser, ok := getSerializer(consumes, cn); ok { - ser.AllSerializers = append(ser.AllSerializers, GenSerializer{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: cons, - Implementation: knownConsumers[nm], - }) - sort.Sort(ser.AllSerializers) - continue - } - - ser := GenSerializer{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: nm, - MediaType: cons, - Implementation: knownConsumers[nm], - } - - consumes = append(consumes, GenSerGroup{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: cons, - AllSerializers: []GenSerializer{ser}, - Implementation: ser.Implementation, - }) - } - if len(consumes) == 0 { - consumes = append(consumes, GenSerGroup{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: "json", - MediaType: runtime.JSONMime, - AllSerializers: []GenSerializer{{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: "json", - MediaType: runtime.JSONMime, - Implementation: knownConsumers["json"], - }}, - Implementation: knownConsumers["json"], - }) - consumesJSON = true - } - sort.Sort(consumes) - return -} - -func (a *appGenerator) makeProduces() (produces GenSerGroups, producesJSON bool) { - reqProds := a.Analyzed.RequiredProduces() - sort.Strings(reqProds) - for _, prod := range reqProds { - pn, ok := mediaTypeName(prod) - if !ok { - nm := swag.ToJSONName(prod) - ser := GenSerializer{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: nm, - MediaType: prod, - Implementation: "", - } - produces = append(produces, GenSerGroup{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: prod, - Implementation: ser.Implementation, - AllSerializers: []GenSerializer{ser}, - }) - continue - } - nm := swag.ToJSONName(pn) - if nm == "json" { - producesJSON = true - } - - if ser, ok := getSerializer(produces, pn); ok { - ser.AllSerializers = append(ser.AllSerializers, GenSerializer{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: prod, - Implementation: knownProducers[nm], - }) - sort.Sort(ser.AllSerializers) - continue - } - - ser := GenSerializer{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: nm, - MediaType: prod, - Implementation: knownProducers[nm], - } - produces = append(produces, GenSerGroup{ - AppName: ser.AppName, - ReceiverName: ser.ReceiverName, - Name: ser.Name, - MediaType: prod, - Implementation: ser.Implementation, - AllSerializers: []GenSerializer{ser}, - }) - } - if len(produces) == 0 { - produces = append(produces, GenSerGroup{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: "json", - MediaType: runtime.JSONMime, - AllSerializers: []GenSerializer{{ - AppName: a.Name, - ReceiverName: a.Receiver, - Name: "json", - MediaType: runtime.JSONMime, - Implementation: knownProducers["json"], - }}, - Implementation: knownProducers["json"], - }) - producesJSON = true - } - sort.Sort(produces) - return -} - func (a *appGenerator) makeSecuritySchemes() GenSecuritySchemes { - if a.Principal == "" { - a.Principal = "interface{}" - } requiredSecuritySchemes := make(map[string]spec.SecurityScheme, len(a.Analyzed.RequiredSecuritySchemes())) for _, scheme := range a.Analyzed.RequiredSecuritySchemes() { if req, ok := a.SpecDoc.Spec().SecurityDefinitions[scheme]; ok && req != nil { @@ -597,36 +207,25 @@ func (a *appGenerator) makeSecuritySchemes() GenSecuritySchemes { func (a *appGenerator) makeCodegenApp() (GenApp, error) { log.Println("building a plan for generation") + sw := a.SpecDoc.Spec() receiver := a.Receiver - var defaultImports []string - - jsonb, _ := json.MarshalIndent(a.SpecDoc.OrigSpec(), "", " ") - flatjsonb, _ := json.MarshalIndent(a.SpecDoc.Spec(), "", " ") - consumes, _ := a.makeConsumes() produces, _ := a.makeProduces() - sort.Sort(consumes) - sort.Sort(produces) security := a.makeSecuritySchemes() + + log.Println("generation target", a.Target) + baseImport := a.GenOpts.LanguageOpts.baseImport(a.Target) - var imports = make(map[string]string) - - var genMods GenDefinitions - importPath := a.GenOpts.ExistingModels - if a.GenOpts.ExistingModels == "" { - imports[a.GenOpts.LanguageOpts.ManglePackageName(a.ModelsPackage, "models")] = path.Join( - filepath.ToSlash(baseImport), - a.GenOpts.LanguageOpts.ManglePackagePath(a.GenOpts.ModelPackage, "models")) - } - if importPath != "" { - defaultImports = append(defaultImports, importPath) - } + defaultImports := a.GenOpts.defaultImports() + imports := a.GenOpts.initImports(a.OperationsPackage) log.Println("planning definitions") + + genModels := make(GenDefinitions, 0, len(a.Models)) for mn, m := range a.Models { - mod, err := makeGenDefinition( + model, err := makeGenDefinition( mn, a.ModelsPackage, m, @@ -636,52 +235,59 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { if err != nil { return GenApp{}, fmt.Errorf("error in model %s while planning definitions: %v", mn, err) } - if mod != nil { - if !mod.External { - genMods = append(genMods, *mod) + if model != nil { + if !model.External { + genModels = append(genModels, *model) } // Copy model imports to operation imports - for alias, pkg := range mod.Imports { + // TODO(fredbi): mangle model pkg aliases + for alias, pkg := range model.Imports { target := a.GenOpts.LanguageOpts.ManglePackageName(alias, "") imports[target] = pkg } } } - sort.Sort(genMods) + sort.Sort(genModels) log.Println("planning operations") - tns := make(map[string]struct{}) - var genOps GenOperations - for on, opp := range a.Operations { + + genOps := make(GenOperations, 0, len(a.Operations)) + for operationName, opp := range a.Operations { o := opp.Op - o.Tags = pruneEmpty(o.Tags) - o.ID = on - - var bldr codeGenOpBuilder - bldr.ModelsPackage = a.ModelsPackage - bldr.Principal = a.Principal - bldr.Target = a.Target - bldr.DefaultImports = defaultImports - bldr.Imports = imports - bldr.DefaultScheme = a.DefaultScheme - bldr.Doc = a.SpecDoc - bldr.Analyzed = a.Analyzed - bldr.BasePath = a.SpecDoc.BasePath() - bldr.GenOpts = a.GenOpts - - // TODO: change operation name to something safe - bldr.Name = on - bldr.Operation = *o - bldr.Method = opp.Method - bldr.Path = opp.Path + o.ID = operationName + + bldr := codeGenOpBuilder{ + ModelsPackage: a.ModelsPackage, + Principal: a.GenOpts.PrincipalAlias(), + Target: a.Target, + DefaultImports: defaultImports, + Imports: imports, + DefaultScheme: a.DefaultScheme, + Doc: a.SpecDoc, + Analyzed: a.Analyzed, + BasePath: a.SpecDoc.BasePath(), + GenOpts: a.GenOpts, + Name: operationName, + Operation: *o, + Method: opp.Method, + Path: opp.Path, + IncludeValidator: a.GenOpts.IncludeValidator, + APIPackage: a.APIPackage, // defaults to main operations package + DefaultProduces: a.DefaultProduces, + DefaultConsumes: a.DefaultConsumes, + } + + tag, tags, ok := bldr.analyzeTags() + if !ok { + continue // operation filtered according to CLI params + } + bldr.Authed = len(a.Analyzed.SecurityRequirementsFor(o)) > 0 bldr.Security = a.Analyzed.SecurityRequirementsFor(o) bldr.SecurityDefinitions = a.Analyzed.SecurityDefinitionsFor(o) - bldr.RootAPIPackage = a.GenOpts.LanguageOpts.ManglePackageName(a.ServerPackage, "server") - bldr.IncludeValidator = true + bldr.RootAPIPackage = a.GenOpts.LanguageOpts.ManglePackageName(a.ServerPackage, defaultServerTarget) - bldr.APIPackage = a.APIPackage st := o.Tags if a.GenOpts != nil { st = a.GenOpts.Tags @@ -691,42 +297,35 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { continue } - if len(intersected) > 0 { - tag := intersected[0] - bldr.APIPackage = a.GenOpts.LanguageOpts.ManglePackagePath(tag, a.APIPackage) - for _, t := range intersected { - tns[t] = struct{}{} - } - } op, err := bldr.MakeOperation() if err != nil { return GenApp{}, err } + op.ReceiverName = receiver - op.Tags = intersected + op.Tags = tags // ordered tags for this operation, possibly filtered by CLI params genOps = append(genOps, op) - } - for k := range tns { - importPath := filepath.ToSlash( - path.Join( - filepath.ToSlash(baseImport), - a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, ""), - swag.ToFileName(k))) - defaultImports = append(defaultImports, importPath) + if !a.GenOpts.SkipTagPackages && tag != "" { + importPath := filepath.ToSlash( + path.Join( + baseImport, + a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, defaultOperationsTarget), + a.GenOpts.LanguageOpts.ManglePackageName(bldr.APIPackage, defaultOperationsTarget), + )) + defaultImports[bldr.APIPackageAlias] = importPath + } } sort.Sort(genOps) log.Println("grouping operations into packages") - opsGroupedByPackage := make(map[string]GenOperations) + + opsGroupedByPackage := make(map[string]GenOperations, len(genOps)) for _, operation := range genOps { - if operation.Package == "" { - operation.Package = a.Package - } - opsGroupedByPackage[operation.Package] = append(opsGroupedByPackage[operation.Package], operation) + opsGroupedByPackage[operation.PackageAlias] = append(opsGroupedByPackage[operation.PackageAlias], operation) } - var opGroups GenOperationGroups + opGroups := make(GenOperationGroups, 0, len(opsGroupedByPackage)) for k, v := range opsGroupedByPackage { sort.Sort(v) // trim duplicate extra schemas within the same package @@ -743,13 +342,20 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { op.ExtraSchemas = uniqueExtraSchemas vv = append(vv, op) } + var pkg string + if len(vv) > 0 { + pkg = vv[0].Package + } else { + pkg = k + } opGroup := GenOperationGroup{ GenCommon: GenCommon{ Copyright: a.GenOpts.Copyright, - TargetImportPath: filepath.ToSlash(baseImport), + TargetImportPath: baseImport, }, - Name: k, + Name: pkg, + PackageAlias: k, Operations: vv, DefaultImports: defaultImports, Imports: imports, @@ -757,13 +363,6 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { GenOpts: a.GenOpts, } opGroups = append(opGroups, opGroup) - var importPath string - if k == a.APIPackage { - importPath = path.Join(filepath.ToSlash(baseImport), a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, "")) - } else { - importPath = path.Join(filepath.ToSlash(baseImport), a.GenOpts.LanguageOpts.ManglePackagePath(a.OperationsPackage, ""), k) - } - defaultImports = append(defaultImports, importPath) } sort.Sort(opGroups) @@ -788,12 +387,15 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { basePath = sw.BasePath } + jsonb, _ := json.MarshalIndent(a.SpecDoc.OrigSpec(), "", " ") + flatjsonb, _ := json.MarshalIndent(a.SpecDoc.Spec(), "", " ") + return GenApp{ GenCommon: GenCommon{ Copyright: a.GenOpts.Copyright, - TargetImportPath: filepath.ToSlash(baseImport), + TargetImportPath: baseImport, }, - APIPackage: a.GenOpts.LanguageOpts.ManglePackageName(a.ServerPackage, "server"), + APIPackage: a.GenOpts.LanguageOpts.ManglePackageName(a.ServerPackage, defaultServerTarget), Package: a.Package, ReceiverName: receiver, Name: a.Name, @@ -810,13 +412,13 @@ func (a *appGenerator) makeCodegenApp() (GenApp, error) { DefaultImports: defaultImports, Imports: imports, SecurityDefinitions: security, - Models: genMods, + Models: genModels, Operations: genOps, OperationGroups: opGroups, - Principal: a.Principal, + Principal: a.GenOpts.PrincipalAlias(), SwaggerJSON: generateReadableSpec(jsonb), FlatSwaggerJSON: generateReadableSpec(flatjsonb), - ExcludeSpec: a.GenOpts != nil && a.GenOpts.ExcludeSpec, + ExcludeSpec: a.GenOpts.ExcludeSpec, GenOpts: a.GenOpts, }, nil } diff --git a/vendor/github.com/go-swagger/go-swagger/generator/template_repo.go b/vendor/github.com/go-swagger/go-swagger/generator/template_repo.go index ec3a4f6563..c84951a185 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/template_repo.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/template_repo.go @@ -11,6 +11,7 @@ import ( "strings" "text/template" "text/template/parse" + "unicode" "log" @@ -19,177 +20,166 @@ import ( "github.com/kr/pretty" ) -var templates *Repository +var ( + assets map[string][]byte + protectedTemplates map[string]bool -// FuncMap is a map with default functions for use n the templates. -// These are available in every template -var FuncMap template.FuncMap = map[string]interface{}{ - "pascalize": pascalize, - "camelize": swag.ToJSONName, - "varname": golang.MangleVarName, - "humanize": swag.ToHumanNameLower, - "snakize": golang.MangleFileName, - "toPackagePath": func(name string) string { - return filepath.FromSlash(golang.ManglePackagePath(name, "")) - }, - "toPackage": func(name string) string { - return golang.ManglePackagePath(name, "") - }, - "toPackageName": func(name string) string { - return golang.ManglePackageName(name, "") - }, - "dasherize": swag.ToCommandName, - "pluralizeFirstWord": func(arg string) string { - sentence := strings.Split(arg, " ") - if len(sentence) == 1 { - return inflect.Pluralize(arg) - } + // FuncMapFunc yields a map with all functions for templates + FuncMapFunc func(*LanguageOpts) template.FuncMap - return inflect.Pluralize(sentence[0]) + " " + strings.Join(sentence[1:], " ") - }, - "json": asJSON, - "prettyjson": asPrettyJSON, - "hasInsecure": func(arg []string) bool { - return swag.ContainsStringsCI(arg, "http") || swag.ContainsStringsCI(arg, "ws") - }, - "hasSecure": func(arg []string) bool { - return swag.ContainsStringsCI(arg, "https") || swag.ContainsStringsCI(arg, "wss") - }, - // TODO: simplify redundant functions - "stripPackage": func(str, pkg string) string { - parts := strings.Split(str, ".") - strlen := len(parts) - if strlen > 0 { - return parts[strlen-1] - } - return str - }, - "dropPackage": func(str string) string { - parts := strings.Split(str, ".") - strlen := len(parts) - if strlen > 0 { - return parts[strlen-1] - } - return str - }, - "upper": strings.ToUpper, - "contains": func(coll []string, arg string) bool { - for _, v := range coll { - if v == arg { - return true - } - } - return false - }, - "padSurround": func(entry, padWith string, i, ln int) string { - var res []string - if i > 0 { - for j := 0; j < i; j++ { - res = append(res, padWith) - } - } - res = append(res, entry) - tot := ln - i - 1 - for j := 0; j < tot; j++ { - res = append(res, padWith) - } - return strings.Join(res, ",") - }, - "joinFilePath": filepath.Join, - "comment": func(str string) string { - lines := strings.Split(str, "\n") - return (strings.Join(lines, "\n// ")) - }, - "blockcomment": func(str string) string { - return strings.Replace(str, "*/", "[*]/", -1) - }, - "inspect": pretty.Sprint, - "cleanPath": path.Clean, - "mediaTypeName": func(orig string) string { - return strings.SplitN(orig, ";", 2)[0] - }, - "goSliceInitializer": goSliceInitializer, - "hasPrefix": strings.HasPrefix, - "stringContains": strings.Contains, + templates *Repository +) + +func initTemplateRepo() { + FuncMapFunc = DefaultFuncMap + + // this makes the ToGoName func behave with the special + // prefixing rule above + swag.GoNamePrefixFunc = prefixForName + + assets = defaultAssets() + protectedTemplates = defaultProtectedTemplates() + templates = NewRepository(FuncMapFunc(DefaultLanguageFunc())) } -func init() { - templates = NewRepository(FuncMap) +// DefaultFuncMap yields a map with default functions for use n the templates. +// These are available in every template +func DefaultFuncMap(lang *LanguageOpts) template.FuncMap { + return template.FuncMap(map[string]interface{}{ + "pascalize": pascalize, + "camelize": swag.ToJSONName, + "varname": lang.MangleVarName, + "humanize": swag.ToHumanNameLower, + "snakize": lang.MangleFileName, + "toPackagePath": func(name string) string { + return filepath.FromSlash(lang.ManglePackagePath(name, "")) + }, + "toPackage": func(name string) string { + return lang.ManglePackagePath(name, "") + }, + "toPackageName": func(name string) string { + return lang.ManglePackageName(name, "") + }, + "dasherize": swag.ToCommandName, + "pluralizeFirstWord": pluralizeFirstWord, + "json": asJSON, + "prettyjson": asPrettyJSON, + "hasInsecure": func(arg []string) bool { + return swag.ContainsStringsCI(arg, "http") || swag.ContainsStringsCI(arg, "ws") + }, + "hasSecure": func(arg []string) bool { + return swag.ContainsStringsCI(arg, "https") || swag.ContainsStringsCI(arg, "wss") + }, + "dropPackage": dropPackage, + "upper": strings.ToUpper, + "contains": swag.ContainsStrings, + "padSurround": padSurround, + "joinFilePath": filepath.Join, + "comment": padComment, + "blockcomment": blockComment, + "inspect": pretty.Sprint, + "cleanPath": path.Clean, + "mediaTypeName": mediaMime, + "arrayInitializer": lang.arrayInitializer, + "hasPrefix": strings.HasPrefix, + "stringContains": strings.Contains, + "imports": lang.imports, + "dict": dict, + }) } -var assets = map[string][]byte{ - "validation/primitive.gotmpl": MustAsset("templates/validation/primitive.gotmpl"), - "validation/customformat.gotmpl": MustAsset("templates/validation/customformat.gotmpl"), - "docstring.gotmpl": MustAsset("templates/docstring.gotmpl"), - "validation/structfield.gotmpl": MustAsset("templates/validation/structfield.gotmpl"), - "modelvalidator.gotmpl": MustAsset("templates/modelvalidator.gotmpl"), - "structfield.gotmpl": MustAsset("templates/structfield.gotmpl"), - "tupleserializer.gotmpl": MustAsset("templates/tupleserializer.gotmpl"), - "additionalpropertiesserializer.gotmpl": MustAsset("templates/additionalpropertiesserializer.gotmpl"), - "schematype.gotmpl": MustAsset("templates/schematype.gotmpl"), - "schemabody.gotmpl": MustAsset("templates/schemabody.gotmpl"), - "schema.gotmpl": MustAsset("templates/schema.gotmpl"), - "schemavalidator.gotmpl": MustAsset("templates/schemavalidator.gotmpl"), - "model.gotmpl": MustAsset("templates/model.gotmpl"), - "header.gotmpl": MustAsset("templates/header.gotmpl"), - "swagger_json_embed.gotmpl": MustAsset("templates/swagger_json_embed.gotmpl"), - - "server/parameter.gotmpl": MustAsset("templates/server/parameter.gotmpl"), - "server/urlbuilder.gotmpl": MustAsset("templates/server/urlbuilder.gotmpl"), - "server/responses.gotmpl": MustAsset("templates/server/responses.gotmpl"), - "server/operation.gotmpl": MustAsset("templates/server/operation.gotmpl"), - "server/builder.gotmpl": MustAsset("templates/server/builder.gotmpl"), - "server/server.gotmpl": MustAsset("templates/server/server.gotmpl"), - "server/configureapi.gotmpl": MustAsset("templates/server/configureapi.gotmpl"), - "server/main.gotmpl": MustAsset("templates/server/main.gotmpl"), - "server/doc.gotmpl": MustAsset("templates/server/doc.gotmpl"), - - "client/parameter.gotmpl": MustAsset("templates/client/parameter.gotmpl"), - "client/response.gotmpl": MustAsset("templates/client/response.gotmpl"), - "client/client.gotmpl": MustAsset("templates/client/client.gotmpl"), - "client/facade.gotmpl": MustAsset("templates/client/facade.gotmpl"), +func defaultAssets() map[string][]byte { + return map[string][]byte{ + // schema validation templates + "validation/primitive.gotmpl": MustAsset("templates/validation/primitive.gotmpl"), + "validation/customformat.gotmpl": MustAsset("templates/validation/customformat.gotmpl"), + "validation/structfield.gotmpl": MustAsset("templates/validation/structfield.gotmpl"), + "structfield.gotmpl": MustAsset("templates/structfield.gotmpl"), + "schemavalidator.gotmpl": MustAsset("templates/schemavalidator.gotmpl"), + "schemapolymorphic.gotmpl": MustAsset("templates/schemapolymorphic.gotmpl"), + "schemaembedded.gotmpl": MustAsset("templates/schemaembedded.gotmpl"), + + // schema serialization templates + "additionalpropertiesserializer.gotmpl": MustAsset("templates/serializers/additionalpropertiesserializer.gotmpl"), + "aliasedserializer.gotmpl": MustAsset("templates/serializers/aliasedserializer.gotmpl"), + "allofserializer.gotmpl": MustAsset("templates/serializers/allofserializer.gotmpl"), + "basetypeserializer.gotmpl": MustAsset("templates/serializers/basetypeserializer.gotmpl"), + "marshalbinaryserializer.gotmpl": MustAsset("templates/serializers/marshalbinaryserializer.gotmpl"), + "schemaserializer.gotmpl": MustAsset("templates/serializers/schemaserializer.gotmpl"), + "subtypeserializer.gotmpl": MustAsset("templates/serializers/subtypeserializer.gotmpl"), + "tupleserializer.gotmpl": MustAsset("templates/serializers/tupleserializer.gotmpl"), + + // schema generation template + "docstring.gotmpl": MustAsset("templates/docstring.gotmpl"), + "schematype.gotmpl": MustAsset("templates/schematype.gotmpl"), + "schemabody.gotmpl": MustAsset("templates/schemabody.gotmpl"), + "schema.gotmpl": MustAsset("templates/schema.gotmpl"), + "model.gotmpl": MustAsset("templates/model.gotmpl"), + "header.gotmpl": MustAsset("templates/header.gotmpl"), + + "swagger_json_embed.gotmpl": MustAsset("templates/swagger_json_embed.gotmpl"), + + // server templates + "server/parameter.gotmpl": MustAsset("templates/server/parameter.gotmpl"), + "server/urlbuilder.gotmpl": MustAsset("templates/server/urlbuilder.gotmpl"), + "server/responses.gotmpl": MustAsset("templates/server/responses.gotmpl"), + "server/operation.gotmpl": MustAsset("templates/server/operation.gotmpl"), + "server/builder.gotmpl": MustAsset("templates/server/builder.gotmpl"), + "server/server.gotmpl": MustAsset("templates/server/server.gotmpl"), + "server/configureapi.gotmpl": MustAsset("templates/server/configureapi.gotmpl"), + "server/main.gotmpl": MustAsset("templates/server/main.gotmpl"), + "server/doc.gotmpl": MustAsset("templates/server/doc.gotmpl"), + + // client templates + "client/parameter.gotmpl": MustAsset("templates/client/parameter.gotmpl"), + "client/response.gotmpl": MustAsset("templates/client/response.gotmpl"), + "client/client.gotmpl": MustAsset("templates/client/client.gotmpl"), + "client/facade.gotmpl": MustAsset("templates/client/facade.gotmpl"), + } } -var protectedTemplates = map[string]bool{ - "schemabody": true, - "privtuplefield": true, - "withoutBaseTypeBody": true, - "swaggerJsonEmbed": true, - "validationCustomformat": true, - "tuplefield": true, - "header": true, - "withBaseTypeBody": true, - "primitivefieldvalidator": true, - "mapvalidator": true, - "propertyValidationDocString": true, - "typeSchemaType": true, - "docstring": true, - "dereffedSchemaType": true, - "model": true, - "modelvalidator": true, - "privstructfield": true, - "schemavalidator": true, - "tuplefieldIface": true, - "tupleSerializer": true, - "tupleserializer": true, - "schemaSerializer": true, - "propertyvalidator": true, - "structfieldIface": true, - "schemaBody": true, - "objectvalidator": true, - "schematype": true, - "additionalpropertiesserializer": true, - "slicevalidator": true, - "validationStructfield": true, - "validationPrimitive": true, - "schemaType": true, - "subTypeBody": true, - "schema": true, - "additionalPropertiesSerializer": true, - "serverDoc": true, - "structfield": true, - "hasDiscriminatedSerializer": true, - "discriminatedSerializer": true, +func defaultProtectedTemplates() map[string]bool { + return map[string]bool{ + "dereffedSchemaType": true, + "docstring": true, + "header": true, + "mapvalidator": true, + "model": true, + "modelvalidator": true, + "objectvalidator": true, + "primitivefieldvalidator": true, + "privstructfield": true, + "privtuplefield": true, + "propertyValidationDocString": true, + "propertyvalidator": true, + "schema": true, + "schemaBody": true, + "schemaType": true, + "schemabody": true, + "schematype": true, + "schemavalidator": true, + "serverDoc": true, + "slicevalidator": true, + "structfield": true, + "structfieldIface": true, + "subTypeBody": true, + "swaggerJsonEmbed": true, + "tuplefield": true, + "tuplefieldIface": true, + "typeSchemaType": true, + "validationCustomformat": true, + "validationPrimitive": true, + "validationStructfield": true, + "withBaseTypeBody": true, + "withoutBaseTypeBody": true, + + // all serializers TODO(fred) + "additionalPropertiesSerializer": true, + "tupleSerializer": true, + "schemaSerializer": true, + "hasDiscriminatedSerializer": true, + "discriminatedSerializer": true, + } } // AddFile adds a file to the default repository. It will create a new template based on the filename. @@ -202,36 +192,6 @@ func AddFile(name, data string) error { return templates.addFile(name, data, false) } -func asJSON(data interface{}) (string, error) { - b, err := json.Marshal(data) - if err != nil { - return "", err - } - return string(b), nil -} - -func asPrettyJSON(data interface{}) (string, error) { - b, err := json.MarshalIndent(data, "", " ") - if err != nil { - return "", err - } - return string(b), nil -} - -func goSliceInitializer(data interface{}) (string, error) { - // goSliceInitializer constructs a Go literal initializer from interface{} literals. - // e.g. []interface{}{"a", "b"} is transformed in {"a","b",} - // e.g. map[string]interface{}{ "a": "x", "b": "y"} is transformed in {"a":"x","b":"y",}. - // - // NOTE: this is currently used to construct simple slice intializers for default values. - // This allows for nicer slice initializers for slices of primitive types and avoid systematic use for json.Unmarshal(). - b, err := json.Marshal(data) - if err != nil { - return "", err - } - return strings.Replace(strings.Replace(strings.Replace(string(b), "}", ",}", -1), "[", "{", -1), "]", ",}", -1), nil -} - // NewRepository creates a new template repository with the provided functions defined func NewRepository(funcs template.FuncMap) *Repository { repo := Repository{ @@ -273,8 +233,6 @@ func (t *Repository) LoadDir(templatePath string) error { if assetName, e := filepath.Rel(templatePath, path); e == nil { if data, e := ioutil.ReadFile(path); e == nil { if ee := t.AddFile(assetName, string(data)); ee != nil { - // Fatality is decided by caller - // log.Fatal(ee) return fmt.Errorf("could not add template: %v", ee) } } @@ -515,3 +473,110 @@ func (t *Repository) DumpTemplates() { } log.Println(buf.String()) } + +// FuncMap functions + +func asJSON(data interface{}) (string, error) { + b, err := json.Marshal(data) + if err != nil { + return "", err + } + return string(b), nil +} + +func asPrettyJSON(data interface{}) (string, error) { + b, err := json.MarshalIndent(data, "", " ") + if err != nil { + return "", err + } + return string(b), nil +} + +func pluralizeFirstWord(arg string) string { + sentence := strings.Split(arg, " ") + if len(sentence) == 1 { + return inflect.Pluralize(arg) + } + + return inflect.Pluralize(sentence[0]) + " " + strings.Join(sentence[1:], " ") +} + +func dropPackage(str string) string { + parts := strings.Split(str, ".") + return parts[len(parts)-1] +} + +func padSurround(entry, padWith string, i, ln int) string { + var res []string + if i > 0 { + for j := 0; j < i; j++ { + res = append(res, padWith) + } + } + res = append(res, entry) + tot := ln - i - 1 + for j := 0; j < tot; j++ { + res = append(res, padWith) + } + return strings.Join(res, ",") +} + +func padComment(str string, pads ...string) string { + // pads specifes padding to indent multi line comments.Defaults to one space + pad := " " + lines := strings.Split(str, "\n") + if len(pads) > 0 { + pad = strings.Join(pads, "") + } + return (strings.Join(lines, "\n//"+pad)) +} + +func blockComment(str string) string { + return strings.Replace(str, "*/", "[*]/", -1) +} + +func pascalize(arg string) string { + runes := []rune(arg) + switch len(runes) { + case 0: + return "Empty" + case 1: // handle special case when we have a single rune that is not handled by swag.ToGoName + switch runes[0] { + case '+', '-', '#', '_': // those cases are handled differently than swag utility + return prefixForName(arg) + } + } + return swag.ToGoName(swag.ToGoName(arg)) // want to remove spaces +} + +func prefixForName(arg string) string { + first := []rune(arg)[0] + if len(arg) == 0 || unicode.IsLetter(first) { + return "" + } + switch first { + case '+': + return "Plus" + case '-': + return "Minus" + case '#': + return "HashTag" + // other cases ($,@ etc..) handled by swag.ToGoName + } + return "Nr" +} + +func dict(values ...interface{}) (map[string]interface{}, error) { + if len(values)%2 != 0 { + return nil, fmt.Errorf("expected even number of arguments, got %d", len(values)) + } + dict := make(map[string]interface{}, len(values)/2) + for i := 0; i < len(values); i += 2 { + key, ok := values[i].(string) + if !ok { + return nil, fmt.Errorf("expected string key, got %+v", values[i]) + } + dict[key] = values[i+1] + } + return dict, nil +} diff --git a/vendor/github.com/go-swagger/go-swagger/generator/types.go b/vendor/github.com/go-swagger/go-swagger/generator/types.go index 2125a88d53..e4d2493a37 100644 --- a/vendor/github.com/go-swagger/go-swagger/generator/types.go +++ b/vendor/github.com/go-swagger/go-swagger/generator/types.go @@ -25,6 +25,7 @@ import ( "github.com/go-openapi/spec" "github.com/go-openapi/swag" "github.com/kr/pretty" + "github.com/mitchellh/mapstructure" ) const ( @@ -37,27 +38,31 @@ const ( str = "string" object = "object" binary = "binary" - sHTTP = "http" body = "body" + b64 = "byte" ) // Extensions supported by go-swagger const ( - xClass = "x-class" // class name used by discriminator - xGoCustomTag = "x-go-custom-tag" // additional tag for serializers on struct fields - xGoName = "x-go-name" // name of the generated go variable - xGoType = "x-go-type" // reuse existing type (do not generate) - xIsNullable = "x-isnullable" - xNullable = "x-nullable" // turns the schema into a pointer - xOmitEmpty = "x-omitempty" - xSchemes = "x-schemes" // additional schemes supported for operations (server generation) - xOrder = "x-order" // sort order for properties (or any schema) + xClass = "x-class" // class name used by discriminator + xGoCustomTag = "x-go-custom-tag" // additional tag for serializers on struct fields + xGoName = "x-go-name" // name of the generated go variable + xGoType = "x-go-type" // reuse existing type (do not generate) + xIsNullable = "x-isnullable" + xNullable = "x-nullable" // turns the schema into a pointer + xOmitEmpty = "x-omitempty" + xSchemes = "x-schemes" // additional schemes supported for operations (server generation) + xOrder = "x-order" // sort order for properties (or any schema) + xGoJSONString = "x-go-json-string" + xGoEnumCI = "x-go-enum-ci" // make string enumeration case-insensitive + + xGoOperationTag = "x-go-operation-tag" // additional tag to override generation in operation groups ) -// swaggerTypeMapping contains a mapping from go type to swagger type or format +// swaggerTypeName contains a mapping from go type to swagger type or format var swaggerTypeName map[string]string -func init() { +func initTypes() { swaggerTypeName = make(map[string]string) for k, v := range typeMapping { swaggerTypeName[v] = k @@ -86,6 +91,8 @@ func simpleResolvedType(tn, fmt string, items *spec.Items) (result resolvedType) // special case of swagger format "binary", rendered as io.ReadCloser interface // TODO(fredbi): should set IsCustomFormatter=false when binary result.IsStream = fmt == binary + // special case of swagger format "byte", rendered as a strfmt.Base64 type: no validation + result.IsBase64 = fmt == b64 return } } @@ -134,16 +141,15 @@ func newTypeResolver(pkg string, doc *loads.Document) *typeResolver { func knownDefGoType(def string, schema spec.Schema, clear func(string) string) (string, string, string) { debugLog("known def type: %q", def) ext := schema.Extensions - if nm, ok := ext.GetString(xGoName); ok { - if clear == nil { - debugLog("known def type %s no clear: %q", xGoName, nm) - return nm, "", "" - } - debugLog("known def type %s clear: %q -> %q", xGoName, nm, clear(nm)) - return clear(nm), "", "" + nm, hasGoName := ext.GetString(xGoName) + + if hasGoName { + debugLog("known def type %s named from %s as %q", def, xGoName, nm) + def = nm } - v, ok := ext[xGoType] - if !ok { + extType, isExternalType := hasExternalType(ext) + + if !isExternalType || extType.Embedded { if clear == nil { debugLog("known def type no clear: %q", def) return def, "", "" @@ -151,25 +157,51 @@ func knownDefGoType(def string, schema spec.Schema, clear func(string) string) ( debugLog("known def type clear: %q -> %q", def, clear(def)) return clear(def), "", "" } - xt := v.(map[string]interface{}) - t := xt["type"].(string) - impIface, ok := xt["import"] + // external type definition trumps regular type resolution + log.Printf("type %s imported as external type %s.%s", def, extType.Import.Package, extType.Type) + return extType.Import.Alias + "." + extType.Type, extType.Import.Package, extType.Import.Alias +} + +// x-go-type: +// type: mytype +// import: +// package: +// alias: +// hints: +// kind: map|object|array|interface|primitive|stream|tuple +// nullable: true|false +// embedded: true +type externalTypeDefinition struct { + Type string + Import struct { + Package string + Alias string + } + Hints struct { + Kind string + Nullable bool + } + Embedded bool +} + +func hasExternalType(ext spec.Extensions) (*externalTypeDefinition, bool) { + v, ok := ext[xGoType] if !ok { - return t, "", "" + return nil, false } - - imp := impIface.(map[string]interface{}) - pkg := imp["package"].(string) - al, ok := imp["alias"] - var alias string - if ok { - alias = al.(string) - } else { - alias = path.Base(pkg) + var extType externalTypeDefinition + err := mapstructure.Decode(v, &extType) + if err != nil { + log.Printf("warning: x-go-type extension could not be decoded (%v). Skipped", v) + return nil, false + } + if extType.Import.Package != "" && extType.Import.Alias == "" { + // NOTE(fred): possible name conflict here (TODO(fred): deconflict this default alias) + extType.Import.Alias = path.Base(extType.Import.Package) } - debugLog("known def type %s no clear: %q: pkg=%s, alias=%s", xGoType, alias+"."+t, pkg, alias) - return alias + "." + t, pkg, alias + debugLogAsJSON("known def external %s type", xGoType, extType) + return &extType, true } type typeResolver struct { @@ -218,40 +250,39 @@ func (t *typeResolver) IsNullable(schema *spec.Schema) bool { } func (t *typeResolver) resolveSchemaRef(schema *spec.Schema, isRequired bool) (returns bool, result resolvedType, err error) { - if schema.Ref.String() != "" { - debugLog("resolving ref (anon: %t, req: %t) %s", false, isRequired, schema.Ref.String()) - returns = true - var ref *spec.Schema - var er error - - ref, er = spec.ResolveRef(t.Doc.Spec(), &schema.Ref) - if er != nil { - debugLog("error resolving ref %s: %v", schema.Ref.String(), er) - err = er - return - } - res, er := t.ResolveSchema(ref, false, isRequired) - if er != nil { - err = er - return - } - result = res + if schema.Ref.String() == "" { + return + } + debugLog("resolving ref (anon: %t, req: %t) %s", false, isRequired, schema.Ref.String()) + returns = true + var ref *spec.Schema + var er error - tn := filepath.Base(schema.Ref.GetURL().Fragment) - tpe, pkg, alias := knownDefGoType(tn, *ref, t.goTypeName) - debugLog("type name %s, package %s, alias %s", tpe, pkg, alias) - if tpe != "" { - result.GoType = tpe - result.Pkg = pkg - result.PkgAlias = alias - } - result.HasDiscriminator = res.HasDiscriminator - result.IsBaseType = result.HasDiscriminator - result.IsNullable = t.IsNullable(ref) - //result.IsAliased = true + ref, er = spec.ResolveRef(t.Doc.Spec(), &schema.Ref) + if er != nil { + debugLog("error resolving ref %s: %v", schema.Ref.String(), er) + err = er return + } + res, er := t.ResolveSchema(ref, false, isRequired) + if er != nil { + err = er + return + } + result = res + tn := filepath.Base(schema.Ref.GetURL().Fragment) + tpe, pkg, alias := knownDefGoType(tn, *ref, t.goTypeName) + debugLog("type name %s, package %s, alias %s", tpe, pkg, alias) + if tpe != "" { + result.GoType = tpe + result.Pkg = pkg + result.PkgAlias = alias } + result.HasDiscriminator = res.HasDiscriminator + result.IsBaseType = result.HasDiscriminator + result.IsNullable = t.IsNullable(ref) + result.IsEnumCI = false return } @@ -293,6 +324,7 @@ func (t *typeResolver) resolveFormat(schema *spec.Schema, isAnonymous bool, isRe // TODO: should set IsCustomFormatter=false in this case. result.IsPrimitive = schFmt != binary result.IsStream = schFmt == binary + result.IsBase64 = schFmt == b64 // propagate extensions in resolvedType result.Extensions = schema.Extensions @@ -324,21 +356,6 @@ func (t *typeResolver) isNullable(schema *spec.Schema) bool { return len(schema.Properties) > 0 } -func setIsEmptyOmitted(result *resolvedType, schema *spec.Schema, tpe string) { - defaultValue := true - if tpe == array { - defaultValue = false - } - v, found := schema.Extensions[xOmitEmpty] - if !found { - result.IsEmptyOmitted = defaultValue - return - } - - omitted, cast := v.(bool) - result.IsEmptyOmitted = omitted && cast -} - func (t *typeResolver) firstType(schema *spec.Schema) string { if len(schema.Type) == 0 || schema.Type[0] == "" { return object @@ -396,6 +413,7 @@ func (t *typeResolver) resolveArray(schema *spec.Schema, isAnonymous, isRequired result.ElemType = &rt result.SwaggerType = array result.SwaggerFormat = "" + result.IsEnumCI = hasEnumCI(schema.Extensions) t.inferAliasing(&result, schema, isAnonymous, isRequired) result.Extensions = schema.Extensions @@ -627,29 +645,97 @@ func boolExtension(ext spec.Extensions, key string) *bool { return nil } +func hasEnumCI(ve spec.Extensions) bool { + v, ok := ve[xGoEnumCI] + if !ok { + return false + } + + isEnumCI, ok := v.(bool) + // All enumeration types are case-sensitive by default + return ok && isEnumCI +} + +func (t *typeResolver) shortCircuitResolveExternal(tpe, pkg, alias string, extType *externalTypeDefinition, schema *spec.Schema) resolvedType { + // short circuit type resolution for external types + var result resolvedType + result.Extensions = schema.Extensions + result.GoType = tpe + result.Pkg = pkg + result.PkgAlias = alias + result.setKind(extType.Hints.Kind) + result.IsNullable = t.IsNullable(schema) + + // other extensions + if result.IsArray { + result.IsEmptyOmitted = false + tpe = "array" + } + result.setExtensions(schema, tpe) + return result +} + func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequired bool) (result resolvedType, err error) { debugLog("resolving schema (anon: %t, req: %t) %s", isAnonymous, isRequired, t.ModelName) + defer func() { + debugLog("returning after resolve schema: %s", pretty.Sprint(result)) + }() + if schema == nil { result.IsInterface = true result.GoType = iface return } - tpe := t.firstType(schema) - defer setIsEmptyOmitted(&result, schema, tpe) + extType, isExternalType := hasExternalType(schema.Extensions) + if isExternalType { + tpe, pkg, alias := knownDefGoType(t.ModelName, *schema, t.goTypeName) + debugLog("found type declared as external, imported from %s as %s. Has type hints? %t, rendered has embedded? %t", + pkg, tpe, extType.Hints.Kind != "", extType.Embedded) + + if extType.Hints.Kind != "" && !extType.Embedded { + // use hint to qualify type + debugLog("short circuits external type resolution with hint for %s", tpe) + result = t.shortCircuitResolveExternal(tpe, pkg, alias, extType, schema) + return + } + + // use spec to qualify type + debugLog("marking type %s as external embedded: %t", tpe, extType.Embedded) + // mark this type as an embedded external definition if requested + defer func() { + result.IsEmbedded = extType.Embedded + if result.IsEmbedded { + result.ElemType = &resolvedType{ + GoType: extType.Import.Alias + "." + extType.Type, + Pkg: extType.Import.Package, + PkgAlias: extType.Import.Alias, + IsNullable: extType.Hints.Nullable, + } + result.setKind(extType.Hints.Kind) + } + }() + } + tpe := t.firstType(schema) var returns bool + returns, result, err = t.resolveSchemaRef(schema, isRequired) + if returns { if !isAnonymous { result.IsMap = false result.IsComplexObject = true debugLog("not anonymous ref") } - debugLog("returning after ref") + debugLog("anonymous after ref") return } + defer func() { + result.setExtensions(schema, tpe) + }() + // special case of swagger type "file", rendered as io.ReadCloser interface if t.firstType(schema) == file { result.SwaggerType = file @@ -662,7 +748,6 @@ func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequire returns, result, err = t.resolveFormat(schema, isAnonymous, isRequired) if returns { - debugLog("returning after resolve format: %s", pretty.Sprint(result)) return } @@ -671,7 +756,6 @@ func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequire switch tpe { case array: result, err = t.resolveArray(schema, isAnonymous, false) - return case file, number, integer, boolean: result.Extensions = schema.Extensions @@ -690,7 +774,6 @@ func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequire result.IsNullable = nullableNumber(schema, isRequired) case file: } - return case str: result.GoType = str @@ -704,23 +787,21 @@ func (t *typeResolver) ResolveSchema(schema *spec.Schema, isAnonymous, isRequire case object: result, err = t.resolveObject(schema, isAnonymous) if err != nil { - return resolvedType{}, err + result = resolvedType{} + break } result.HasDiscriminator = schema.Discriminator != "" - return case "null": result.GoType = iface result.SwaggerType = object result.IsNullable = false result.IsInterface = true - return default: err = fmt.Errorf("unresolvable: %v (format %q)", schema.Type, schema.Format) - return } - return result, err + return } // resolvedType is a swagger type that has been resolved and analyzed for usage @@ -736,6 +817,9 @@ type resolvedType struct { IsNullable bool IsStream bool IsEmptyOmitted bool + IsJSONString bool + IsEnumCI bool + IsBase64 bool // A tuple gets rendered as an anonymous struct with P{index} as property name IsTuple bool @@ -766,6 +850,11 @@ type resolvedType struct { // IsSuperAlias indicates that the aliased type is really the same type, // e.g. in golang, this translates to: type A = B IsSuperAlias bool + + // IsEmbedded applies to externally defined types. When embedded, a type + // is generated in models that embeds the external type, with the Validate + // method. + IsEmbedded bool } func (rt *resolvedType) Zero() string { @@ -799,3 +888,102 @@ func (rt *resolvedType) Zero() string { return "" } + +func (rt *resolvedType) setExtensions(schema *spec.Schema, origType string) { + rt.IsEnumCI = hasEnumCI(schema.Extensions) + rt.setIsEmptyOmitted(schema, origType) + rt.setIsJSONString(schema, origType) +} + +func (rt *resolvedType) setIsEmptyOmitted(schema *spec.Schema, tpe string) { + if v, found := schema.Extensions[xOmitEmpty]; found { + omitted, cast := v.(bool) + rt.IsEmptyOmitted = omitted && cast + return + } + // array of primitives are by default not empty-omitted, but arrays of aliased type are + rt.IsEmptyOmitted = (tpe != array) || (tpe == array && rt.IsAliased) +} + +func (rt *resolvedType) setIsJSONString(schema *spec.Schema, tpe string) { + _, found := schema.Extensions[xGoJSONString] + if !found { + rt.IsJSONString = false + return + } + rt.IsJSONString = true +} + +func (rt *resolvedType) setKind(kind string) { + if kind != "" { + debugLog("overriding kind for %s as %s", rt.GoType, kind) + } + switch kind { + case "map": + rt.IsMap = true + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = object + case "array": + rt.IsMap = false + rt.IsArray = true + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = array + case "object": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = true + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = object + case "interface", "null": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = true + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = iface + case "stream": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = true + rt.IsTuple = false + rt.IsPrimitive = false + rt.SwaggerType = file + case "tuple": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = true + rt.IsPrimitive = false + rt.SwaggerType = array + case "primitive": + rt.IsMap = false + rt.IsArray = false + rt.IsComplexObject = false + rt.IsInterface = false + rt.IsStream = false + rt.IsTuple = false + rt.IsPrimitive = true + case "": + break + default: + log.Printf("warning: unsupported hint value for external type: %q. Skipped", kind) + } +} diff --git a/vendor/github.com/go-swagger/go-swagger/scan/enum.go b/vendor/github.com/go-swagger/go-swagger/scan/enum.go new file mode 100644 index 0000000000..bfbe601ed1 --- /dev/null +++ b/vendor/github.com/go-swagger/go-swagger/scan/enum.go @@ -0,0 +1,83 @@ +// +build !go1.11 + +package scan + +import ( + "go/ast" + "strconv" + "strings" + "unicode" +) + +func upperSnakeCase(s string) string { + in := []rune(s) + isLower := func(idx int) bool { + return idx >= 0 && idx < len(in) && unicode.IsLower(in[idx]) + } + + out := make([]rune, 0, len(in)+len(in)/2) + + for i, r := range in { + if unicode.IsUpper(r) { + r = unicode.ToLower(r) + if i > 0 && in[i-1] != '_' && (isLower(i-1) || isLower(i+1)) { + out = append(out, '_') + } + } + out = append(out, r) + } + + return strings.ToUpper(string(out)) +} + +func getEnumBasicLitValue(basicLit *ast.BasicLit) interface{} { + switch basicLit.Kind.String() { + case "INT": + if result, err := strconv.ParseInt(basicLit.Value, 10, 64); err == nil { + return result + } + case "FLOAT": + if result, err := strconv.ParseFloat(basicLit.Value, 64); err == nil { + return result + } + default: + return strings.Trim(basicLit.Value, "\"") + } + return nil +} + +func getEnumValues(file *ast.File, typeName string) (list []interface{}) { + for _, decl := range file.Decls { + genDecl, ok := decl.(*ast.GenDecl) + + if !ok { + continue + } + + if genDecl.Tok.String() == "const" { + for _, spec := range genDecl.Specs { + if valueSpec, ok := spec.(*ast.ValueSpec); ok { + switch valueSpec.Type.(type) { + case *ast.Ident: + if valueSpec.Type.(*ast.Ident).Name == typeName { + if basicLit, ok := valueSpec.Values[0].(*ast.BasicLit); ok { + list = append(list, getEnumBasicLitValue(basicLit)) + } + } + default: + var name = valueSpec.Names[0].Name + if strings.HasPrefix(name, upperSnakeCase(typeName)) { + var values = strings.SplitN(name, "__", 2) + if len(values) == 2 { + list = append(list, values[1]) + } + } + } + + } + + } + } + } + return +} diff --git a/vendor/github.com/go-swagger/go-swagger/scan/parameters.go b/vendor/github.com/go-swagger/go-swagger/scan/parameters.go index a97c34d1a5..00d79fc13b 100644 --- a/vendor/github.com/go-swagger/go-swagger/scan/parameters.go +++ b/vendor/github.com/go-swagger/go-swagger/scan/parameters.go @@ -40,6 +40,10 @@ func (pt paramTypable) Typed(tpe, format string) { pt.param.Typed(tpe, format) } +func (pt paramTypable) WithEnum(values ...interface{}) { + pt.param.WithEnum(values...) +} + func (pt paramTypable) SetRef(ref spec.Ref) { pt.param.Ref = ref } @@ -83,6 +87,10 @@ func (pt itemsTypable) SetRef(ref spec.Ref) { pt.items.Ref = ref } +func (pt itemsTypable) WithEnum(values ...interface{}) { + pt.items.WithEnum(values...) +} + func (pt itemsTypable) Schema() *spec.Schema { return nil } diff --git a/vendor/github.com/go-swagger/go-swagger/scan/responses.go b/vendor/github.com/go-swagger/go-swagger/scan/responses.go index 7b08b16b0c..3710ae0d8c 100644 --- a/vendor/github.com/go-swagger/go-swagger/scan/responses.go +++ b/vendor/github.com/go-swagger/go-swagger/scan/responses.go @@ -38,6 +38,10 @@ func (ht responseTypable) Typed(tpe, format string) { ht.header.Typed(tpe, format) } +func (ht responseTypable) WithEnum(values ...interface{}) { + ht.header.WithEnum(values) +} + func bodyTypable(in string, schema *spec.Schema) (swaggerTypable, *spec.Schema) { if in == "body" { // get the schema for items on the schema property @@ -85,6 +89,7 @@ func (ht responseTypable) Schema() *spec.Schema { func (ht responseTypable) SetSchema(schema *spec.Schema) { ht.response.Schema = schema } + func (ht responseTypable) CollectionOf(items *spec.Items, format string) { ht.header.CollectionOf(items, format) } diff --git a/vendor/github.com/go-swagger/go-swagger/scan/scanner.go b/vendor/github.com/go-swagger/go-swagger/scan/scanner.go index 98c5330587..283ee6a3d6 100644 --- a/vendor/github.com/go-swagger/go-swagger/scan/scanner.go +++ b/vendor/github.com/go-swagger/go-swagger/scan/scanner.go @@ -471,6 +471,7 @@ type swaggerTypable interface { Typed(string, string) SetRef(spec.Ref) Items() swaggerTypable + WithEnum(...interface{}) Schema() *spec.Schema Level() int } diff --git a/vendor/github.com/go-swagger/go-swagger/scan/schema.go b/vendor/github.com/go-swagger/go-swagger/scan/schema.go index 7fc14d6a98..fb85dd9b0c 100644 --- a/vendor/github.com/go-swagger/go-swagger/scan/schema.go +++ b/vendor/github.com/go-swagger/go-swagger/scan/schema.go @@ -81,8 +81,13 @@ func (st schemaTypable) AdditionalProperties() swaggerTypable { st.schema.Typed("object", "") return schemaTypable{st.schema.AdditionalProperties.Schema, st.level + 1} } + func (st schemaTypable) Level() int { return st.level } +func (st schemaTypable) WithEnum(values ...interface{}) { + st.schema.WithEnum(values...) +} + type schemaValidations struct { current *spec.Schema } @@ -248,6 +253,18 @@ func (scp *schemaParser) parseDecl(definitions map[string]spec.Schema, decl *sch return err } } + if enumName, ok := enumName(decl.Decl.Doc); ok { + var enumValues = getEnumValues(decl.File, enumName) + if len(enumValues) > 0 { + var typeName = reflect.TypeOf(enumValues[0]).String() + prop.WithEnum(enumValues...) + + err := swaggerSchemaForType(typeName, prop) + if err != nil { + return fmt.Errorf("file %s, error is: %v", decl.File.Name, err) + } + } + } case *ast.SelectorExpr: prop := &schemaTypable{schPtr, 0} if strfmtName, ok := strfmtName(decl.Decl.Doc); ok { @@ -1025,8 +1042,15 @@ func (scp *schemaParser) parseIdentProperty(pkg *loader.PackageInfo, expr *ast.I } if enumName, ok := enumName(gd.Doc); ok { - log.Println(enumName) - return nil + var enumValues = getEnumValues(file, enumName) + if len(enumValues) > 0 { + prop.WithEnum(enumValues...) + var typeName = reflect.TypeOf(enumValues[0]).String() + err := swaggerSchemaForType(typeName, prop) + if err != nil { + return fmt.Errorf("file %s, error is: %v", file.Name, err) + } + } } if defaultName, ok := defaultName(gd.Doc); ok { diff --git a/vendor/github.com/golang/protobuf/proto/deprecated.go b/vendor/github.com/golang/protobuf/proto/deprecated.go index a205482a32..e8db57e097 100644 --- a/vendor/github.com/golang/protobuf/proto/deprecated.go +++ b/vendor/github.com/golang/protobuf/proto/deprecated.go @@ -9,6 +9,8 @@ import ( "errors" "fmt" "strconv" + + protoV2 "google.golang.org/protobuf/proto" ) var ( @@ -82,11 +84,30 @@ func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, return val, nil } -// Deprecated: Do not use. +// Deprecated: Do not use; this type existed for intenal-use only. type InternalMessageInfo struct{} -func (*InternalMessageInfo) DiscardUnknown(Message) { panic("not implemented") } -func (*InternalMessageInfo) Marshal([]byte, Message, bool) ([]byte, error) { panic("not implemented") } -func (*InternalMessageInfo) Merge(Message, Message) { panic("not implemented") } -func (*InternalMessageInfo) Size(Message) int { panic("not implemented") } -func (*InternalMessageInfo) Unmarshal(Message, []byte) error { panic("not implemented") } +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) DiscardUnknown(m Message) { + DiscardUnknown(m) +} + +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) Marshal(b []byte, m Message, deterministic bool) ([]byte, error) { + return protoV2.MarshalOptions{Deterministic: deterministic}.MarshalAppend(b, MessageV2(m)) +} + +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) Merge(dst, src Message) { + protoV2.Merge(MessageV2(dst), MessageV2(src)) +} + +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) Size(m Message) int { + return protoV2.Size(MessageV2(m)) +} + +// Deprecated: Do not use; this method existed for intenal-use only. +func (*InternalMessageInfo) Unmarshal(m Message, b []byte) error { + return protoV2.UnmarshalOptions{Merge: true}.Unmarshal(b, MessageV2(m)) +} diff --git a/vendor/github.com/kr/pretty/License b/vendor/github.com/kr/pretty/License index 05c783ccf6..480a328059 100644 --- a/vendor/github.com/kr/pretty/License +++ b/vendor/github.com/kr/pretty/License @@ -1,5 +1,3 @@ -The MIT License (MIT) - Copyright 2012 Keith Rarick Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/vendor/github.com/kr/pretty/formatter.go b/vendor/github.com/kr/pretty/formatter.go index a317d7b8ee..df61d8d19e 100644 --- a/vendor/github.com/kr/pretty/formatter.go +++ b/vendor/github.com/kr/pretty/formatter.go @@ -125,7 +125,6 @@ func (p *printer) printValue(v reflect.Value, showType, quote bool) { } keys := v.MapKeys() for i := 0; i < v.Len(); i++ { - showTypeInStruct := true k := keys[i] mv := v.MapIndex(k) pp.printValue(k, false, true) @@ -133,7 +132,7 @@ func (p *printer) printValue(v reflect.Value, showType, quote bool) { if expand { writeByte(pp, '\t') } - showTypeInStruct = t.Elem().Kind() == reflect.Interface + showTypeInStruct := t.Elem().Kind() == reflect.Interface pp.printValue(mv, showTypeInStruct, true) if expand { io.WriteString(pp, ",\n") diff --git a/vendor/github.com/kr/pretty/go.mod b/vendor/github.com/kr/pretty/go.mod index 1e29533143..9a27b6e964 100644 --- a/vendor/github.com/kr/pretty/go.mod +++ b/vendor/github.com/kr/pretty/go.mod @@ -1,3 +1,5 @@ -module "github.com/kr/pretty" +module github.com/kr/pretty -require "github.com/kr/text" v0.1.0 +go 1.12 + +require github.com/kr/text v0.1.0 diff --git a/vendor/github.com/kr/pretty/go.sum b/vendor/github.com/kr/pretty/go.sum new file mode 100644 index 0000000000..714f82a201 --- /dev/null +++ b/vendor/github.com/kr/pretty/go.sum @@ -0,0 +1,3 @@ +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= diff --git a/vendor/github.com/kr/pretty/pretty.go b/vendor/github.com/kr/pretty/pretty.go index 49423ec7f5..b4ca583c02 100644 --- a/vendor/github.com/kr/pretty/pretty.go +++ b/vendor/github.com/kr/pretty/pretty.go @@ -75,7 +75,7 @@ func Printf(format string, a ...interface{}) (n int, errno error) { // Println pretty-prints its operands and writes to standard output. // -// Calling Print(x, y) is equivalent to +// Calling Println(x, y) is equivalent to // fmt.Println(Formatter(x), Formatter(y)), but each operand is // formatted with "%# v". func Println(a ...interface{}) (n int, errno error) { diff --git a/vendor/github.com/mailru/easyjson/.gitignore b/vendor/github.com/mailru/easyjson/.gitignore index 26156fb4b4..fbfaf7a3f4 100644 --- a/vendor/github.com/mailru/easyjson/.gitignore +++ b/vendor/github.com/mailru/easyjson/.gitignore @@ -3,3 +3,4 @@ *.iml .idea *.swp +bin/* diff --git a/vendor/github.com/mailru/easyjson/Makefile b/vendor/github.com/mailru/easyjson/Makefile index 7b9ac94535..80449f0d27 100644 --- a/vendor/github.com/mailru/easyjson/Makefile +++ b/vendor/github.com/mailru/easyjson/Makefile @@ -18,10 +18,13 @@ generate: build ./tests/custom_map_key_type.go \ ./tests/embedded_type.go \ ./tests/reference_to_pointer.go \ + ./tests/html.go \ + ./tests/unknown_fields.go \ bin/easyjson -all ./tests/data.go bin/easyjson -all ./tests/nothing.go bin/easyjson -all ./tests/errors.go + bin/easyjson -all ./tests/html.go bin/easyjson -snake_case ./tests/snake.go bin/easyjson -omit_empty ./tests/omitempty.go bin/easyjson -build_tags=use_easyjson ./benchmark/data.go @@ -32,6 +35,7 @@ generate: build bin/easyjson ./tests/reference_to_pointer.go bin/easyjson ./tests/key_marshaler_map.go bin/easyjson -disallow_unknown_fields ./tests/disallow_unknown.go + bin/easyjson ./tests/unknown_fields.go test: generate go test \ diff --git a/vendor/github.com/mailru/easyjson/helpers.go b/vendor/github.com/mailru/easyjson/helpers.go index b86b87d228..04ac635628 100644 --- a/vendor/github.com/mailru/easyjson/helpers.go +++ b/vendor/github.com/mailru/easyjson/helpers.go @@ -26,6 +26,16 @@ type Optional interface { IsDefined() bool } +// UnknownsUnmarshaler provides a method to unmarshal unknown struct fileds and save them as you want +type UnknownsUnmarshaler interface { + UnmarshalUnknown(in *jlexer.Lexer, key string) +} + +// UnknownsMarshaler provides a method to write additional struct fields +type UnknownsMarshaler interface { + MarshalUnknowns(w *jwriter.Writer, first bool) +} + // Marshal returns data as a single byte slice. Method is suboptimal as the data is likely to be copied // from a chain of smaller chunks. func Marshal(v Marshaler) ([]byte, error) { diff --git a/vendor/github.com/mailru/easyjson/jwriter/writer.go b/vendor/github.com/mailru/easyjson/jwriter/writer.go index b9ed7ccaa8..eb8547ccc2 100644 --- a/vendor/github.com/mailru/easyjson/jwriter/writer.go +++ b/vendor/github.com/mailru/easyjson/jwriter/writer.go @@ -270,16 +270,25 @@ func (w *Writer) Bool(v bool) { const chars = "0123456789abcdef" -func isNotEscapedSingleChar(c byte, escapeHTML bool) bool { - // Note: might make sense to use a table if there are more chars to escape. With 4 chars - // it benchmarks the same. - if escapeHTML { - return c != '<' && c != '>' && c != '&' && c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf - } else { - return c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf +func getTable(falseValues ...int) [128]bool { + table := [128]bool{} + + for i := 0; i < 128; i++ { + table[i] = true + } + + for _, v := range falseValues { + table[v] = false } + + return table } +var ( + htmlEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '&', '<', '>', '\\') + htmlNoEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '\\') +) + func (w *Writer) String(s string) { w.Buffer.AppendByte('"') @@ -288,15 +297,23 @@ func (w *Writer) String(s string) { p := 0 // last non-escape symbol + var escapeTable [128]bool + if w.NoEscapeHTML { + escapeTable = htmlNoEscapeTable + } else { + escapeTable = htmlEscapeTable + } + for i := 0; i < len(s); { c := s[i] - if isNotEscapedSingleChar(c, !w.NoEscapeHTML) { - // single-width character, no escaping is required - i++ - continue - } else if c < utf8.RuneSelf { - // single-with character, need to escape + if c < utf8.RuneSelf { + if escapeTable[c] { + // single-width character, no escaping is required + i++ + continue + } + w.Buffer.AppendString(s[p:i]) switch c { case '\t': diff --git a/vendor/github.com/mailru/easyjson/unknown_fields.go b/vendor/github.com/mailru/easyjson/unknown_fields.go new file mode 100644 index 0000000000..6cfdf8300b --- /dev/null +++ b/vendor/github.com/mailru/easyjson/unknown_fields.go @@ -0,0 +1,34 @@ +package easyjson + +import ( + json "encoding/json" + + jlexer "github.com/mailru/easyjson/jlexer" + "github.com/mailru/easyjson/jwriter" +) + +// UnknownFieldsProxy implemets UnknownsUnmarshaler and UnknownsMarshaler +// use it as embedded field in your structure to parse and then serialize unknown struct fields +type UnknownFieldsProxy struct { + unknownFields map[string]interface{} +} + +func (s *UnknownFieldsProxy) UnmarshalUnknown(in *jlexer.Lexer, key string) { + if s.unknownFields == nil { + s.unknownFields = make(map[string]interface{}, 1) + } + s.unknownFields[key] = in.Interface() +} + +func (s UnknownFieldsProxy) MarshalUnknowns(out *jwriter.Writer, first bool) { + for key, val := range s.unknownFields { + if first { + first = false + } else { + out.RawByte(',') + } + out.String(string(key)) + out.RawByte(':') + out.Raw(json.Marshal(val)) + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/.travis.yml b/vendor/github.com/mitchellh/mapstructure/.travis.yml index 1689c7d735..5e31a95a8b 100644 --- a/vendor/github.com/mitchellh/mapstructure/.travis.yml +++ b/vendor/github.com/mitchellh/mapstructure/.travis.yml @@ -1,8 +1,9 @@ language: go go: - - "1.11.x" + - "1.14.x" - tip script: - go test + - go test -bench . -benchmem diff --git a/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md index 3b3cb723f8..3378f7e66e 100644 --- a/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md +++ b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md @@ -1,3 +1,39 @@ +## 1.3.2 + +* Decode into interface type with a struct value is supported [GH-187] + +## 1.3.1 + +* Squash should only squash embedded structs. [GH-194] + +## 1.3.0 + +* Added `",omitempty"` support. This will ignore zero values in the source + structure when encoding. [GH-145] + +## 1.2.3 + +* Fix duplicate entries in Keys list with pointer values. [GH-185] + +## 1.2.2 + +* Do not add unsettable (unexported) values to the unused metadata key + or "remain" value. [GH-150] + +## 1.2.1 + +* Go modules checksum mismatch fix + +## 1.2.0 + +* Added support to capture unused values in a field using the `",remain"` value + in the mapstructure tag. There is an example to showcase usage. +* Added `DecoderConfig` option to always squash embedded structs +* `json.Number` can decode into `uint` types +* Empty slices are preserved and not replaced with nil slices +* Fix panic that can occur in when decoding a map into a nil slice of structs +* Improved package documentation for godoc + ## 1.1.2 * Fix error when decode hook decodes interface implementation into interface diff --git a/vendor/github.com/mitchellh/mapstructure/go.mod b/vendor/github.com/mitchellh/mapstructure/go.mod index d2a7125620..a03ae97308 100644 --- a/vendor/github.com/mitchellh/mapstructure/go.mod +++ b/vendor/github.com/mitchellh/mapstructure/go.mod @@ -1 +1,3 @@ module github.com/mitchellh/mapstructure + +go 1.14 diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/mitchellh/mapstructure/mapstructure.go index 256ee63fbf..b384d9d928 100644 --- a/vendor/github.com/mitchellh/mapstructure/mapstructure.go +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -1,10 +1,150 @@ -// Package mapstructure exposes functionality to convert an arbitrary -// map[string]interface{} into a native Go structure. +// Package mapstructure exposes functionality to convert one arbitrary +// Go type into another, typically to convert a map[string]interface{} +// into a native Go structure. // // The Go structure can be arbitrarily complex, containing slices, // other structs, etc. and the decoder will properly decode nested // maps and so on into the proper structures in the native Go struct. // See the examples to see what the decoder is capable of. +// +// The simplest function to start with is Decode. +// +// Field Tags +// +// When decoding to a struct, mapstructure will use the field name by +// default to perform the mapping. For example, if a struct has a field +// "Username" then mapstructure will look for a key in the source value +// of "username" (case insensitive). +// +// type User struct { +// Username string +// } +// +// You can change the behavior of mapstructure by using struct tags. +// The default struct tag that mapstructure looks for is "mapstructure" +// but you can customize it using DecoderConfig. +// +// Renaming Fields +// +// To rename the key that mapstructure looks for, use the "mapstructure" +// tag and set a value directly. For example, to change the "username" example +// above to "user": +// +// type User struct { +// Username string `mapstructure:"user"` +// } +// +// Embedded Structs and Squashing +// +// Embedded structs are treated as if they're another field with that name. +// By default, the two structs below are equivalent when decoding with +// mapstructure: +// +// type Person struct { +// Name string +// } +// +// type Friend struct { +// Person +// } +// +// type Friend struct { +// Person Person +// } +// +// This would require an input that looks like below: +// +// map[string]interface{}{ +// "person": map[string]interface{}{"name": "alice"}, +// } +// +// If your "person" value is NOT nested, then you can append ",squash" to +// your tag value and mapstructure will treat it as if the embedded struct +// were part of the struct directly. Example: +// +// type Friend struct { +// Person `mapstructure:",squash"` +// } +// +// Now the following input would be accepted: +// +// map[string]interface{}{ +// "name": "alice", +// } +// +// DecoderConfig has a field that changes the behavior of mapstructure +// to always squash embedded structs. +// +// Remainder Values +// +// If there are any unmapped keys in the source value, mapstructure by +// default will silently ignore them. You can error by setting ErrorUnused +// in DecoderConfig. If you're using Metadata you can also maintain a slice +// of the unused keys. +// +// You can also use the ",remain" suffix on your tag to collect all unused +// values in a map. The field with this tag MUST be a map type and should +// probably be a "map[string]interface{}" or "map[interface{}]interface{}". +// See example below: +// +// type Friend struct { +// Name string +// Other map[string]interface{} `mapstructure:",remain"` +// } +// +// Given the input below, Other would be populated with the other +// values that weren't used (everything but "name"): +// +// map[string]interface{}{ +// "name": "bob", +// "address": "123 Maple St.", +// } +// +// Omit Empty Values +// +// When decoding from a struct to any other value, you may use the +// ",omitempty" suffix on your tag to omit that value if it equates to +// the zero value. The zero value of all types is specified in the Go +// specification. +// +// For example, the zero type of a numeric type is zero ("0"). If the struct +// field value is zero and a numeric type, the field is empty, and it won't +// be encoded into the destination type. +// +// type Source { +// Age int `mapstructure:",omitempty"` +// } +// +// Unexported fields +// +// Since unexported (private) struct fields cannot be set outside the package +// where they are defined, the decoder will simply skip them. +// +// For this output type definition: +// +// type Exported struct { +// private string // this unexported field will be skipped +// Public string +// } +// +// Using this map as input: +// +// map[string]interface{}{ +// "private": "I will be ignored", +// "Public": "I made it through!", +// } +// +// The following struct will be decoded: +// +// type Exported struct { +// private: "" // field is left with an empty string (zero value) +// Public: "I made it through!" +// } +// +// Other Configuration +// +// mapstructure is highly configurable. See the DecoderConfig struct +// for other features and options that are supported. package mapstructure import ( @@ -80,6 +220,14 @@ type DecoderConfig struct { // WeaklyTypedInput bool + // Squash will squash embedded structs. A squash tag may also be + // added to an individual struct field using a tag. For example: + // + // type Parent struct { + // Child `mapstructure:",squash"` + // } + Squash bool + // Metadata is the struct that will contain extra metadata about // the decoding. If this is nil, then no metadata will be tracked. Metadata *Metadata @@ -271,6 +419,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e var err error outputKind := getKind(outVal) + addMetaKey := true switch outputKind { case reflect.Bool: err = d.decodeBool(name, input, outVal) @@ -289,7 +438,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e case reflect.Map: err = d.decodeMap(name, input, outVal) case reflect.Ptr: - err = d.decodePtr(name, input, outVal) + addMetaKey, err = d.decodePtr(name, input, outVal) case reflect.Slice: err = d.decodeSlice(name, input, outVal) case reflect.Array: @@ -303,7 +452,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // If we reached here, then we successfully decoded SOMETHING, so // mark the key as used if we're tracking metainput. - if d.config.Metadata != nil && name != "" { + if addMetaKey && d.config.Metadata != nil && name != "" { d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) } @@ -314,7 +463,34 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // value to "data" of that type. func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { if val.IsValid() && val.Elem().IsValid() { - return d.decode(name, data, val.Elem()) + elem := val.Elem() + + // If we can't address this element, then its not writable. Instead, + // we make a copy of the value (which is a pointer and therefore + // writable), decode into that, and replace the whole value. + copied := false + if !elem.CanAddr() { + copied = true + + // Make *T + copy := reflect.New(elem.Type()) + + // *T = elem + copy.Elem().Set(elem) + + // Set elem so we decode into it + elem = copy + } + + // Decode. If we have an error then return. We also return right + // away if we're not a copy because that means we decoded directly. + if err := d.decode(name, data, elem); err != nil || !copied { + return err + } + + // If we're a copy, we need to set te final result + val.Set(elem.Elem()) + return nil } dataVal := reflect.ValueOf(data) @@ -438,6 +614,7 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { dataVal := reflect.Indirect(reflect.ValueOf(data)) dataKind := getKind(dataVal) + dataType := dataVal.Type() switch { case dataKind == reflect.Int: @@ -469,6 +646,18 @@ func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) e } else { return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Int64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) default: return fmt.Errorf( "'%s' expected type '%s', got unconvertible type '%s'", @@ -678,27 +867,31 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re } tagValue := f.Tag.Get(d.config.TagName) - tagParts := strings.Split(tagValue, ",") + keyName := f.Name + // If Squash is set in the config, we squash the field down. + squash := d.config.Squash && v.Kind() == reflect.Struct && f.Anonymous // Determine the name of the key in the map - keyName := f.Name - if tagParts[0] != "" { - if tagParts[0] == "-" { + if index := strings.Index(tagValue, ","); index != -1 { + if tagValue[:index] == "-" { + continue + } + // If "omitempty" is specified in the tag, it ignores empty values. + if strings.Index(tagValue[index+1:], "omitempty") != -1 && isEmptyValue(v) { continue } - keyName = tagParts[0] - } - // If "squash" is specified in the tag, we squash the field down. - squash := false - for _, tag := range tagParts[1:] { - if tag == "squash" { - squash = true - break + // If "squash" is specified in the tag, we squash the field down. + squash = !squash && strings.Index(tagValue[index+1:], "squash") != -1 + if squash && v.Kind() != reflect.Struct { + return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) } - } - if squash && v.Kind() != reflect.Struct { - return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + keyName = tagValue[:index] + } else if len(tagValue) > 0 { + if tagValue == "-" { + continue + } + keyName = tagValue } switch v.Kind() { @@ -738,7 +931,7 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re return nil } -func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) (bool, error) { // If the input data is nil, then we want to just set the output // pointer to be nil as well. isNil := data == nil @@ -759,7 +952,7 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er val.Set(nilValue) } - return nil + return true, nil } // Create an element of the concrete (non pointer) type and decode @@ -773,16 +966,16 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er } if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { - return err + return false, err } val.Set(realVal) } else { if err := d.decode(name, data, reflect.Indirect(val)); err != nil { - return err + return false, err } } - return nil + return false, nil } func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error { @@ -805,8 +998,8 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) valElemType := valType.Elem() sliceType := reflect.SliceOf(valElemType) - valSlice := val - if valSlice.IsNil() || d.config.ZeroFields { + // If we have a non array/slice type then we first attempt to convert. + if dataValKind != reflect.Array && dataValKind != reflect.Slice { if d.config.WeaklyTypedInput { switch { // Slice and array we use the normal logic @@ -833,18 +1026,17 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) } } - // Check input type - if dataValKind != reflect.Array && dataValKind != reflect.Slice { - return fmt.Errorf( - "'%s': source data must be an array or slice, got %s", name, dataValKind) - - } + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + } - // If the input value is empty, then don't allocate since non-nil != nil - if dataVal.Len() == 0 { - return nil - } + // If the input value is nil, then don't allocate since empty != nil + if dataVal.IsNil() { + return nil + } + valSlice := val + if valSlice.IsNil() || d.config.ZeroFields { // Make a new slice to hold our result, same size as the original data. valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) } @@ -1005,6 +1197,11 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e field reflect.StructField val reflect.Value } + + // remainField is set to a valid field set with the "remain" tag if + // we are keeping track of remaining values. + var remainField *field + fields := []field{} for len(structs) > 0 { structVal := structs[0] @@ -1017,13 +1214,21 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e fieldKind := fieldType.Type.Kind() // If "squash" is specified in the tag, we squash the field down. - squash := false + squash := d.config.Squash && fieldKind == reflect.Struct && fieldType.Anonymous + remain := false + + // We always parse the tags cause we're looking for other tags too tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") for _, tag := range tagParts[1:] { if tag == "squash" { squash = true break } + + if tag == "remain" { + remain = true + break + } } if squash { @@ -1036,8 +1241,13 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e continue } - // Normal struct field, store it away - fields = append(fields, field{fieldType, structVal.Field(i)}) + // Build our field + if remain { + remainField = &field{fieldType, structVal.Field(i)} + } else { + // Normal struct field, store it away + fields = append(fields, field{fieldType, structVal.Field(i)}) + } } } @@ -1078,9 +1288,6 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } - // Delete the key we're using from the unused map so we stop tracking - delete(dataValKeysUnused, rawMapKey.Interface()) - if !fieldValue.IsValid() { // This should never happen panic("field is not valid") @@ -1092,6 +1299,9 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e continue } + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + // If the name is empty string, then we're at the root, and we // don't dot-join the fields. if name != "" { @@ -1103,6 +1313,25 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } + // If we have a "remain"-tagged field and we have unused keys then + // we put the unused keys directly into the remain field. + if remainField != nil && len(dataValKeysUnused) > 0 { + // Build a map of only the unused values + remain := map[interface{}]interface{}{} + for key := range dataValKeysUnused { + remain[key] = dataVal.MapIndex(reflect.ValueOf(key)).Interface() + } + + // Decode it as-if we were just decoding this map onto our map. + if err := d.decodeMap(name, remain, remainField.val); err != nil { + errors = appendErrors(errors, err) + } + + // Set the map to nil so we have none so that the next check will + // not error (ErrorUnused) + dataValKeysUnused = nil + } + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { keys := make([]string, 0, len(dataValKeysUnused)) for rawKey := range dataValKeysUnused { @@ -1133,6 +1362,24 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e return nil } +func isEmptyValue(v reflect.Value) bool { + switch getKind(v) { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + 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 false +} + func getKind(val reflect.Value) reflect.Kind { kind := val.Kind() diff --git a/vendor/github.com/pelletier/go-toml/.travis.yml b/vendor/github.com/pelletier/go-toml/.travis.yml deleted file mode 100644 index abb03e997b..0000000000 --- a/vendor/github.com/pelletier/go-toml/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -sudo: false -language: go -go: - - 1.11.x - - 1.12.x - - tip -matrix: - allow_failures: - - go: tip - fast_finish: true -env: - - GO111MODULE=on -script: - - if [ -n "$(go fmt ./...)" ]; then exit 1; fi - - go test github.com/pelletier/go-toml -race -coverprofile=coverage.txt -covermode=atomic - - go test github.com/pelletier/go-toml/cmd/tomljson - - go test github.com/pelletier/go-toml/cmd/tomll - - go test github.com/pelletier/go-toml/query - - ./benchmark.sh $TRAVIS_BRANCH https://github.com/$TRAVIS_REPO_SLUG.git - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/pelletier/go-toml/Dockerfile b/vendor/github.com/pelletier/go-toml/Dockerfile index 8f439d4791..fffdb01666 100644 --- a/vendor/github.com/pelletier/go-toml/Dockerfile +++ b/vendor/github.com/pelletier/go-toml/Dockerfile @@ -8,3 +8,4 @@ RUN go install ./... FROM scratch COPY --from=builder /go/bin/tomll /usr/bin/tomll COPY --from=builder /go/bin/tomljson /usr/bin/tomljson +COPY --from=builder /go/bin/jsontoml /usr/bin/jsontoml diff --git a/vendor/github.com/pelletier/go-toml/Makefile b/vendor/github.com/pelletier/go-toml/Makefile new file mode 100644 index 0000000000..9e4503aea6 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/Makefile @@ -0,0 +1,29 @@ +export CGO_ENABLED=0 +go := go +go.goos ?= $(shell echo `go version`|cut -f4 -d ' '|cut -d '/' -f1) +go.goarch ?= $(shell echo `go version`|cut -f4 -d ' '|cut -d '/' -f2) + +out.tools := tomll tomljson jsontoml +out.dist := $(out.tools:=_$(go.goos)_$(go.goarch).tar.xz) +sources := $(wildcard **/*.go) + + +.PHONY: +tools: $(out.tools) + +$(out.tools): $(sources) + GOOS=$(go.goos) GOARCH=$(go.goarch) $(go) build ./cmd/$@ + +.PHONY: +dist: $(out.dist) + +$(out.dist):%_$(go.goos)_$(go.goarch).tar.xz: % + if [ "$(go.goos)" = "windows" ]; then \ + tar -cJf $@ $^.exe; \ + else \ + tar -cJf $@ $^; \ + fi + +.PHONY: +clean: + rm -rf $(out.tools) $(out.dist) diff --git a/vendor/github.com/pelletier/go-toml/README.md b/vendor/github.com/pelletier/go-toml/README.md index f0311b99c4..6831deb5bd 100644 --- a/vendor/github.com/pelletier/go-toml/README.md +++ b/vendor/github.com/pelletier/go-toml/README.md @@ -3,12 +3,11 @@ Go library for the [TOML](https://github.com/mojombo/toml) format. This library supports TOML version -[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md) +[v1.0.0-rc.1](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v1.0.0-rc.1.md) [![GoDoc](https://godoc.org/github.com/pelletier/go-toml?status.svg)](http://godoc.org/github.com/pelletier/go-toml) [![license](https://img.shields.io/github/license/pelletier/go-toml.svg)](https://github.com/pelletier/go-toml/blob/master/LICENSE) -[![Build Status](https://travis-ci.org/pelletier/go-toml.svg?branch=master)](https://travis-ci.org/pelletier/go-toml) -[![Windows Build status](https://ci.appveyor.com/api/projects/status/4aepwwjori266hkt/branch/master?svg=true)](https://ci.appveyor.com/project/pelletier/go-toml/branch/master) +[![Build Status](https://dev.azure.com/pelletierthomas/go-toml-ci/_apis/build/status/pelletier.go-toml?branchName=master)](https://dev.azure.com/pelletierthomas/go-toml-ci/_build/latest?definitionId=1&branchName=master) [![codecov](https://codecov.io/gh/pelletier/go-toml/branch/master/graph/badge.svg)](https://codecov.io/gh/pelletier/go-toml) [![Go Report Card](https://goreportcard.com/badge/github.com/pelletier/go-toml)](https://goreportcard.com/report/github.com/pelletier/go-toml) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fpelletier%2Fgo-toml?ref=badge_shield) @@ -19,7 +18,7 @@ Go-toml provides the following features for using data parsed from TOML document * Load TOML documents from files and string data * Easily navigate TOML structure using Tree -* Mashaling and unmarshaling to and from data structures +* Marshaling and unmarshaling to and from data structures * Line & column position data for all parsed elements * [Query support similar to JSON-Path](query/) * Syntax errors contain line and column numbers @@ -75,7 +74,7 @@ Or use a query: q, _ := query.Compile("$..[user,password]") results := q.Execute(config) for ii, item := range results.Values() { - fmt.Println("Query result %d: %v", ii, item) + fmt.Printf("Query result %d: %v\n", ii, item) } ``` @@ -88,7 +87,7 @@ The documentation and additional examples are available at Go-toml provides two handy command line tools: -* `tomll`: Reads TOML files and lint them. +* `tomll`: Reads TOML files and lints them. ``` go install github.com/pelletier/go-toml/cmd/tomll @@ -101,6 +100,13 @@ Go-toml provides two handy command line tools: tomljson --help ``` + * `jsontoml`: Reads a JSON file and outputs a TOML representation. + + ``` + go install github.com/pelletier/go-toml/cmd/jsontoml + jsontoml --help + ``` + ### Docker image Those tools are also availble as a Docker image from diff --git a/vendor/github.com/pelletier/go-toml/appveyor.yml b/vendor/github.com/pelletier/go-toml/appveyor.yml deleted file mode 100644 index 40e8a41596..0000000000 --- a/vendor/github.com/pelletier/go-toml/appveyor.yml +++ /dev/null @@ -1,34 +0,0 @@ -version: "{build}" - -# Source Config -clone_folder: c:\gopath\src\github.com\pelletier\go-toml - -# Build host -environment: - GOPATH: c:\gopath - DEPTESTBYPASS501: 1 - GOVERSION: 1.12 - GO111MODULE: on - -init: - - git config --global core.autocrlf input - -# Build -install: - # Install the specific Go version. - - rmdir c:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go%GOVERSION%.windows-amd64.msi - - msiexec /i go%GOVERSION%.windows-amd64.msi /q - - choco install bzr - - set Path=c:\go\bin;c:\gopath\bin;C:\Program Files (x86)\Bazaar\;C:\Program Files\Mercurial\%Path% - - go version - - go env - -build: false -deploy: false - -test_script: - - go test github.com/pelletier/go-toml - - go test github.com/pelletier/go-toml/cmd/tomljson - - go test github.com/pelletier/go-toml/cmd/tomll - - go test github.com/pelletier/go-toml/query diff --git a/vendor/github.com/pelletier/go-toml/azure-pipelines.yml b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml new file mode 100644 index 0000000000..242b5b5403 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/azure-pipelines.yml @@ -0,0 +1,230 @@ +trigger: +- master + +stages: +- stage: fuzzit + displayName: "Run Fuzzit" + dependsOn: [] + condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master')) + jobs: + - job: submit + displayName: "Submit" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml + - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml + - task: Bash@3 + inputs: + filePath: './fuzzit.sh' + env: + TYPE: fuzzing + FUZZIT_API_KEY: $(FUZZIT_API_KEY) + +- stage: run_checks + displayName: "Check" + dependsOn: [] + jobs: + - job: fmt + displayName: "fmt" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - task: Go@0 + displayName: "go fmt ./..." + inputs: + command: 'custom' + customCommand: 'fmt' + arguments: './...' + - job: coverage + displayName: "coverage" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - task: Go@0 + displayName: "Generate coverage" + inputs: + command: 'test' + arguments: "-race -coverprofile=coverage.txt -covermode=atomic" + - task: Bash@3 + inputs: + targetType: 'inline' + script: 'bash <(curl -s https://codecov.io/bash) -t ${CODECOV_TOKEN}' + env: + CODECOV_TOKEN: $(CODECOV_TOKEN) + - job: benchmark + displayName: "benchmark" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - task: Bash@3 + inputs: + filePath: './benchmark.sh' + arguments: "master $(Build.Repository.Uri)" + + - job: fuzzing + displayName: "fuzzing" + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go 1.14" + inputs: + version: "1.14" + - script: echo "##vso[task.setvariable variable=PATH]${PATH}:/home/vsts/go/bin/" + - script: mkdir -p ${HOME}/go/src/github.com/pelletier/go-toml + - script: cp -R . ${HOME}/go/src/github.com/pelletier/go-toml + - task: Bash@3 + inputs: + filePath: './fuzzit.sh' + env: + TYPE: local-regression + + - job: go_unit_tests + displayName: "unit tests" + strategy: + matrix: + linux 1.14: + goVersion: '1.14' + imageName: 'ubuntu-latest' + mac 1.14: + goVersion: '1.14' + imageName: 'macOS-latest' + windows 1.14: + goVersion: '1.14' + imageName: 'windows-latest' + linux 1.13: + goVersion: '1.13' + imageName: 'ubuntu-latest' + mac 1.13: + goVersion: '1.13' + imageName: 'macOS-latest' + windows 1.13: + goVersion: '1.13' + imageName: 'windows-latest' + pool: + vmImage: $(imageName) + steps: + - task: GoTool@0 + displayName: "Install Go $(goVersion)" + inputs: + version: $(goVersion) + - task: Go@0 + displayName: "go test ./..." + inputs: + command: 'test' + arguments: './...' +- stage: build_binaries + displayName: "Build binaries" + dependsOn: run_checks + jobs: + - job: build_binary + displayName: "Build binary" + strategy: + matrix: + linux_amd64: + GOOS: linux + GOARCH: amd64 + darwin_amd64: + GOOS: darwin + GOARCH: amd64 + windows_amd64: + GOOS: windows + GOARCH: amd64 + pool: + vmImage: ubuntu-latest + steps: + - task: GoTool@0 + displayName: "Install Go" + inputs: + version: 1.14 + - task: Bash@3 + inputs: + targetType: inline + script: "make dist" + env: + go.goos: $(GOOS) + go.goarch: $(GOARCH) + - task: CopyFiles@2 + inputs: + sourceFolder: '$(Build.SourcesDirectory)' + contents: '*.tar.xz' + TargetFolder: '$(Build.ArtifactStagingDirectory)' + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: binaries +- stage: build_binaries_manifest + displayName: "Build binaries manifest" + dependsOn: build_binaries + jobs: + - job: build_manifest + displayName: "Build binaries manifest" + steps: + - task: DownloadBuildArtifacts@0 + inputs: + buildType: 'current' + downloadType: 'single' + artifactName: 'binaries' + downloadPath: '$(Build.SourcesDirectory)' + - task: Bash@3 + inputs: + targetType: inline + script: "cd binaries && sha256sum --binary *.tar.xz | tee $(Build.ArtifactStagingDirectory)/sha256sums.txt" + - task: PublishBuildArtifacts@1 + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: manifest + +- stage: build_docker_image + displayName: "Build Docker image" + dependsOn: run_checks + jobs: + - job: build + displayName: "Build" + pool: + vmImage: ubuntu-latest + steps: + - task: Docker@2 + inputs: + command: 'build' + Dockerfile: 'Dockerfile' + buildContext: '.' + addPipelineData: false + +- stage: publish_docker_image + displayName: "Publish Docker image" + dependsOn: build_docker_image + condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'master')) + jobs: + - job: publish + displayName: "Publish" + pool: + vmImage: ubuntu-latest + steps: + - task: Docker@2 + inputs: + containerRegistry: 'DockerHub' + repository: 'pelletier/go-toml' + command: 'buildAndPush' + Dockerfile: 'Dockerfile' + buildContext: '.' + tags: 'latest' diff --git a/vendor/github.com/pelletier/go-toml/benchmark.sh b/vendor/github.com/pelletier/go-toml/benchmark.sh index 8b8bb528e7..7914fff49c 100644 --- a/vendor/github.com/pelletier/go-toml/benchmark.sh +++ b/vendor/github.com/pelletier/go-toml/benchmark.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -e +set -ex reference_ref=${1:-master} reference_git=${2:-.} @@ -8,7 +8,6 @@ reference_git=${2:-.} if ! `hash benchstat 2>/dev/null`; then echo "Installing benchstat" go get golang.org/x/perf/cmd/benchstat - go install golang.org/x/perf/cmd/benchstat fi tempdir=`mktemp -d /tmp/go-toml-benchmark-XXXXXX` @@ -29,4 +28,4 @@ go test -bench=. -benchmem | tee ${local_benchmark} echo "" echo "=== diff" -benchstat -delta-test=none ${ref_benchmark} ${local_benchmark}
\ No newline at end of file +benchstat -delta-test=none ${ref_benchmark} ${local_benchmark} diff --git a/vendor/github.com/pelletier/go-toml/doc.go b/vendor/github.com/pelletier/go-toml/doc.go index d5fd98c021..a1406a32b3 100644 --- a/vendor/github.com/pelletier/go-toml/doc.go +++ b/vendor/github.com/pelletier/go-toml/doc.go @@ -1,7 +1,7 @@ // Package toml is a TOML parser and manipulation library. // // This version supports the specification as described in -// https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md +// https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.5.0.md // // Marshaling // diff --git a/vendor/github.com/pelletier/go-toml/example-crlf.toml b/vendor/github.com/pelletier/go-toml/example-crlf.toml index 12950a163d..780d9c68f2 100644 --- a/vendor/github.com/pelletier/go-toml/example-crlf.toml +++ b/vendor/github.com/pelletier/go-toml/example-crlf.toml @@ -27,3 +27,4 @@ enabled = true [clients]
data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
+score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported
\ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/example.toml b/vendor/github.com/pelletier/go-toml/example.toml index 3d902f2820..f45bf88b8f 100644 --- a/vendor/github.com/pelletier/go-toml/example.toml +++ b/vendor/github.com/pelletier/go-toml/example.toml @@ -27,3 +27,4 @@ enabled = true [clients] data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it +score = 4e-08 # to make sure leading zeroes in exponent parts of floats are supported
\ No newline at end of file diff --git a/vendor/github.com/pelletier/go-toml/fuzzit.sh b/vendor/github.com/pelletier/go-toml/fuzzit.sh new file mode 100644 index 0000000000..b575a6081f --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/fuzzit.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -xe + +# go-fuzz doesn't support modules yet, so ensure we do everything +# in the old style GOPATH way +export GO111MODULE="off" + +# install go-fuzz +go get -u github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build + +# target name can only contain lower-case letters (a-z), digits (0-9) and a dash (-) +# to add another target, make sure to create it with `fuzzit create target` +# before using `fuzzit create job` +TARGET=toml-fuzzer + +go-fuzz-build -libfuzzer -o ${TARGET}.a github.com/pelletier/go-toml +clang -fsanitize=fuzzer ${TARGET}.a -o ${TARGET} + +# install fuzzit for talking to fuzzit.dev service +# or latest version: +# https://github.com/fuzzitdev/fuzzit/releases/latest/download/fuzzit_Linux_x86_64 +wget -q -O fuzzit https://github.com/fuzzitdev/fuzzit/releases/download/v2.4.52/fuzzit_Linux_x86_64 +chmod a+x fuzzit + +# TODO: change kkowalczyk to go-toml and create toml-fuzzer target there +./fuzzit create job --type $TYPE go-toml/${TARGET} ${TARGET} diff --git a/vendor/github.com/pelletier/go-toml/go.mod b/vendor/github.com/pelletier/go-toml/go.mod index f4690e19d3..c7faa6b3e1 100644 --- a/vendor/github.com/pelletier/go-toml/go.mod +++ b/vendor/github.com/pelletier/go-toml/go.mod @@ -5,5 +5,5 @@ go 1.12 require ( github.com/BurntSushi/toml v0.3.1 github.com/davecgh/go-spew v1.1.1 - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/yaml.v2 v2.3.0 ) diff --git a/vendor/github.com/pelletier/go-toml/go.sum b/vendor/github.com/pelletier/go-toml/go.sum index 8d91a47853..6f356470d7 100644 --- a/vendor/github.com/pelletier/go-toml/go.sum +++ b/vendor/github.com/pelletier/go-toml/go.sum @@ -5,3 +5,15 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= +gopkg.in/yaml.v2 v2.2.3/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.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= +gopkg.in/yaml.v2 v2.2.7/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= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/pelletier/go-toml/keysparsing.go index e923bc4f9b..e091500b24 100644 --- a/vendor/github.com/pelletier/go-toml/keysparsing.go +++ b/vendor/github.com/pelletier/go-toml/keysparsing.go @@ -5,7 +5,6 @@ package toml import ( "errors" "fmt" - "unicode" ) // Convert the bare key group string to an array. @@ -109,5 +108,5 @@ func parseKey(key string) ([]string, error) { } func isValidBareChar(r rune) bool { - return isAlphanumeric(r) || r == '-' || unicode.IsNumber(r) + return isAlphanumeric(r) || r == '-' || isDigit(r) } diff --git a/vendor/github.com/pelletier/go-toml/lexer.go b/vendor/github.com/pelletier/go-toml/lexer.go index 6254d390dc..425e847a7a 100644 --- a/vendor/github.com/pelletier/go-toml/lexer.go +++ b/vendor/github.com/pelletier/go-toml/lexer.go @@ -26,7 +26,7 @@ type tomlLexer struct { currentTokenStart int currentTokenStop int tokens []token - depth int + brackets []rune line int col int endbufferLine int @@ -123,6 +123,8 @@ func (l *tomlLexer) lexVoid() tomlLexStateFn { for { next := l.peek() switch next { + case '}': // after '{' + return l.lexRightCurlyBrace case '[': return l.lexTableKey case '#': @@ -140,10 +142,6 @@ func (l *tomlLexer) lexVoid() tomlLexStateFn { l.skip() } - if l.depth > 0 { - return l.lexRvalue - } - if isKeyStartChar(next) { return l.lexKey } @@ -167,10 +165,8 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { case '=': return l.lexEqual case '[': - l.depth++ return l.lexLeftBracket case ']': - l.depth-- return l.lexRightBracket case '{': return l.lexLeftCurlyBrace @@ -188,12 +184,10 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { fallthrough case '\n': l.skip() - if l.depth == 0 { - return l.lexVoid + if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '[' { + return l.lexRvalue } - return l.lexRvalue - case '_': - return l.errorf("cannot start number with underscore") + return l.lexVoid } if l.follow("true") { @@ -223,9 +217,12 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { } possibleDate := l.peekString(35) - dateMatch := dateRegexp.FindString(possibleDate) - if dateMatch != "" { - l.fastForward(len(dateMatch)) + dateSubmatches := dateRegexp.FindStringSubmatch(possibleDate) + if dateSubmatches != nil && dateSubmatches[0] != "" { + l.fastForward(len(dateSubmatches[0])) + if dateSubmatches[2] == "" { // no timezone information => local date + return l.lexLocalDate + } return l.lexDate } @@ -233,10 +230,6 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { return l.lexNumber } - if isAlphanumeric(next) { - return l.lexKey - } - return l.errorf("no value can start with %c", next) } @@ -247,12 +240,17 @@ func (l *tomlLexer) lexRvalue() tomlLexStateFn { func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn { l.next() l.emit(tokenLeftCurlyBrace) - return l.lexRvalue + l.brackets = append(l.brackets, '{') + return l.lexVoid } func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn { l.next() l.emit(tokenRightCurlyBrace) + if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '{' { + return l.errorf("cannot have '}' here") + } + l.brackets = l.brackets[:len(l.brackets)-1] return l.lexRvalue } @@ -261,6 +259,11 @@ func (l *tomlLexer) lexDate() tomlLexStateFn { return l.lexRvalue } +func (l *tomlLexer) lexLocalDate() tomlLexStateFn { + l.emit(tokenLocalDate) + return l.lexRvalue +} + func (l *tomlLexer) lexTrue() tomlLexStateFn { l.fastForward(4) l.emit(tokenTrue) @@ -294,6 +297,9 @@ func (l *tomlLexer) lexEqual() tomlLexStateFn { func (l *tomlLexer) lexComma() tomlLexStateFn { l.next() l.emit(tokenComma) + if len(l.brackets) > 0 && l.brackets[len(l.brackets)-1] == '{' { + return l.lexVoid + } return l.lexRvalue } @@ -324,7 +330,26 @@ func (l *tomlLexer) lexKey() tomlLexStateFn { } else if r == '\n' { return l.errorf("keys cannot contain new lines") } else if isSpace(r) { - break + str := " " + // skip trailing whitespace + l.next() + for r = l.peek(); isSpace(r); r = l.peek() { + str += string(r) + l.next() + } + // break loop if not a dot + if r != '.' { + break + } + str += "." + // skip trailing whitespace after dot + l.next() + for r = l.peek(); isSpace(r); r = l.peek() { + str += string(r) + l.next() + } + growingString += str + continue } else if r == '.' { // skip } else if !isValidBareChar(r) { @@ -353,6 +378,7 @@ func (l *tomlLexer) lexComment(previousState tomlLexStateFn) tomlLexStateFn { func (l *tomlLexer) lexLeftBracket() tomlLexStateFn { l.next() l.emit(tokenLeftBracket) + l.brackets = append(l.brackets, '[') return l.lexRvalue } @@ -504,7 +530,7 @@ func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, } else { r := l.peek() - if 0x00 <= r && r <= 0x1F && !(acceptNewLines && (r == '\n' || r == '\r')) { + if 0x00 <= r && r <= 0x1F && r != '\t' && !(acceptNewLines && (r == '\n' || r == '\r')) { return "", fmt.Errorf("unescaped control character %U", r) } l.next() @@ -535,7 +561,6 @@ func (l *tomlLexer) lexString() tomlLexStateFn { } str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines) - if err != nil { return l.errorf(err.Error()) } @@ -607,6 +632,10 @@ func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn { func (l *tomlLexer) lexRightBracket() tomlLexStateFn { l.next() l.emit(tokenRightBracket) + if len(l.brackets) == 0 || l.brackets[len(l.brackets)-1] != '[' { + return l.errorf("cannot have ']' here") + } + l.brackets = l.brackets[:len(l.brackets)-1] return l.lexRvalue } @@ -733,7 +762,27 @@ func (l *tomlLexer) run() { } func init() { - dateRegexp = regexp.MustCompile(`^\d{1,4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})`) + // Regexp for all date/time formats supported by TOML. + // Group 1: nano precision + // Group 2: timezone + // + // /!\ also matches the empty string + // + // Example matches: + //1979-05-27T07:32:00Z + //1979-05-27T00:32:00-07:00 + //1979-05-27T00:32:00.999999-07:00 + //1979-05-27 07:32:00Z + //1979-05-27 00:32:00-07:00 + //1979-05-27 00:32:00.999999-07:00 + //1979-05-27T07:32:00 + //1979-05-27T00:32:00.999999 + //1979-05-27 07:32:00 + //1979-05-27 00:32:00.999999 + //1979-05-27 + //07:32:00 + //00:32:00.999999 + dateRegexp = regexp.MustCompile(`^(?:\d{1,4}-\d{2}-\d{2})?(?:[T ]?\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})?)?`) } // Entry point diff --git a/vendor/github.com/pelletier/go-toml/localtime.go b/vendor/github.com/pelletier/go-toml/localtime.go new file mode 100644 index 0000000000..a2149e9663 --- /dev/null +++ b/vendor/github.com/pelletier/go-toml/localtime.go @@ -0,0 +1,281 @@ +// Implementation of TOML's local date/time. +// Copied over from https://github.com/googleapis/google-cloud-go/blob/master/civil/civil.go +// to avoid pulling all the Google dependencies. +// +// Copyright 2016 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package civil implements types for civil time, a time-zone-independent +// representation of time that follows the rules of the proleptic +// Gregorian calendar with exactly 24-hour days, 60-minute hours, and 60-second +// minutes. +// +// Because they lack location information, these types do not represent unique +// moments or intervals of time. Use time.Time for that purpose. +package toml + +import ( + "fmt" + "time" +) + +// A LocalDate represents a date (year, month, day). +// +// This type does not include location information, and therefore does not +// describe a unique 24-hour timespan. +type LocalDate struct { + Year int // Year (e.g., 2014). + Month time.Month // Month of the year (January = 1, ...). + Day int // Day of the month, starting at 1. +} + +// LocalDateOf returns the LocalDate in which a time occurs in that time's location. +func LocalDateOf(t time.Time) LocalDate { + var d LocalDate + d.Year, d.Month, d.Day = t.Date() + return d +} + +// ParseLocalDate parses a string in RFC3339 full-date format and returns the date value it represents. +func ParseLocalDate(s string) (LocalDate, error) { + t, err := time.Parse("2006-01-02", s) + if err != nil { + return LocalDate{}, err + } + return LocalDateOf(t), nil +} + +// String returns the date in RFC3339 full-date format. +func (d LocalDate) String() string { + return fmt.Sprintf("%04d-%02d-%02d", d.Year, d.Month, d.Day) +} + +// IsValid reports whether the date is valid. +func (d LocalDate) IsValid() bool { + return LocalDateOf(d.In(time.UTC)) == d +} + +// In returns the time corresponding to time 00:00:00 of the date in the location. +// +// In is always consistent with time.LocalDate, even when time.LocalDate returns a time +// on a different day. For example, if loc is America/Indiana/Vincennes, then both +// time.LocalDate(1955, time.May, 1, 0, 0, 0, 0, loc) +// and +// civil.LocalDate{Year: 1955, Month: time.May, Day: 1}.In(loc) +// return 23:00:00 on April 30, 1955. +// +// In panics if loc is nil. +func (d LocalDate) In(loc *time.Location) time.Time { + return time.Date(d.Year, d.Month, d.Day, 0, 0, 0, 0, loc) +} + +// AddDays returns the date that is n days in the future. +// n can also be negative to go into the past. +func (d LocalDate) AddDays(n int) LocalDate { + return LocalDateOf(d.In(time.UTC).AddDate(0, 0, n)) +} + +// DaysSince returns the signed number of days between the date and s, not including the end day. +// This is the inverse operation to AddDays. +func (d LocalDate) DaysSince(s LocalDate) (days int) { + // We convert to Unix time so we do not have to worry about leap seconds: + // Unix time increases by exactly 86400 seconds per day. + deltaUnix := d.In(time.UTC).Unix() - s.In(time.UTC).Unix() + return int(deltaUnix / 86400) +} + +// Before reports whether d1 occurs before d2. +func (d1 LocalDate) Before(d2 LocalDate) bool { + if d1.Year != d2.Year { + return d1.Year < d2.Year + } + if d1.Month != d2.Month { + return d1.Month < d2.Month + } + return d1.Day < d2.Day +} + +// After reports whether d1 occurs after d2. +func (d1 LocalDate) After(d2 LocalDate) bool { + return d2.Before(d1) +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The output is the result of d.String(). +func (d LocalDate) MarshalText() ([]byte, error) { + return []byte(d.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// The date is expected to be a string in a format accepted by ParseLocalDate. +func (d *LocalDate) UnmarshalText(data []byte) error { + var err error + *d, err = ParseLocalDate(string(data)) + return err +} + +// A LocalTime represents a time with nanosecond precision. +// +// This type does not include location information, and therefore does not +// describe a unique moment in time. +// +// This type exists to represent the TIME type in storage-based APIs like BigQuery. +// Most operations on Times are unlikely to be meaningful. Prefer the LocalDateTime type. +type LocalTime struct { + Hour int // The hour of the day in 24-hour format; range [0-23] + Minute int // The minute of the hour; range [0-59] + Second int // The second of the minute; range [0-59] + Nanosecond int // The nanosecond of the second; range [0-999999999] +} + +// LocalTimeOf returns the LocalTime representing the time of day in which a time occurs +// in that time's location. It ignores the date. +func LocalTimeOf(t time.Time) LocalTime { + var tm LocalTime + tm.Hour, tm.Minute, tm.Second = t.Clock() + tm.Nanosecond = t.Nanosecond() + return tm +} + +// ParseLocalTime parses a string and returns the time value it represents. +// ParseLocalTime accepts an extended form of the RFC3339 partial-time format. After +// the HH:MM:SS part of the string, an optional fractional part may appear, +// consisting of a decimal point followed by one to nine decimal digits. +// (RFC3339 admits only one digit after the decimal point). +func ParseLocalTime(s string) (LocalTime, error) { + t, err := time.Parse("15:04:05.999999999", s) + if err != nil { + return LocalTime{}, err + } + return LocalTimeOf(t), nil +} + +// String returns the date in the format described in ParseLocalTime. If Nanoseconds +// is zero, no fractional part will be generated. Otherwise, the result will +// end with a fractional part consisting of a decimal point and nine digits. +func (t LocalTime) String() string { + s := fmt.Sprintf("%02d:%02d:%02d", t.Hour, t.Minute, t.Second) + if t.Nanosecond == 0 { + return s + } + return s + fmt.Sprintf(".%09d", t.Nanosecond) +} + +// IsValid reports whether the time is valid. +func (t LocalTime) IsValid() bool { + // Construct a non-zero time. + tm := time.Date(2, 2, 2, t.Hour, t.Minute, t.Second, t.Nanosecond, time.UTC) + return LocalTimeOf(tm) == t +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The output is the result of t.String(). +func (t LocalTime) MarshalText() ([]byte, error) { + return []byte(t.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// The time is expected to be a string in a format accepted by ParseLocalTime. +func (t *LocalTime) UnmarshalText(data []byte) error { + var err error + *t, err = ParseLocalTime(string(data)) + return err +} + +// A LocalDateTime represents a date and time. +// +// This type does not include location information, and therefore does not +// describe a unique moment in time. +type LocalDateTime struct { + Date LocalDate + Time LocalTime +} + +// Note: We deliberately do not embed LocalDate into LocalDateTime, to avoid promoting AddDays and Sub. + +// LocalDateTimeOf returns the LocalDateTime in which a time occurs in that time's location. +func LocalDateTimeOf(t time.Time) LocalDateTime { + return LocalDateTime{ + Date: LocalDateOf(t), + Time: LocalTimeOf(t), + } +} + +// ParseLocalDateTime parses a string and returns the LocalDateTime it represents. +// ParseLocalDateTime accepts a variant of the RFC3339 date-time format that omits +// the time offset but includes an optional fractional time, as described in +// ParseLocalTime. Informally, the accepted format is +// YYYY-MM-DDTHH:MM:SS[.FFFFFFFFF] +// where the 'T' may be a lower-case 't'. +func ParseLocalDateTime(s string) (LocalDateTime, error) { + t, err := time.Parse("2006-01-02T15:04:05.999999999", s) + if err != nil { + t, err = time.Parse("2006-01-02t15:04:05.999999999", s) + if err != nil { + return LocalDateTime{}, err + } + } + return LocalDateTimeOf(t), nil +} + +// String returns the date in the format described in ParseLocalDate. +func (dt LocalDateTime) String() string { + return dt.Date.String() + "T" + dt.Time.String() +} + +// IsValid reports whether the datetime is valid. +func (dt LocalDateTime) IsValid() bool { + return dt.Date.IsValid() && dt.Time.IsValid() +} + +// In returns the time corresponding to the LocalDateTime in the given location. +// +// If the time is missing or ambigous at the location, In returns the same +// result as time.LocalDate. For example, if loc is America/Indiana/Vincennes, then +// both +// time.LocalDate(1955, time.May, 1, 0, 30, 0, 0, loc) +// and +// civil.LocalDateTime{ +// civil.LocalDate{Year: 1955, Month: time.May, Day: 1}}, +// civil.LocalTime{Minute: 30}}.In(loc) +// return 23:30:00 on April 30, 1955. +// +// In panics if loc is nil. +func (dt LocalDateTime) In(loc *time.Location) time.Time { + return time.Date(dt.Date.Year, dt.Date.Month, dt.Date.Day, dt.Time.Hour, dt.Time.Minute, dt.Time.Second, dt.Time.Nanosecond, loc) +} + +// Before reports whether dt1 occurs before dt2. +func (dt1 LocalDateTime) Before(dt2 LocalDateTime) bool { + return dt1.In(time.UTC).Before(dt2.In(time.UTC)) +} + +// After reports whether dt1 occurs after dt2. +func (dt1 LocalDateTime) After(dt2 LocalDateTime) bool { + return dt2.Before(dt1) +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The output is the result of dt.String(). +func (dt LocalDateTime) MarshalText() ([]byte, error) { + return []byte(dt.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// The datetime is expected to be a string in a format accepted by ParseLocalDateTime +func (dt *LocalDateTime) UnmarshalText(data []byte) error { + var err error + *dt, err = ParseLocalDateTime(string(data)) + return err +} diff --git a/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/pelletier/go-toml/marshal.go index 0e1c57e80b..db5a7b4f09 100644 --- a/vendor/github.com/pelletier/go-toml/marshal.go +++ b/vendor/github.com/pelletier/go-toml/marshal.go @@ -2,6 +2,7 @@ package toml import ( "bytes" + "encoding" "errors" "fmt" "io" @@ -22,6 +23,7 @@ const ( type tomlOpts struct { name string + nameFromTag bool comment string commented bool multiline bool @@ -68,6 +70,12 @@ const ( var timeType = reflect.TypeOf(time.Time{}) var marshalerType = reflect.TypeOf(new(Marshaler)).Elem() +var unmarshalerType = reflect.TypeOf(new(Unmarshaler)).Elem() +var textMarshalerType = reflect.TypeOf(new(encoding.TextMarshaler)).Elem() +var textUnmarshalerType = reflect.TypeOf(new(encoding.TextUnmarshaler)).Elem() +var localDateType = reflect.TypeOf(LocalDate{}) +var localTimeType = reflect.TypeOf(LocalTime{}) +var localDateTimeType = reflect.TypeOf(LocalDateTime{}) // Check if the given marshal type maps to a Tree primitive func isPrimitive(mtype reflect.Type) bool { @@ -85,29 +93,59 @@ func isPrimitive(mtype reflect.Type) bool { case reflect.String: return true case reflect.Struct: - return mtype == timeType || isCustomMarshaler(mtype) + return isTimeType(mtype) default: return false } } -// Check if the given marshal type maps to a Tree slice -func isTreeSlice(mtype reflect.Type) bool { +func isTimeType(mtype reflect.Type) bool { + return mtype == timeType || mtype == localDateType || mtype == localDateTimeType || mtype == localTimeType +} + +// Check if the given marshal type maps to a Tree slice or array +func isTreeSequence(mtype reflect.Type) bool { switch mtype.Kind() { - case reflect.Slice: - return !isOtherSlice(mtype) + case reflect.Ptr: + return isTreeSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isTree(mtype.Elem()) default: return false } } -// Check if the given marshal type maps to a non-Tree slice -func isOtherSlice(mtype reflect.Type) bool { +// Check if the given marshal type maps to a slice or array of a custom marshaler type +func isCustomMarshalerSequence(mtype reflect.Type) bool { switch mtype.Kind() { case reflect.Ptr: - return isOtherSlice(mtype.Elem()) - case reflect.Slice: - return isPrimitive(mtype.Elem()) || isOtherSlice(mtype.Elem()) + return isCustomMarshalerSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isCustomMarshaler(mtype.Elem()) || isCustomMarshaler(reflect.New(mtype.Elem()).Type()) + default: + return false + } +} + +// Check if the given marshal type maps to a slice or array of a text marshaler type +func isTextMarshalerSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isTextMarshalerSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return isTextMarshaler(mtype.Elem()) || isTextMarshaler(reflect.New(mtype.Elem()).Type()) + default: + return false + } +} + +// Check if the given marshal type maps to a non-Tree slice or array +func isOtherSequence(mtype reflect.Type) bool { + switch mtype.Kind() { + case reflect.Ptr: + return isOtherSequence(mtype.Elem()) + case reflect.Slice, reflect.Array: + return !isTreeSequence(mtype) default: return false } @@ -116,6 +154,8 @@ func isOtherSlice(mtype reflect.Type) bool { // Check if the given marshal type maps to a Tree func isTree(mtype reflect.Type) bool { switch mtype.Kind() { + case reflect.Ptr: + return isTree(mtype.Elem()) case reflect.Map: return true case reflect.Struct: @@ -133,12 +173,42 @@ func callCustomMarshaler(mval reflect.Value) ([]byte, error) { return mval.Interface().(Marshaler).MarshalTOML() } +func isTextMarshaler(mtype reflect.Type) bool { + return mtype.Implements(textMarshalerType) && !isTimeType(mtype) +} + +func callTextMarshaler(mval reflect.Value) ([]byte, error) { + return mval.Interface().(encoding.TextMarshaler).MarshalText() +} + +func isCustomUnmarshaler(mtype reflect.Type) bool { + return mtype.Implements(unmarshalerType) +} + +func callCustomUnmarshaler(mval reflect.Value, tval interface{}) error { + return mval.Interface().(Unmarshaler).UnmarshalTOML(tval) +} + +func isTextUnmarshaler(mtype reflect.Type) bool { + return mtype.Implements(textUnmarshalerType) +} + +func callTextUnmarshaler(mval reflect.Value, text []byte) error { + return mval.Interface().(encoding.TextUnmarshaler).UnmarshalText(text) +} + // Marshaler is the interface implemented by types that // can marshal themselves into valid TOML. type Marshaler interface { MarshalTOML() ([]byte, error) } +// Unmarshaler is the interface implemented by types that +// can unmarshal a TOML description of themselves. +type Unmarshaler interface { + UnmarshalTOML(interface{}) error +} + /* Marshal returns the TOML encoding of v. Behavior is similar to the Go json encoder, except that there is no concept of a Marshaler interface or MarshalTOML @@ -170,7 +240,7 @@ Tree primitive types and corresponding marshal types: float64 float32, float64, pointers to same string string, pointers to same bool bool, pointers to same - time.Time time.Time{}, pointers to same + time.LocalTime time.LocalTime{}, pointers to same For additional flexibility, use the Encoder API. */ @@ -183,20 +253,23 @@ type Encoder struct { w io.Writer encOpts annotation - line int - col int - order marshalOrder + line int + col int + order marshalOrder + promoteAnon bool + indentation string } // NewEncoder returns a new encoder that writes to w. func NewEncoder(w io.Writer) *Encoder { return &Encoder{ - w: w, - encOpts: encOptsDefaults, - annotation: annotationDefault, - line: 0, - col: 1, - order: OrderAlphabetical, + w: w, + encOpts: encOptsDefaults, + annotation: annotationDefault, + line: 0, + col: 1, + order: OrderAlphabetical, + indentation: " ", } } @@ -248,6 +321,12 @@ func (e *Encoder) Order(ord marshalOrder) *Encoder { return e } +// Indentation allows to change indentation when marshalling. +func (e *Encoder) Indentation(indent string) *Encoder { + e.indentation = indent + return e +} + // SetTagName allows changing default tag "toml" func (e *Encoder) SetTagName(v string) *Encoder { e.tag = v @@ -272,8 +351,31 @@ func (e *Encoder) SetTagMultiline(v string) *Encoder { return e } +// PromoteAnonymous allows to change how anonymous struct fields are marshaled. +// Usually, they are marshaled as if the inner exported fields were fields in +// the outer struct. However, if an anonymous struct field is given a name in +// its TOML tag, it is treated like a regular struct field with that name. +// rather than being anonymous. +// +// In case anonymous promotion is enabled, all anonymous structs are promoted +// and treated like regular struct fields. +func (e *Encoder) PromoteAnonymous(promote bool) *Encoder { + e.promoteAnon = promote + return e +} + func (e *Encoder) marshal(v interface{}) ([]byte, error) { + // Check if indentation is valid + for _, char := range e.indentation { + if !isSpace(char) { + return []byte{}, fmt.Errorf("invalid indentation: must only contains space or tab characters") + } + } + mtype := reflect.TypeOf(v) + if mtype == nil { + return []byte{}, errors.New("nil cannot be marshaled to TOML") + } switch mtype.Kind() { case reflect.Struct, reflect.Map: @@ -281,6 +383,9 @@ func (e *Encoder) marshal(v interface{}) ([]byte, error) { if mtype.Elem().Kind() != reflect.Struct { return []byte{}, errors.New("Only pointer to struct can be marshaled to TOML") } + if reflect.ValueOf(v).IsNil() { + return []byte{}, errors.New("nil pointer cannot be marshaled to TOML") + } default: return []byte{}, errors.New("Only a struct or map can be marshaled to TOML") } @@ -289,13 +394,16 @@ func (e *Encoder) marshal(v interface{}) ([]byte, error) { if isCustomMarshaler(mtype) { return callCustomMarshaler(sval) } + if isTextMarshaler(mtype) { + return callTextMarshaler(sval) + } t, err := e.valueToTree(mtype, sval) if err != nil { return []byte{}, err } var buf bytes.Buffer - _, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order) + _, err = t.writeToOrdered(&buf, "", "", 0, e.arraysOneElementPerLine, e.order, e.indentation, false) return buf.Bytes(), err } @@ -313,20 +421,28 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er tval := e.nextTree() switch mtype.Kind() { case reflect.Struct: - for i := 0; i < mtype.NumField(); i++ { - mtypef, mvalf := mtype.Field(i), mval.Field(i) - opts := tomlOptions(mtypef, e.annotation) - if opts.include && (!opts.omitempty || !isZero(mvalf)) { - val, err := e.valueToToml(mtypef.Type, mvalf) - if err != nil { - return nil, err + switch mval.Interface().(type) { + case Tree: + reflect.ValueOf(tval).Elem().Set(mval) + default: + for i := 0; i < mtype.NumField(); i++ { + mtypef, mvalf := mtype.Field(i), mval.Field(i) + opts := tomlOptions(mtypef, e.annotation) + if opts.include && ((mtypef.Type.Kind() != reflect.Interface && !opts.omitempty) || !isZero(mvalf)) { + val, err := e.valueToToml(mtypef.Type, mvalf) + if err != nil { + return nil, err + } + if tree, ok := val.(*Tree); ok && mtypef.Anonymous && !opts.nameFromTag && !e.promoteAnon { + e.appendTree(tval, tree) + } else { + tval.SetPathWithOptions([]string{opts.name}, SetOptions{ + Comment: opts.comment, + Commented: opts.commented, + Multiline: opts.multiline, + }, val) + } } - - tval.SetWithOptions(opts.name, SetOptions{ - Comment: opts.comment, - Commented: opts.commented, - Multiline: opts.multiline, - }, val) } } case reflect.Map: @@ -351,18 +467,21 @@ func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, er } for _, key := range keys { mvalf := mval.MapIndex(key) + if (mtype.Elem().Kind() == reflect.Ptr || mtype.Elem().Kind() == reflect.Interface) && mvalf.IsNil() { + continue + } val, err := e.valueToToml(mtype.Elem(), mvalf) if err != nil { return nil, err } if e.quoteMapKeys { - keyStr, err := tomlValueStringRepresentation(key.String(), "", e.arraysOneElementPerLine) + keyStr, err := tomlValueStringRepresentation(key.String(), "", "", e.order, e.arraysOneElementPerLine) if err != nil { return nil, err } tval.SetPath([]string{keyStr}, val) } else { - tval.Set(key.String(), val) + tval.SetPath([]string{key.String()}, val) } } } @@ -399,17 +518,29 @@ func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (int func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) { e.line++ if mtype.Kind() == reflect.Ptr { - return e.valueToToml(mtype.Elem(), mval.Elem()) + switch { + case isCustomMarshaler(mtype): + return callCustomMarshaler(mval) + case isTextMarshaler(mtype): + return callTextMarshaler(mval) + default: + return e.valueToToml(mtype.Elem(), mval.Elem()) + } + } + if mtype.Kind() == reflect.Interface { + return e.valueToToml(mval.Elem().Type(), mval.Elem()) } switch { case isCustomMarshaler(mtype): return callCustomMarshaler(mval) + case isTextMarshaler(mtype): + return callTextMarshaler(mval) case isTree(mtype): return e.valueToTree(mtype, mval) - case isTreeSlice(mtype): - return e.valueToTreeSlice(mtype, mval) - case isOtherSlice(mtype): + case isOtherSequence(mtype), isCustomMarshalerSequence(mtype), isTextMarshalerSequence(mtype): return e.valueToOtherSlice(mtype, mval) + case isTreeSequence(mtype): + return e.valueToTreeSlice(mtype, mval) default: switch mtype.Kind() { case reflect.Bool: @@ -426,13 +557,26 @@ func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface case reflect.String: return mval.String(), nil case reflect.Struct: - return mval.Interface().(time.Time), nil + return mval.Interface(), nil default: return nil, fmt.Errorf("Marshal can't handle %v(%v)", mtype, mtype.Kind()) } } } +func (e *Encoder) appendTree(t, o *Tree) error { + for key, value := range o.values { + if _, ok := t.values[key]; ok { + continue + } + if tomlValue, ok := value.(*tomlValue); ok { + tomlValue.position.Col = t.position.Col + } + t.values[key] = value + } + return nil +} + // Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v. // Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for // sub-structs, and only definite types can be unmarshaled. @@ -445,8 +589,11 @@ func (t *Tree) Unmarshal(v interface{}) error { // See Marshal() documentation for types mapping table. func (t *Tree) Marshal() ([]byte, error) { var buf bytes.Buffer - err := NewEncoder(&buf).Encode(t) - return buf.Bytes(), err + _, err := t.WriteTo(&buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil } // Unmarshal parses the TOML-encoded data and stores the result in the value @@ -482,6 +629,8 @@ type Decoder struct { tval *Tree encOpts tagName string + strict bool + visitor visitorState } // NewDecoder returns a new decoder that reads from r. @@ -512,8 +661,18 @@ func (d *Decoder) SetTagName(v string) *Decoder { return d } +// Strict allows changing to strict decoding. Any fields that are found in the +// input data and do not have a corresponding struct member cause an error. +func (d *Decoder) Strict(strict bool) *Decoder { + d.strict = strict + return d +} + func (d *Decoder) unmarshal(v interface{}) error { mtype := reflect.TypeOf(v) + if mtype == nil { + return errors.New("nil cannot be unmarshaled from TOML") + } if mtype.Kind() != reflect.Ptr { return errors.New("only a pointer to struct or map can be unmarshaled from TOML") } @@ -526,28 +685,64 @@ func (d *Decoder) unmarshal(v interface{}) error { return errors.New("only a pointer to struct or map can be unmarshaled from TOML") } - sval, err := d.valueFromTree(elem, d.tval) + if reflect.ValueOf(v).IsNil() { + return errors.New("nil pointer cannot be unmarshaled from TOML") + } + + vv := reflect.ValueOf(v).Elem() + + if d.strict { + d.visitor = newVisitorState(d.tval) + } + + sval, err := d.valueFromTree(elem, d.tval, &vv) if err != nil { return err } + if err := d.visitor.validate(); err != nil { + return err + } reflect.ValueOf(v).Elem().Set(sval) return nil } -// Convert toml tree to marshal struct or map, using marshal type -func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, error) { +// Convert toml tree to marshal struct or map, using marshal type. When mval1 +// is non-nil, merge fields into the given value instead of allocating a new one. +func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree, mval1 *reflect.Value) (reflect.Value, error) { if mtype.Kind() == reflect.Ptr { - return d.unwrapPointer(mtype, tval) + return d.unwrapPointer(mtype, tval, mval1) } + + // Check if pointer to value implements the Unmarshaler interface. + if mvalPtr := reflect.New(mtype); isCustomUnmarshaler(mvalPtr.Type()) { + d.visitor.visitAll() + + if err := callCustomUnmarshaler(mvalPtr, tval.ToMap()); err != nil { + return reflect.ValueOf(nil), fmt.Errorf("unmarshal toml: %v", err) + } + return mvalPtr.Elem(), nil + } + var mval reflect.Value switch mtype.Kind() { case reflect.Struct: - mval = reflect.New(mtype).Elem() - for i := 0; i < mtype.NumField(); i++ { - mtypef := mtype.Field(i) - an := annotation{tag: d.tagName} - opts := tomlOptions(mtypef, an) - if opts.include { + if mval1 != nil { + mval = *mval1 + } else { + mval = reflect.New(mtype).Elem() + } + + switch mval.Interface().(type) { + case Tree: + mval.Set(reflect.ValueOf(tval).Elem()) + default: + for i := 0; i < mtype.NumField(); i++ { + mtypef := mtype.Field(i) + an := annotation{tag: d.tagName} + opts := tomlOptions(mtypef, an) + if !opts.include { + continue + } baseKey := opts.name keysToTry := []string{ baseKey, @@ -557,19 +752,25 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, } found := false - for _, key := range keysToTry { - exists := tval.Has(key) - if !exists { - continue - } - val := tval.Get(key) - mvalf, err := d.valueFromToml(mtypef.Type, val) - if err != nil { - return mval, formatError(err, tval.GetPosition(key)) + if tval != nil { + for _, key := range keysToTry { + exists := tval.HasPath([]string{key}) + if !exists { + continue + } + + d.visitor.push(key) + val := tval.GetPath([]string{key}) + fval := mval.Field(i) + mvalf, err := d.valueFromToml(mtypef.Type, val, &fval) + if err != nil { + return mval, formatError(err, tval.GetPositionPath([]string{key})) + } + mval.Field(i).Set(mvalf) + found = true + d.visitor.pop() + break } - mval.Field(i).Set(mvalf) - found = true - break } if !found && opts.defaultValue != "" { @@ -577,45 +778,71 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, var val interface{} var err error switch mvalf.Kind() { + case reflect.String: + val = opts.defaultValue case reflect.Bool: val, err = strconv.ParseBool(opts.defaultValue) - if err != nil { - return mval.Field(i), err - } + case reflect.Uint: + val, err = strconv.ParseUint(opts.defaultValue, 10, 0) + case reflect.Uint8: + val, err = strconv.ParseUint(opts.defaultValue, 10, 8) + case reflect.Uint16: + val, err = strconv.ParseUint(opts.defaultValue, 10, 16) + case reflect.Uint32: + val, err = strconv.ParseUint(opts.defaultValue, 10, 32) + case reflect.Uint64: + val, err = strconv.ParseUint(opts.defaultValue, 10, 64) case reflect.Int: - val, err = strconv.Atoi(opts.defaultValue) - if err != nil { - return mval.Field(i), err - } - case reflect.String: - val = opts.defaultValue + val, err = strconv.ParseInt(opts.defaultValue, 10, 0) + case reflect.Int8: + val, err = strconv.ParseInt(opts.defaultValue, 10, 8) + case reflect.Int16: + val, err = strconv.ParseInt(opts.defaultValue, 10, 16) + case reflect.Int32: + val, err = strconv.ParseInt(opts.defaultValue, 10, 32) case reflect.Int64: val, err = strconv.ParseInt(opts.defaultValue, 10, 64) - if err != nil { - return mval.Field(i), err - } + case reflect.Float32: + val, err = strconv.ParseFloat(opts.defaultValue, 32) case reflect.Float64: val, err = strconv.ParseFloat(opts.defaultValue, 64) - if err != nil { - return mval.Field(i), err - } default: - return mval.Field(i), fmt.Errorf("unsuported field type for default option") + return mvalf, fmt.Errorf("unsupported field type for default option") + } + + if err != nil { + return mvalf, err + } + mvalf.Set(reflect.ValueOf(val).Convert(mvalf.Type())) + } + + // save the old behavior above and try to check structs + if !found && opts.defaultValue == "" && mtypef.Type.Kind() == reflect.Struct { + tmpTval := tval + if !mtypef.Anonymous { + tmpTval = nil + } + fval := mval.Field(i) + v, err := d.valueFromTree(mtypef.Type, tmpTval, &fval) + if err != nil { + return v, err } - mval.Field(i).Set(reflect.ValueOf(val)) + mval.Field(i).Set(v) } } } case reflect.Map: mval = reflect.MakeMap(mtype) for _, key := range tval.Keys() { + d.visitor.push(key) // TODO: path splits key val := tval.GetPath([]string{key}) - mvalf, err := d.valueFromToml(mtype.Elem(), val) + mvalf, err := d.valueFromToml(mtype.Elem(), val, nil) if err != nil { - return mval, formatError(err, tval.GetPosition(key)) + return mval, formatError(err, tval.GetPositionPath([]string{key})) } mval.SetMapIndex(reflect.ValueOf(key).Convert(mtype.Key()), mvalf) + d.visitor.pop() } } return mval, nil @@ -623,22 +850,32 @@ func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, // Convert toml value to marshal struct/map slice, using marshal type func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) { - mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + mval, err := makeSliceOrArray(mtype, len(tval)) + if err != nil { + return mval, err + } + for i := 0; i < len(tval); i++ { - val, err := d.valueFromTree(mtype.Elem(), tval[i]) + d.visitor.push(strconv.Itoa(i)) + val, err := d.valueFromTree(mtype.Elem(), tval[i], nil) if err != nil { return mval, err } mval.Index(i).Set(val) + d.visitor.pop() } return mval, nil } // Convert toml value to marshal primitive slice, using marshal type func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) { - mval := reflect.MakeSlice(mtype, len(tval), len(tval)) + mval, err := makeSliceOrArray(mtype, len(tval)) + if err != nil { + return mval, err + } + for i := 0; i < len(tval); i++ { - val, err := d.valueFromToml(mtype.Elem(), tval[i]) + val, err := d.valueFromToml(mtype.Elem(), tval[i], nil) if err != nil { return mval, err } @@ -647,33 +884,133 @@ func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (r return mval, nil } -// Convert toml value to marshal value, using marshal type -func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.Value, error) { +// Convert toml value to marshal primitive slice, using marshal type +func (d *Decoder) valueFromOtherSliceI(mtype reflect.Type, tval interface{}) (reflect.Value, error) { + val := reflect.ValueOf(tval) + length := val.Len() + + mval, err := makeSliceOrArray(mtype, length) + if err != nil { + return mval, err + } + + for i := 0; i < length; i++ { + val, err := d.valueFromToml(mtype.Elem(), val.Index(i).Interface(), nil) + if err != nil { + return mval, err + } + mval.Index(i).Set(val) + } + return mval, nil +} + +// Create a new slice or a new array with specified length +func makeSliceOrArray(mtype reflect.Type, tLength int) (reflect.Value, error) { + var mval reflect.Value + switch mtype.Kind() { + case reflect.Slice: + mval = reflect.MakeSlice(mtype, tLength, tLength) + case reflect.Array: + mval = reflect.New(reflect.ArrayOf(mtype.Len(), mtype.Elem())).Elem() + if tLength > mtype.Len() { + return mval, fmt.Errorf("unmarshal: TOML array length (%v) exceeds destination array length (%v)", tLength, mtype.Len()) + } + } + return mval, nil +} + +// Convert toml value to marshal value, using marshal type. When mval1 is non-nil +// and the given type is a struct value, merge fields into it. +func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { if mtype.Kind() == reflect.Ptr { - return d.unwrapPointer(mtype, tval) + return d.unwrapPointer(mtype, tval, mval1) } switch t := tval.(type) { case *Tree: + var mval11 *reflect.Value + if mtype.Kind() == reflect.Struct { + mval11 = mval1 + } + if isTree(mtype) { - return d.valueFromTree(mtype, t) + return d.valueFromTree(mtype, t, mval11) } + + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromTree(reflect.TypeOf(map[string]interface{}{}), t, nil) + } else { + return d.valueFromToml(mval1.Elem().Type(), t, nil) + } + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a tree", tval, tval) case []*Tree: - if isTreeSlice(mtype) { + if isTreeSequence(mtype) { return d.valueFromTreeSlice(mtype, t) } + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromTreeSlice(reflect.TypeOf([]map[string]interface{}{}), t) + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + } return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval) case []interface{}: - if isOtherSlice(mtype) { + d.visitor.visit() + if isOtherSequence(mtype) { return d.valueFromOtherSlice(mtype, t) } + if mtype.Kind() == reflect.Interface { + if mval1 == nil || mval1.IsNil() { + return d.valueFromOtherSlice(reflect.TypeOf([]interface{}{}), t) + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + } return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval) default: + d.visitor.visit() + // Check if pointer to value implements the encoding.TextUnmarshaler. + if mvalPtr := reflect.New(mtype); isTextUnmarshaler(mvalPtr.Type()) && !isTimeType(mtype) { + if err := d.unmarshalText(tval, mvalPtr); err != nil { + return reflect.ValueOf(nil), fmt.Errorf("unmarshal text: %v", err) + } + return mvalPtr.Elem(), nil + } + switch mtype.Kind() { case reflect.Bool, reflect.Struct: val := reflect.ValueOf(tval) - // if this passes for when mtype is reflect.Struct, tval is a time.Time + + switch val.Type() { + case localDateType: + localDate := val.Interface().(LocalDate) + switch mtype { + case timeType: + return reflect.ValueOf(time.Date(localDate.Year, localDate.Month, localDate.Day, 0, 0, 0, 0, time.Local)), nil + } + case localDateTimeType: + localDateTime := val.Interface().(LocalDateTime) + switch mtype { + case timeType: + return reflect.ValueOf(time.Date( + localDateTime.Date.Year, + localDateTime.Date.Month, + localDateTime.Date.Day, + localDateTime.Time.Hour, + localDateTime.Time.Minute, + localDateTime.Time.Second, + localDateTime.Time.Nanosecond, + time.Local)), nil + } + } + + // if this passes for when mtype is reflect.Struct, tval is a time.LocalTime if !val.Type().ConvertibleTo(mtype) { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } @@ -696,46 +1033,65 @@ func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.V } return reflect.ValueOf(d), nil } - if !val.Type().ConvertibleTo(mtype) { + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(mtype).Int()) { + if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Convert(reflect.TypeOf(int64(0))).Int()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } return val.Convert(mtype), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: val := reflect.ValueOf(tval) - if !val.Type().ConvertibleTo(mtype) { + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Float64 { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } if val.Convert(reflect.TypeOf(int(1))).Int() < 0 { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Convert(mtype).Uint())) { + if reflect.Indirect(reflect.New(mtype)).OverflowUint(val.Convert(reflect.TypeOf(uint64(0))).Uint()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } return val.Convert(mtype), nil case reflect.Float32, reflect.Float64: val := reflect.ValueOf(tval) - if !val.Type().ConvertibleTo(mtype) { + if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 { return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String()) } - if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(mtype).Float()) { + if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Convert(reflect.TypeOf(float64(0))).Float()) { return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String()) } return val.Convert(mtype), nil + case reflect.Interface: + if mval1 == nil || mval1.IsNil() { + return reflect.ValueOf(tval), nil + } else { + ival := mval1.Elem() + return d.valueFromToml(mval1.Elem().Type(), t, &ival) + } + case reflect.Slice, reflect.Array: + if isOtherSequence(mtype) && isOtherSequence(reflect.TypeOf(t)) { + return d.valueFromOtherSliceI(mtype, t) + } + return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) default: return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind()) } } } -func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.Value, error) { - val, err := d.valueFromToml(mtype.Elem(), tval) +func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}, mval1 *reflect.Value) (reflect.Value, error) { + var melem *reflect.Value + + if mval1 != nil && !mval1.IsNil() && (mtype.Elem().Kind() == reflect.Struct || mtype.Elem().Kind() == reflect.Interface) { + elem := mval1.Elem() + melem = &elem + } + + val, err := d.valueFromToml(mtype.Elem(), tval, melem) if err != nil { return reflect.ValueOf(nil), err } @@ -744,6 +1100,12 @@ func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.V return mval, nil } +func (d *Decoder) unmarshalText(tval interface{}, mval reflect.Value) error { + var buf bytes.Buffer + fmt.Fprint(&buf, tval) + return callTextUnmarshaler(mval, buf.Bytes()) +} + func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { tag := vf.Tag.Get(an.tag) parse := strings.Split(tag, ",") @@ -756,6 +1118,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { defaultValue := vf.Tag.Get(tagDefault) result := tomlOpts{ name: vf.Name, + nameFromTag: false, comment: comment, commented: commented, multiline: multiline, @@ -768,6 +1131,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { result.include = false } else { result.name = strings.Trim(parse[0], " ") + result.nameFromTag = true } } if vf.PkgPath != "" { @@ -784,11 +1148,7 @@ func tomlOptions(vf reflect.StructField, an annotation) tomlOpts { func isZero(val reflect.Value) bool { switch val.Type().Kind() { - case reflect.Map: - fallthrough - case reflect.Array: - fallthrough - case reflect.Slice: + case reflect.Slice, reflect.Array, reflect.Map: return val.Len() == 0 default: return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface()) @@ -801,3 +1161,80 @@ func formatError(err error, pos Position) error { } return fmt.Errorf("%s: %s", pos, err) } + +// visitorState keeps track of which keys were unmarshaled. +type visitorState struct { + tree *Tree + path []string + keys map[string]struct{} + active bool +} + +func newVisitorState(tree *Tree) visitorState { + path, result := []string{}, map[string]struct{}{} + insertKeys(path, result, tree) + return visitorState{ + tree: tree, + path: path[:0], + keys: result, + active: true, + } +} + +func (s *visitorState) push(key string) { + if s.active { + s.path = append(s.path, key) + } +} + +func (s *visitorState) pop() { + if s.active { + s.path = s.path[:len(s.path)-1] + } +} + +func (s *visitorState) visit() { + if s.active { + delete(s.keys, strings.Join(s.path, ".")) + } +} + +func (s *visitorState) visitAll() { + if s.active { + for k := range s.keys { + if strings.HasPrefix(k, strings.Join(s.path, ".")) { + delete(s.keys, k) + } + } + } +} + +func (s *visitorState) validate() error { + if !s.active { + return nil + } + undecoded := make([]string, 0, len(s.keys)) + for key := range s.keys { + undecoded = append(undecoded, key) + } + sort.Strings(undecoded) + if len(undecoded) > 0 { + return fmt.Errorf("undecoded keys: %q", undecoded) + } + return nil +} + +func insertKeys(path []string, m map[string]struct{}, tree *Tree) { + for k, v := range tree.values { + switch node := v.(type) { + case []*Tree: + for i, item := range node { + insertKeys(append(path, k, strconv.Itoa(i)), m, item) + } + case *Tree: + insertKeys(append(path, k), m, node) + case *tomlValue: + m[strings.Join(append(path, k), ".")] = struct{}{} + } + } +} diff --git a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml deleted file mode 100644 index a3bd5130d9..0000000000 --- a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_Map_test.toml +++ /dev/null @@ -1,17 +0,0 @@ -title = "TOML Marshal Testing" - -[basic_map] - one = "one" - two = "two" - -[long_map] - a7 = "1" - b3 = "2" - c8 = "3" - d4 = "4" - e6 = "5" - f5 = "6" - g10 = "7" - h1 = "8" - i2 = "9" - j9 = "10" diff --git a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml index 9d68b59996..792b72ed72 100644 --- a/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml +++ b/vendor/github.com/pelletier/go-toml/marshal_OrderPreserve_test.toml @@ -27,6 +27,7 @@ title = "TOML Marshal Testing" uint = 5001 bool = true float = 123.4 + float64 = 123.456782132399 int = 5000 string = "Bite me" date = 1979-05-27T07:32:00Z diff --git a/vendor/github.com/pelletier/go-toml/marshal_test.toml b/vendor/github.com/pelletier/go-toml/marshal_test.toml index 1c5f98e7a8..ba5e110bf0 100644 --- a/vendor/github.com/pelletier/go-toml/marshal_test.toml +++ b/vendor/github.com/pelletier/go-toml/marshal_test.toml @@ -4,6 +4,7 @@ title = "TOML Marshal Testing" bool = true date = 1979-05-27T07:32:00Z float = 123.4 + float64 = 123.456782132399 int = 5000 string = "Bite me" uint = 5001 diff --git a/vendor/github.com/pelletier/go-toml/parser.go b/vendor/github.com/pelletier/go-toml/parser.go index a7498e49b3..7bf40bbdc7 100644 --- a/vendor/github.com/pelletier/go-toml/parser.go +++ b/vendor/github.com/pelletier/go-toml/parser.go @@ -158,6 +158,11 @@ func (p *tomlParser) parseGroup() tomlParserStateFn { if err := p.tree.createSubTree(keys, startToken.Position); err != nil { p.raiseError(key, "%s", err) } + destTree := p.tree.GetPath(keys) + if target, ok := destTree.(*Tree); ok && target != nil && target.inline { + p.raiseError(key, "could not re-define exist inline table or its sub-table : %s", + strings.Join(keys, ".")) + } p.assume(tokenRightBracket) p.currentTable = keys return p.parseStart @@ -201,6 +206,11 @@ func (p *tomlParser) parseAssign() tomlParserStateFn { strings.Join(tableKey, ".")) } + if targetNode.inline { + p.raiseError(key, "could not add key or sub-table to exist inline table or its sub-table : %s", + strings.Join(tableKey, ".")) + } + // assign value to the found table keyVal := parsedKey[len(parsedKey)-1] localKey := []string{keyVal} @@ -313,7 +323,41 @@ func (p *tomlParser) parseRvalue() interface{} { } return val case tokenDate: - val, err := time.ParseInLocation(time.RFC3339Nano, tok.val, time.UTC) + layout := time.RFC3339Nano + if !strings.Contains(tok.val, "T") { + layout = strings.Replace(layout, "T", " ", 1) + } + val, err := time.ParseInLocation(layout, tok.val, time.UTC) + if err != nil { + p.raiseError(tok, "%s", err) + } + return val + case tokenLocalDate: + v := strings.Replace(tok.val, " ", "T", -1) + isDateTime := false + isTime := false + for _, c := range v { + if c == 'T' || c == 't' { + isDateTime = true + break + } + if c == ':' { + isTime = true + break + } + } + + var val interface{} + var err error + + if isDateTime { + val, err = ParseLocalDateTime(v) + } else if isTime { + val, err = ParseLocalTime(v) + } else { + val, err = ParseLocalDate(v) + } + if err != nil { p.raiseError(tok, "%s", err) } @@ -356,12 +400,15 @@ Loop: } key := p.getToken() p.assume(tokenEqual) + + parsedKey, err := parseKey(key.val) + if err != nil { + p.raiseError(key, "invalid key: %s", err) + } + value := p.parseRvalue() - tree.Set(key.val, value) + tree.SetPath(parsedKey, value) case tokenComma: - if previous == nil { - p.raiseError(follow, "inline table cannot start with a comma") - } if tokenIsComma(previous) { p.raiseError(follow, "need field between two commas in inline table") } @@ -374,12 +421,13 @@ Loop: if tokenIsComma(previous) { p.raiseError(previous, "trailing comma at the end of inline table") } + tree.inline = true return tree } func (p *tomlParser) parseArray() interface{} { var array []interface{} - arrayType := reflect.TypeOf(nil) + arrayType := reflect.TypeOf(newTree()) for { follow := p.peek() if follow == nil || follow.typ == tokenEOF { @@ -390,11 +438,8 @@ func (p *tomlParser) parseArray() interface{} { break } val := p.parseRvalue() - if arrayType == nil { - arrayType = reflect.TypeOf(val) - } if reflect.TypeOf(val) != arrayType { - p.raiseError(follow, "mixed types in array") + arrayType = nil } array = append(array, val) follow = p.peek() @@ -408,6 +453,12 @@ func (p *tomlParser) parseArray() interface{} { p.getToken() } } + + // if the array is a mixed-type array or its length is 0, + // don't convert it to a table array + if len(array) <= 0 { + arrayType = nil + } // An array of Trees is actually an array of inline // tables, which is a shorthand for a table array. If the // array was not converted from []interface{} to []*Tree, diff --git a/vendor/github.com/pelletier/go-toml/token.go b/vendor/github.com/pelletier/go-toml/token.go index 1a90813466..6af4ec46bc 100644 --- a/vendor/github.com/pelletier/go-toml/token.go +++ b/vendor/github.com/pelletier/go-toml/token.go @@ -1,10 +1,6 @@ package toml -import ( - "fmt" - "strconv" - "unicode" -) +import "fmt" // Define tokens type tokenType int @@ -35,6 +31,7 @@ const ( tokenDoubleLeftBracket tokenDoubleRightBracket tokenDate + tokenLocalDate tokenKeyGroup tokenKeyGroupArray tokenComma @@ -68,7 +65,8 @@ var tokenTypeNames = []string{ ")", "]]", "[[", - "Date", + "LocalDate", + "LocalDate", "KeyGroup", "KeyGroupArray", ",", @@ -95,14 +93,6 @@ func (tt tokenType) String() string { return "Unknown" } -func (t token) Int() int { - if result, err := strconv.Atoi(t.val); err != nil { - panic(err) - } else { - return result - } -} - func (t token) String() string { switch t.typ { case tokenEOF: @@ -119,7 +109,7 @@ func isSpace(r rune) bool { } func isAlphanumeric(r rune) bool { - return unicode.IsLetter(r) || r == '_' + return 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' || r == '_' } func isKeyChar(r rune) bool { @@ -134,7 +124,7 @@ func isKeyStartChar(r rune) bool { } func isDigit(r rune) bool { - return unicode.IsNumber(r) + return '0' <= r && r <= '9' } func isHexDigit(r rune) bool { diff --git a/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/pelletier/go-toml/toml.go index 358a9be5ce..d323c39bce 100644 --- a/vendor/github.com/pelletier/go-toml/toml.go +++ b/vendor/github.com/pelletier/go-toml/toml.go @@ -23,6 +23,7 @@ type Tree struct { values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree comment string commented bool + inline bool position Position } @@ -222,8 +223,12 @@ func (t *Tree) SetPathWithOptions(keys []string, opts SetOptions, value interfac switch v := value.(type) { case *Tree: v.comment = opts.Comment + v.commented = opts.Commented toInsert = value case []*Tree: + for i := range v { + v[i].commented = opts.Commented + } toInsert = value case *tomlValue: v.comment = opts.Comment @@ -307,6 +312,7 @@ func (t *Tree) createSubTree(keys []string, pos Position) error { if !exists { tree := newTreeWithPosition(Position{Line: t.position.Line + i, Col: t.position.Col}) tree.position = pos + tree.inline = subtree.inline subtree.values[intermediateKey] = tree nextTree = tree } diff --git a/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/pelletier/go-toml/tomltree_write.go index 198d5ac174..2d6487ede4 100644 --- a/vendor/github.com/pelletier/go-toml/tomltree_write.go +++ b/vendor/github.com/pelletier/go-toml/tomltree_write.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "math" + "math/big" "reflect" "sort" "strconv" @@ -27,23 +28,35 @@ type sortNode struct { // Encodes a string to a TOML-compliant multi-line string value // This function is a clone of the existing encodeTomlString function, except that whitespace characters // are preserved. Quotation marks and backslashes are also not escaped. -func encodeMultilineTomlString(value string) string { +func encodeMultilineTomlString(value string, commented string) string { var b bytes.Buffer - - for _, rr := range value { + adjacentQuoteCount := 0 + + b.WriteString(commented) + for i, rr := range value { + if rr != '"' { + adjacentQuoteCount = 0 + } else { + adjacentQuoteCount++ + } switch rr { case '\b': b.WriteString(`\b`) case '\t': b.WriteString("\t") case '\n': - b.WriteString("\n") + b.WriteString("\n" + commented) case '\f': b.WriteString(`\f`) case '\r': b.WriteString("\r") case '"': - b.WriteString(`"`) + if adjacentQuoteCount >= 3 || i == len(value)-1 { + adjacentQuoteCount = 0 + b.WriteString(`\"`) + } else { + b.WriteString(`"`) + } case '\\': b.WriteString(`\`) default: @@ -90,7 +103,30 @@ func encodeTomlString(value string) string { return b.String() } -func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElementPerLine bool) (string, error) { +func tomlTreeStringRepresentation(t *Tree, ord marshalOrder) (string, error) { + var orderedVals []sortNode + switch ord { + case OrderPreserve: + orderedVals = sortByLines(t) + default: + orderedVals = sortAlphabetical(t) + } + + var values []string + for _, node := range orderedVals { + k := node.key + v := t.values[k] + + repr, err := tomlValueStringRepresentation(v, "", "", ord, false) + if err != nil { + return "", err + } + values = append(values, quoteKeyIfNeeded(k)+" = "+repr) + } + return "{ " + strings.Join(values, ", ") + " }", nil +} + +func tomlValueStringRepresentation(v interface{}, commented string, indent string, ord marshalOrder, arraysOneElementPerLine bool) (string, error) { // this interface check is added to dereference the change made in the writeTo function. // That change was made to allow this function to see formatting options. tv, ok := v.(*tomlValue) @@ -106,20 +142,28 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen case int64: return strconv.FormatInt(value, 10), nil case float64: - // Ensure a round float does contain a decimal point. Otherwise feeding - // the output back to the parser would convert to an integer. + // Default bit length is full 64 + bits := 64 + // Float panics if nan is used + if !math.IsNaN(value) { + // if 32 bit accuracy is enough to exactly show, use 32 + _, acc := big.NewFloat(value).Float32() + if acc == big.Exact { + bits = 32 + } + } if math.Trunc(value) == value { - return strings.ToLower(strconv.FormatFloat(value, 'f', 1, 32)), nil + return strings.ToLower(strconv.FormatFloat(value, 'f', 1, bits)), nil } - return strings.ToLower(strconv.FormatFloat(value, 'f', -1, 32)), nil + return strings.ToLower(strconv.FormatFloat(value, 'f', -1, bits)), nil case string: if tv.multiline { - return "\"\"\"\n" + encodeMultilineTomlString(value) + "\"\"\"", nil + return "\"\"\"\n" + encodeMultilineTomlString(value, commented) + "\"\"\"", nil } return "\"" + encodeTomlString(value) + "\"", nil case []byte: b, _ := v.([]byte) - return tomlValueStringRepresentation(string(b), indent, arraysOneElementPerLine) + return tomlValueStringRepresentation(string(b), commented, indent, ord, arraysOneElementPerLine) case bool: if value { return "true", nil @@ -127,6 +171,14 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen return "false", nil case time.Time: return value.Format(time.RFC3339), nil + case LocalDate: + return value.String(), nil + case LocalDateTime: + return value.String(), nil + case LocalTime: + return value.String(), nil + case *Tree: + return tomlTreeStringRepresentation(value, ord) case nil: return "", nil } @@ -137,7 +189,7 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen var values []string for i := 0; i < rv.Len(); i++ { item := rv.Index(i).Interface() - itemRepr, err := tomlValueStringRepresentation(item, indent, arraysOneElementPerLine) + itemRepr, err := tomlValueStringRepresentation(item, commented, indent, ord, arraysOneElementPerLine) if err != nil { return "", err } @@ -151,16 +203,16 @@ func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElemen for _, value := range values { stringBuffer.WriteString(valueIndent) - stringBuffer.WriteString(value) + stringBuffer.WriteString(commented + value) stringBuffer.WriteString(`,`) stringBuffer.WriteString("\n") } - stringBuffer.WriteString(indent + "]") + stringBuffer.WriteString(indent + commented + "]") return stringBuffer.String(), nil } - return "[" + strings.Join(values, ",") + "]", nil + return "[" + strings.Join(values, ", ") + "]", nil } return "", fmt.Errorf("unsupported value type %T: %v", v, v) } @@ -255,10 +307,10 @@ func sortAlphabetical(t *Tree) (vals []sortNode) { } func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) { - return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical) + return t.writeToOrdered(w, indent, keyspace, bytesCount, arraysOneElementPerLine, OrderAlphabetical, " ", false) } -func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord marshalOrder) (int64, error) { +func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool, ord marshalOrder, indentString string, parentCommented bool) (int64, error) { var orderedVals []sortNode switch ord { @@ -274,14 +326,10 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i k := node.key v := t.values[k] - combinedKey := k + combinedKey := quoteKeyIfNeeded(k) if keyspace != "" { combinedKey = keyspace + "." + combinedKey } - var commented string - if t.commented { - commented = "# " - } switch node := v.(type) { // node has to be of those two types given how keys are sorted above @@ -302,24 +350,33 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i return bytesCount, errc } } + + var commented string + if parentCommented || t.commented || tv.commented { + commented = "# " + } writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n") bytesCount += int64(writtenBytesCount) if err != nil { return bytesCount, err } - bytesCount, err = node.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord) + bytesCount, err = node.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, parentCommented || t.commented || tv.commented) if err != nil { return bytesCount, err } case []*Tree: for _, subTree := range node { + var commented string + if parentCommented || t.commented || subTree.commented { + commented = "# " + } writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n") bytesCount += int64(writtenBytesCount) if err != nil { return bytesCount, err } - bytesCount, err = subTree.writeToOrdered(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine, ord) + bytesCount, err = subTree.writeToOrdered(w, indent+indentString, combinedKey, bytesCount, arraysOneElementPerLine, ord, indentString, parentCommented || t.commented || subTree.commented) if err != nil { return bytesCount, err } @@ -332,7 +389,11 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k]) } - repr, err := tomlValueStringRepresentation(v, indent, arraysOneElementPerLine) + var commented string + if parentCommented || t.commented || v.commented { + commented = "# " + } + repr, err := tomlValueStringRepresentation(v, commented, indent, ord, arraysOneElementPerLine) if err != nil { return bytesCount, err } @@ -350,11 +411,8 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i } } - var commented string - if v.commented { - commented = "# " - } - writtenBytesCount, err := writeStrings(w, indent, commented, k, " = ", repr, "\n") + quotedKey := quoteKeyIfNeeded(k) + writtenBytesCount, err := writeStrings(w, indent, commented, quotedKey, " = ", repr, "\n") bytesCount += int64(writtenBytesCount) if err != nil { return bytesCount, err @@ -365,6 +423,32 @@ func (t *Tree) writeToOrdered(w io.Writer, indent, keyspace string, bytesCount i return bytesCount, nil } +// quote a key if it does not fit the bare key format (A-Za-z0-9_-) +// quoted keys use the same rules as strings +func quoteKeyIfNeeded(k string) string { + // when encoding a map with the 'quoteMapKeys' option enabled, the tree will contain + // keys that have already been quoted. + // not an ideal situation, but good enough of a stop gap. + if len(k) >= 2 && k[0] == '"' && k[len(k)-1] == '"' { + return k + } + isBare := true + for _, r := range k { + if !isValidBareChar(r) { + isBare = false + break + } + } + if isBare { + return k + } + return quoteKey(k) +} + +func quoteKey(k string) string { + return "\"" + encodeTomlString(k) + "\"" +} + func writeStrings(w io.Writer, s ...string) (int, error) { var n int for i := range s { @@ -387,12 +471,11 @@ func (t *Tree) WriteTo(w io.Writer) (int64, error) { // Output spans multiple lines, and is suitable for ingest by a TOML parser. // If the conversion cannot be performed, ToString returns a non-nil error. func (t *Tree) ToTomlString() (string, error) { - var buf bytes.Buffer - _, err := t.WriteTo(&buf) + b, err := t.Marshal() if err != nil { return "", err } - return buf.String(), nil + return string(b), nil } // String generates a human-readable representation of the current tree. diff --git a/vendor/github.com/spf13/afero/.gitignore b/vendor/github.com/spf13/afero/.gitignore new file mode 100644 index 0000000000..9c1d986118 --- /dev/null +++ b/vendor/github.com/spf13/afero/.gitignore @@ -0,0 +1,2 @@ +sftpfs/file1 +sftpfs/test/ diff --git a/vendor/github.com/spf13/afero/.travis.yml b/vendor/github.com/spf13/afero/.travis.yml index 0637db726d..fdaa99980c 100644 --- a/vendor/github.com/spf13/afero/.travis.yml +++ b/vendor/github.com/spf13/afero/.travis.yml @@ -1,21 +1,22 @@ -sudo: false
-language: go
-
-go:
- - 1.9
- - "1.10"
- - tip
-
-os:
- - linux
- - osx
-
-matrix:
- allow_failures:
- - go: tip
- fast_finish: true
-
-script:
- - go build
- - go test -race -v ./...
-
+sudo: false +language: go + +go: + - "1.13" + - "1.14" + - tip + +os: + - linux + - osx + +matrix: + allow_failures: + - go: tip + fast_finish: true + +script: + - go build -v ./... + - go test -count=1 -cover -race -v ./... + - go vet ./... + - FILES=$(gofmt -s -l . zipfs sftpfs mem); if [[ -n "${FILES}" ]]; then echo "You have go format errors; gofmt your changes"; exit 1; fi diff --git a/vendor/github.com/spf13/afero/README.md b/vendor/github.com/spf13/afero/README.md index 0c9b04b53f..16b06f2ba0 100644 --- a/vendor/github.com/spf13/afero/README.md +++ b/vendor/github.com/spf13/afero/README.md @@ -6,7 +6,7 @@ A FileSystem Abstraction System for Go # Overview -Afero is an filesystem framework providing a simple, uniform and universal API +Afero is a filesystem framework providing a simple, uniform and universal API interacting with any filesystem, as an abstraction layer providing interfaces, types and methods. Afero has an exceptionally clean interface and simple design without needless constructors or initialization methods. @@ -18,7 +18,7 @@ and benefit of the os and ioutil packages. Afero provides significant improvements over using the os package alone, most notably the ability to create mock and testing filesystems without relying on the disk. -It is suitable for use in a any situation where you would consider using the OS +It is suitable for use in any situation where you would consider using the OS package as it provides an additional abstraction that makes it easy to use a memory backed file system during testing. It also adds support for the http filesystem for full interoperability. @@ -41,8 +41,8 @@ Afero is easy to use and easier to adopt. A few different ways you could use Afero: -* Use the interfaces alone to define you own file system. -* Wrap for the OS packages. +* Use the interfaces alone to define your own file system. +* Wrapper for the OS packages. * Define different filesystems for different parts of your application. * Use Afero for mock filesystems while testing @@ -380,7 +380,6 @@ The following is a short list of possible backends we hope someone will implement: * SSH -* ZIP * TAR * S3 @@ -406,28 +405,7 @@ Googles very well. ## Release Notes -* **0.10.0** 2015.12.10 - * Full compatibility with Windows - * Introduction of afero utilities - * Test suite rewritten to work cross platform - * Normalize paths for MemMapFs - * Adding Sync to the file interface - * **Breaking Change** Walk and ReadDir have changed parameter order - * Moving types used by MemMapFs to a subpackage - * General bugfixes and improvements -* **0.9.0** 2015.11.05 - * New Walk function similar to filepath.Walk - * MemMapFs.OpenFile handles O_CREATE, O_APPEND, O_TRUNC - * MemMapFs.Remove now really deletes the file - * InMemoryFile.Readdir and Readdirnames work correctly - * InMemoryFile functions lock it for concurrent access - * Test suite improvements -* **0.8.0** 2014.10.28 - * First public version - * Interfaces feel ready for people to build using - * Interfaces satisfy all known uses - * MemMapFs passes the majority of the OS test suite - * OsFs passes the majority of the OS test suite +See the [Releases Page](https://github.com/spf13/afero/releases). ## Contributing diff --git a/vendor/github.com/spf13/afero/appveyor.yml b/vendor/github.com/spf13/afero/appveyor.yml index a633ad500c..5d2f34bf16 100644 --- a/vendor/github.com/spf13/afero/appveyor.yml +++ b/vendor/github.com/spf13/afero/appveyor.yml @@ -10,6 +10,6 @@ build_script: go get -v github.com/spf13/afero/... - go build github.com/spf13/afero + go build -v github.com/spf13/afero/... test_script: -- cmd: go test -race -v github.com/spf13/afero/... +- cmd: go test -count=1 -cover -race -v github.com/spf13/afero/... diff --git a/vendor/github.com/spf13/afero/basepath.go b/vendor/github.com/spf13/afero/basepath.go index 616ff8ff74..3a14b833e4 100644 --- a/vendor/github.com/spf13/afero/basepath.go +++ b/vendor/github.com/spf13/afero/basepath.go @@ -177,4 +177,30 @@ func (b *BasePathFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { return fi, false, err } +func (b *BasePathFs) SymlinkIfPossible(oldname, newname string) error { + oldname, err := b.RealPath(oldname) + if err != nil { + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: err} + } + newname, err = b.RealPath(newname) + if err != nil { + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: err} + } + if linker, ok := b.source.(Linker); ok { + return linker.SymlinkIfPossible(oldname, newname) + } + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink} +} + +func (b *BasePathFs) ReadlinkIfPossible(name string) (string, error) { + name, err := b.RealPath(name) + if err != nil { + return "", &os.PathError{Op: "readlink", Path: name, Err: err} + } + if reader, ok := b.source.(LinkReader); ok { + return reader.ReadlinkIfPossible(name) + } + return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink} +} + // vim: ts=4 sw=4 noexpandtab nolist syn=go diff --git a/vendor/github.com/spf13/afero/const_bsds.go b/vendor/github.com/spf13/afero/const_bsds.go index 5728243d96..18b45824be 100644 --- a/vendor/github.com/spf13/afero/const_bsds.go +++ b/vendor/github.com/spf13/afero/const_bsds.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build darwin openbsd freebsd netbsd dragonfly +// +build aix darwin openbsd freebsd netbsd dragonfly package afero diff --git a/vendor/github.com/spf13/afero/const_win_unix.go b/vendor/github.com/spf13/afero/const_win_unix.go index 968fc2783e..2b850e4ddb 100644 --- a/vendor/github.com/spf13/afero/const_win_unix.go +++ b/vendor/github.com/spf13/afero/const_win_unix.go @@ -15,6 +15,7 @@ // +build !freebsd // +build !dragonfly // +build !netbsd +// +build !aix package afero diff --git a/vendor/github.com/spf13/afero/copyOnWriteFs.go b/vendor/github.com/spf13/afero/copyOnWriteFs.go index e8108a851e..96b7701261 100644 --- a/vendor/github.com/spf13/afero/copyOnWriteFs.go +++ b/vendor/github.com/spf13/afero/copyOnWriteFs.go @@ -117,6 +117,26 @@ func (u *CopyOnWriteFs) LstatIfPossible(name string) (os.FileInfo, bool, error) return fi, false, err } +func (u *CopyOnWriteFs) SymlinkIfPossible(oldname, newname string) error { + if slayer, ok := u.layer.(Linker); ok { + return slayer.SymlinkIfPossible(oldname, newname) + } + + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink} +} + +func (u *CopyOnWriteFs) ReadlinkIfPossible(name string) (string, error) { + if rlayer, ok := u.layer.(LinkReader); ok { + return rlayer.ReadlinkIfPossible(name) + } + + if rbase, ok := u.base.(LinkReader); ok { + return rbase.ReadlinkIfPossible(name) + } + + return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink} +} + func (u *CopyOnWriteFs) isNotExist(err error) bool { if e, ok := err.(*os.PathError); ok { err = e.Err diff --git a/vendor/github.com/spf13/afero/go.mod b/vendor/github.com/spf13/afero/go.mod index 0868550995..4b2384b38d 100644 --- a/vendor/github.com/spf13/afero/go.mod +++ b/vendor/github.com/spf13/afero/go.mod @@ -1,3 +1,9 @@ module github.com/spf13/afero -require golang.org/x/text v0.3.0 +require ( + github.com/pkg/sftp v1.10.1 + golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 + golang.org/x/text v0.3.0 +) + +go 1.13 diff --git a/vendor/github.com/spf13/afero/go.sum b/vendor/github.com/spf13/afero/go.sum index 6bad37b2a7..4b7664829a 100644 --- a/vendor/github.com/spf13/afero/go.sum +++ b/vendor/github.com/spf13/afero/go.sum @@ -1,2 +1,20 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1 h1:VasscCm72135zRysgrJDKsntdmPN+OuU3+nnHYA9wyc= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +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/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +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/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/spf13/afero/ioutil.go b/vendor/github.com/spf13/afero/ioutil.go index 5c3a3d8fff..a403133e27 100644 --- a/vendor/github.com/spf13/afero/ioutil.go +++ b/vendor/github.com/spf13/afero/ioutil.go @@ -22,6 +22,7 @@ import ( "path/filepath" "sort" "strconv" + "strings" "sync" "time" ) @@ -147,7 +148,7 @@ func reseed() uint32 { return uint32(time.Now().UnixNano() + int64(os.Getpid())) } -func nextSuffix() string { +func nextRandom() string { randmu.Lock() r := rand if r == 0 { @@ -159,27 +160,36 @@ func nextSuffix() string { return strconv.Itoa(int(1e9 + r%1e9))[1:] } -// TempFile creates a new temporary file in the directory dir -// with a name beginning with prefix, opens the file for reading -// and writing, and returns the resulting *File. +// TempFile creates a new temporary file in the directory dir, +// opens the file for reading and writing, and returns the resulting *os.File. +// The filename is generated by taking pattern and adding a random +// string to the end. If pattern includes a "*", the random string +// replaces the last "*". // If dir is the empty string, TempFile uses the default directory // for temporary files (see os.TempDir). // Multiple programs calling TempFile simultaneously -// will not choose the same file. The caller can use f.Name() -// to find the pathname of the file. It is the caller's responsibility +// will not choose the same file. The caller can use f.Name() +// to find the pathname of the file. It is the caller's responsibility // to remove the file when no longer needed. -func (a Afero) TempFile(dir, prefix string) (f File, err error) { - return TempFile(a.Fs, dir, prefix) +func (a Afero) TempFile(dir, pattern string) (f File, err error) { + return TempFile(a.Fs, dir, pattern) } -func TempFile(fs Fs, dir, prefix string) (f File, err error) { +func TempFile(fs Fs, dir, pattern string) (f File, err error) { if dir == "" { dir = os.TempDir() } + var prefix, suffix string + if pos := strings.LastIndex(pattern, "*"); pos != -1 { + prefix, suffix = pattern[:pos], pattern[pos+1:] + } else { + prefix = pattern + } + nconflict := 0 for i := 0; i < 10000; i++ { - name := filepath.Join(dir, prefix+nextSuffix()) + name := filepath.Join(dir, prefix+nextRandom()+suffix) f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) if os.IsExist(err) { if nconflict++; nconflict > 10 { @@ -211,7 +221,7 @@ func TempDir(fs Fs, dir, prefix string) (name string, err error) { nconflict := 0 for i := 0; i < 10000; i++ { - try := filepath.Join(dir, prefix+nextSuffix()) + try := filepath.Join(dir, prefix+nextRandom()) err = fs.Mkdir(try, 0700) if os.IsExist(err) { if nconflict++; nconflict > 10 { diff --git a/vendor/github.com/spf13/afero/match.go b/vendor/github.com/spf13/afero/match.go index c18a87fb71..7db4b7de6e 100644 --- a/vendor/github.com/spf13/afero/match.go +++ b/vendor/github.com/spf13/afero/match.go @@ -106,5 +106,5 @@ func glob(fs Fs, dir, pattern string, matches []string) (m []string, e error) { // recognized by Match. func hasMeta(path string) bool { // TODO(niemeyer): Should other magic characters be added here? - return strings.IndexAny(path, "*?[") >= 0 + return strings.ContainsAny(path, "*?[") } diff --git a/vendor/github.com/spf13/afero/mem/file.go b/vendor/github.com/spf13/afero/mem/file.go index 7af2fb56ff..699f1fb024 100644 --- a/vendor/github.com/spf13/afero/mem/file.go +++ b/vendor/github.com/spf13/afero/mem/file.go @@ -193,8 +193,11 @@ func (f *File) Read(b []byte) (n int, err error) { } func (f *File) ReadAt(b []byte, off int64) (n int, err error) { + prev := atomic.LoadInt64(&f.at) atomic.StoreInt64(&f.at, off) - return f.Read(b) + n, err = f.Read(b) + atomic.StoreInt64(&f.at, prev) + return } func (f *File) Truncate(size int64) error { @@ -233,6 +236,9 @@ func (f *File) Seek(offset int64, whence int) (int64, error) { } func (f *File) Write(b []byte) (n int, err error) { + if f.closed == true { + return 0, ErrFileClosed + } if f.readOnly { return 0, &os.PathError{Op: "write", Path: f.fileData.name, Err: errors.New("file handle is read only")} } diff --git a/vendor/github.com/spf13/afero/memmap.go b/vendor/github.com/spf13/afero/memmap.go index 09498e70fb..6be0e9c2d8 100644 --- a/vendor/github.com/spf13/afero/memmap.go +++ b/vendor/github.com/spf13/afero/memmap.go @@ -141,9 +141,7 @@ func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error { m.registerWithParent(item) m.mu.Unlock() - m.Chmod(name, perm|os.ModeDir) - - return nil + return m.setFileMode(name, perm|os.ModeDir) } func (m *MemMapFs) MkdirAll(path string, perm os.FileMode) error { @@ -212,6 +210,9 @@ func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) { func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) { chmod := false file, err := m.openWrite(name) + if err == nil && (flag&os.O_EXCL > 0) { + return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileExists} + } if os.IsNotExist(err) && (flag&os.O_CREATE > 0) { file, err = m.Create(name) chmod = true @@ -237,7 +238,7 @@ func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, erro } } if chmod { - m.Chmod(name, perm) + return file, m.setFileMode(name, perm) } return file, nil } @@ -269,7 +270,7 @@ func (m *MemMapFs) RemoveAll(path string) error { m.mu.RLock() defer m.mu.RUnlock() - for p, _ := range m.getData() { + for p := range m.getData() { if strings.HasPrefix(p, path) { m.mu.RUnlock() m.mu.Lock() @@ -318,6 +319,22 @@ func (m *MemMapFs) Stat(name string) (os.FileInfo, error) { } func (m *MemMapFs) Chmod(name string, mode os.FileMode) error { + const chmodBits = os.ModePerm | os.ModeSetuid | os.ModeSetgid | os.ModeSticky // Only a subset of bits are allowed to be changed. Documented under os.Chmod() + mode &= chmodBits + + m.mu.RLock() + f, ok := m.getData()[name] + m.mu.RUnlock() + if !ok { + return &os.PathError{Op: "chmod", Path: name, Err: ErrFileNotFound} + } + prevOtherBits := mem.GetFileInfo(f).Mode() & ^chmodBits + + mode = prevOtherBits | mode + return m.setFileMode(name, mode) +} + +func (m *MemMapFs) setFileMode(name string, mode os.FileMode) error { name = normalizePath(name) m.mu.RLock() diff --git a/vendor/github.com/spf13/afero/os.go b/vendor/github.com/spf13/afero/os.go index 13cc1b84c9..4761db5d72 100644 --- a/vendor/github.com/spf13/afero/os.go +++ b/vendor/github.com/spf13/afero/os.go @@ -99,3 +99,11 @@ func (OsFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { fi, err := os.Lstat(name) return fi, true, err } + +func (OsFs) SymlinkIfPossible(oldname, newname string) error { + return os.Symlink(oldname, newname) +} + +func (OsFs) ReadlinkIfPossible(name string) (string, error) { + return os.Readlink(name) +} diff --git a/vendor/github.com/spf13/afero/readonlyfs.go b/vendor/github.com/spf13/afero/readonlyfs.go index c6376ec373..f94b181b6c 100644 --- a/vendor/github.com/spf13/afero/readonlyfs.go +++ b/vendor/github.com/spf13/afero/readonlyfs.go @@ -44,6 +44,18 @@ func (r *ReadOnlyFs) LstatIfPossible(name string) (os.FileInfo, bool, error) { return fi, false, err } +func (r *ReadOnlyFs) SymlinkIfPossible(oldname, newname string) error { + return &os.LinkError{Op: "symlink", Old: oldname, New: newname, Err: ErrNoSymlink} +} + +func (r *ReadOnlyFs) ReadlinkIfPossible(name string) (string, error) { + if srdr, ok := r.source.(LinkReader); ok { + return srdr.ReadlinkIfPossible(name) + } + + return "", &os.PathError{Op: "readlink", Path: name, Err: ErrNoReadlink} +} + func (r *ReadOnlyFs) Rename(o, n string) error { return syscall.EPERM } diff --git a/vendor/github.com/spf13/afero/regexpfs.go b/vendor/github.com/spf13/afero/regexpfs.go index 9d92dbc051..c8fc008670 100644 --- a/vendor/github.com/spf13/afero/regexpfs.go +++ b/vendor/github.com/spf13/afero/regexpfs.go @@ -126,6 +126,9 @@ func (r *RegexpFs) Open(name string) (File, error) { } } f, err := r.source.Open(name) + if err != nil { + return nil, err + } return &RegexpFile{f: f, re: r.re}, nil } diff --git a/vendor/github.com/spf13/afero/symlink.go b/vendor/github.com/spf13/afero/symlink.go new file mode 100644 index 0000000000..d1c6ea53d9 --- /dev/null +++ b/vendor/github.com/spf13/afero/symlink.go @@ -0,0 +1,55 @@ +// Copyright © 2018 Steve Francia <spf@spf13.com>. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package afero + +import ( + "errors" +) + +// Symlinker is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +// It indicates support for 3 symlink related interfaces that implement the +// behaviors of the os methods: +// - Lstat +// - Symlink, and +// - Readlink +type Symlinker interface { + Lstater + Linker + LinkReader +} + +// Linker is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +// It will call Symlink if the filesystem itself is, or it delegates to, the os filesystem, +// or the filesystem otherwise supports Symlink's. +type Linker interface { + SymlinkIfPossible(oldname, newname string) error +} + +// ErrNoSymlink is the error that will be wrapped in an os.LinkError if a file system +// does not support Symlink's either directly or through its delegated filesystem. +// As expressed by support for the Linker interface. +var ErrNoSymlink = errors.New("symlink not supported") + +// LinkReader is an optional interface in Afero. It is only implemented by the +// filesystems saying so. +type LinkReader interface { + ReadlinkIfPossible(name string) (string, error) +} + +// ErrNoReadlink is the error that will be wrapped in an os.Path if a file system +// does not support the readlink operation either directly or through its delegated filesystem. +// As expressed by support for the LinkReader interface. +var ErrNoReadlink = errors.New("readlink not supported") diff --git a/vendor/github.com/spf13/cast/.travis.yml b/vendor/github.com/spf13/cast/.travis.yml index 6420d1c27f..833a48799e 100644 --- a/vendor/github.com/spf13/cast/.travis.yml +++ b/vendor/github.com/spf13/cast/.travis.yml @@ -4,6 +4,7 @@ env: sudo: required go: - "1.11.x" + - "1.12.x" - tip os: - linux diff --git a/vendor/github.com/spf13/cast/Makefile b/vendor/github.com/spf13/cast/Makefile index 7ccf8930b5..f01a5dbb6e 100644 --- a/vendor/github.com/spf13/cast/Makefile +++ b/vendor/github.com/spf13/cast/Makefile @@ -1,4 +1,4 @@ -# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html +GOVERSION := $(shell go version | cut -d ' ' -f 3 | cut -d '.' -f 2) .PHONY: check fmt lint test test-race vet test-cover-html help .DEFAULT_GOAL := help @@ -12,11 +12,13 @@ test-race: ## Run tests with race detector go test -race ./... fmt: ## Run gofmt linter +ifeq "$(GOVERSION)" "12" @for d in `go list` ; do \ if [ "`gofmt -l -s $$GOPATH/src/$$d | tee /dev/stderr`" ]; then \ echo "^ improperly formatted go files" && echo && exit 1; \ fi \ done +endif lint: ## Run golint linter @for d in `go list` ; do \ diff --git a/vendor/github.com/spf13/cast/caste.go b/vendor/github.com/spf13/cast/caste.go index a4859fb0af..70c7291bed 100644 --- a/vendor/github.com/spf13/cast/caste.go +++ b/vendor/github.com/spf13/cast/caste.go @@ -819,15 +819,15 @@ func ToStringE(i interface{}) (string, error) { case int8: return strconv.FormatInt(int64(s), 10), nil case uint: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case uint64: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case uint32: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case uint16: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case uint8: - return strconv.FormatInt(int64(s), 10), nil + return strconv.FormatUint(uint64(s), 10), nil case []byte: return string(s), nil case template.HTML: diff --git a/vendor/github.com/spf13/viper/.editorconfig b/vendor/github.com/spf13/viper/.editorconfig new file mode 100644 index 0000000000..63afcbcdd4 --- /dev/null +++ b/vendor/github.com/spf13/viper/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.go] +indent_style = tab + +[{Makefile, *.mk}] +indent_style = tab diff --git a/vendor/github.com/spf13/viper/.gitignore b/vendor/github.com/spf13/viper/.gitignore index 01b5c44b9c..8962508398 100644 --- a/vendor/github.com/spf13/viper/.gitignore +++ b/vendor/github.com/spf13/viper/.gitignore @@ -1,29 +1,5 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe -*.test -*.bench - -.vscode - -# exclude dependencies in the `/vendor` folder -vendor +/.idea/ +/bin/ +/build/ +/var/ +/vendor/ diff --git a/vendor/github.com/spf13/viper/.golangci.yml b/vendor/github.com/spf13/viper/.golangci.yml new file mode 100644 index 0000000000..a0755ce7e1 --- /dev/null +++ b/vendor/github.com/spf13/viper/.golangci.yml @@ -0,0 +1,27 @@ +linters-settings: + golint: + min-confidence: 0.1 + goimports: + local-prefixes: github.com/spf13/viper + +linters: + enable-all: true + disable: + - funlen + - maligned + + # TODO: fix me + - wsl + - gochecknoinits + - gosimple + - gochecknoglobals + - errcheck + - lll + - godox + - scopelint + - gocyclo + - gocognit + - gocritic + +service: + golangci-lint-version: 1.21.x diff --git a/vendor/github.com/spf13/viper/.travis.yml b/vendor/github.com/spf13/viper/.travis.yml deleted file mode 100644 index bb83057ba4..0000000000 --- a/vendor/github.com/spf13/viper/.travis.yml +++ /dev/null @@ -1,31 +0,0 @@ -go_import_path: github.com/spf13/viper - -language: go - -env: - global: - - GO111MODULE="on" - -go: - - 1.11.x - - tip - -os: - - linux - - osx - -matrix: - allow_failures: - - go: tip - fast_finish: true - -script: - - go install ./... - - diff -u <(echo -n) <(gofmt -d .) - - go test -v ./... - -after_success: - - go get -u -d github.com/spf13/hugo - - cd $GOPATH/src/github.com/spf13/hugo && make && ./hugo -s docs && cd - - -sudo: false diff --git a/vendor/github.com/spf13/viper/Makefile b/vendor/github.com/spf13/viper/Makefile new file mode 100644 index 0000000000..1c2cab03f4 --- /dev/null +++ b/vendor/github.com/spf13/viper/Makefile @@ -0,0 +1,76 @@ +# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html + +OS = $(shell uname | tr A-Z a-z) +export PATH := $(abspath bin/):${PATH} + +# Build variables +BUILD_DIR ?= build +export CGO_ENABLED ?= 0 +export GOOS = $(shell go env GOOS) +ifeq (${VERBOSE}, 1) +ifeq ($(filter -v,${GOARGS}),) + GOARGS += -v +endif +TEST_FORMAT = short-verbose +endif + +# Dependency versions +GOTESTSUM_VERSION = 0.4.0 +GOLANGCI_VERSION = 1.21.0 + +# Add the ability to override some variables +# Use with care +-include override.mk + +.PHONY: clear +clear: ## Clear the working area and the project + rm -rf bin/ + +.PHONY: check +check: test lint ## Run tests and linters + +bin/gotestsum: bin/gotestsum-${GOTESTSUM_VERSION} + @ln -sf gotestsum-${GOTESTSUM_VERSION} bin/gotestsum +bin/gotestsum-${GOTESTSUM_VERSION}: + @mkdir -p bin + curl -L https://github.com/gotestyourself/gotestsum/releases/download/v${GOTESTSUM_VERSION}/gotestsum_${GOTESTSUM_VERSION}_${OS}_amd64.tar.gz | tar -zOxf - gotestsum > ./bin/gotestsum-${GOTESTSUM_VERSION} && chmod +x ./bin/gotestsum-${GOTESTSUM_VERSION} + +TEST_PKGS ?= ./... +.PHONY: test +test: TEST_FORMAT ?= short +test: SHELL = /bin/bash +test: export CGO_ENABLED=1 +test: bin/gotestsum ## Run tests + @mkdir -p ${BUILD_DIR} + bin/gotestsum --no-summary=skipped --junitfile ${BUILD_DIR}/coverage.xml --format ${TEST_FORMAT} -- -race -coverprofile=${BUILD_DIR}/coverage.txt -covermode=atomic $(filter-out -v,${GOARGS}) $(if ${TEST_PKGS},${TEST_PKGS},./...) + +bin/golangci-lint: bin/golangci-lint-${GOLANGCI_VERSION} + @ln -sf golangci-lint-${GOLANGCI_VERSION} bin/golangci-lint +bin/golangci-lint-${GOLANGCI_VERSION}: + @mkdir -p bin + curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b ./bin/ v${GOLANGCI_VERSION} + @mv bin/golangci-lint $@ + +.PHONY: lint +lint: bin/golangci-lint ## Run linter + bin/golangci-lint run + +.PHONY: fix +fix: bin/golangci-lint ## Fix lint violations + bin/golangci-lint run --fix + +# Add custom targets here +-include custom.mk + +.PHONY: list +list: ## List all make targets + @${MAKE} -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | sort + +.PHONY: help +.DEFAULT_GOAL := help +help: + @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +# Variable outputting/exporting rules +var-%: ; @echo $($*) +varexport-%: ; @echo $*=$($*) diff --git a/vendor/github.com/spf13/viper/README.md b/vendor/github.com/spf13/viper/README.md index 0208eac84d..dfd8034fd5 100644 --- a/vendor/github.com/spf13/viper/README.md +++ b/vendor/github.com/spf13/viper/README.md @@ -1,6 +1,13 @@ -![viper logo](https://cloud.githubusercontent.com/assets/173412/10886745/998df88a-8151-11e5-9448-4736db51020d.png) +![Viper](.github/logo.png?raw=true) -Go configuration with fangs! +[![Mentioned in Awesome Go](https://awesome.re/mentioned-badge-flat.svg)](https://github.com/avelino/awesome-go#configuration) + +[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/spf13/viper/CI?style=flat-square)](https://github.com/spf13/viper/actions?query=workflow%3ACI) +[![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/viper?style=flat-square)](https://goreportcard.com/report/github.com/spf13/viper) +[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/mod/github.com/spf13/viper) + +**Go configuration with fangs!** Many Go projects are built using Viper including: @@ -12,8 +19,14 @@ Many Go projects are built using Viper including: * [BloomApi](https://www.bloomapi.com/) * [doctl](https://github.com/digitalocean/doctl) * [Clairctl](https://github.com/jgsqware/clairctl) +* [Mercure](https://mercure.rocks) + -[![Build Status](https://travis-ci.org/spf13/viper.svg)](https://travis-ci.org/spf13/viper) [![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GoDoc](https://godoc.org/github.com/spf13/viper?status.svg)](https://godoc.org/github.com/spf13/viper) +## Install + +```console +go get github.com/spf13/viper +``` ## What is Viper? @@ -23,7 +36,7 @@ to work within an application, and can handle all types of configuration needs and formats. It supports: * setting defaults -* reading from JSON, TOML, YAML, HCL, and Java properties config files +* reading from JSON, TOML, YAML, HCL, envfile and Java properties config files * live watching and re-reading of config files (optional) * reading from environment variables * reading from remote config systems (etcd or Consul), and watching changes @@ -31,8 +44,8 @@ and formats. It supports: * reading from buffer * setting explicit values -Viper can be thought of as a registry for all of your applications -configuration needs. +Viper can be thought of as a registry for all of your applications configuration needs. + ## Why Viper? @@ -42,34 +55,31 @@ Viper is here to help with that. Viper does the following for you: -1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, or Java properties formats. -2. Provide a mechanism to set default values for your different - configuration options. -3. Provide a mechanism to set override values for options specified through - command line flags. -4. Provide an alias system to easily rename parameters without breaking existing - code. -5. Make it easy to tell the difference between when a user has provided a - command line or config file which is the same as the default. +1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, INI, envfile or Java properties formats. +2. Provide a mechanism to set default values for your different configuration options. +3. Provide a mechanism to set override values for options specified through command line flags. +4. Provide an alias system to easily rename parameters without breaking existing code. +5. Make it easy to tell the difference between when a user has provided a command line or config file which is the same as the default. -Viper uses the following precedence order. Each item takes precedence over the -item below it: +Viper uses the following precedence order. Each item takes precedence over the item below it: - * explicit call to Set + * explicit call to `Set` * flag * env * config * key/value store * default -Viper configuration keys are case insensitive. +**Important:** Viper configuration keys are case insensitive. +There are ongoing discussions about making that optional. + ## Putting Values into Viper ### Establishing Defaults A good configuration system will support default values. A default value is not -required for a key, but it’s useful in the event that a key hasn’t been set via +required for a key, but it’s useful in the event that a key hasn't been set via config file, environment variable, remote configuration or flag. Examples: @@ -83,7 +93,7 @@ viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "cat ### Reading Config Files Viper requires minimal configuration so it knows where to look for config files. -Viper supports JSON, TOML, YAML, HCL, and Java Properties files. Viper can search multiple paths, but +Viper supports JSON, TOML, YAML, HCL, INI, envfile and Java Properties files. Viper can search multiple paths, but currently a single Viper instance only supports a single configuration file. Viper does not default to any configuration search paths leaving defaults decision to an application. @@ -94,6 +104,7 @@ where a configuration file is expected. ```go viper.SetConfigName("config") // name of config file (without extension) +viper.SetConfigType("yaml") // REQUIRED if the config file does not have the extension in the name viper.AddConfigPath("/etc/appname/") // path to look for the config file in viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths viper.AddConfigPath(".") // optionally look for config in the working directory @@ -103,6 +114,44 @@ if err != nil { // Handle errors reading the config file } ``` +You can handle the specific case where no config file is found like this: + +```go +if err := viper.ReadInConfig(); err != nil { + if _, ok := err.(viper.ConfigFileNotFoundError); ok { + // Config file not found; ignore error if desired + } else { + // Config file was found but another error was produced + } +} + +// Config file found and successfully parsed +``` + +*NOTE [since 1.6]:* You can also have a file without an extension and specify the format programmaticaly. For those configuration files that lie in the home of the user without any extension like `.bashrc` + +### Writing Config Files + +Reading from config files is useful, but at times you want to store all modifications made at run time. +For that, a bunch of commands are available, each with its own purpose: + +* WriteConfig - writes the current viper configuration to the predefined path, if exists. Errors if no predefined path. Will overwrite the current config file, if it exists. +* SafeWriteConfig - writes the current viper configuration to the predefined path. Errors if no predefined path. Will not overwrite the current config file, if it exists. +* WriteConfigAs - writes the current viper configuration to the given filepath. Will overwrite the given file, if it exists. +* SafeWriteConfigAs - writes the current viper configuration to the given filepath. Will not overwrite the given file, if it exists. + +As a rule of the thumb, everything marked with safe won't overwrite any file, but just create if not existent, whilst the default behavior is to create or truncate. + +A small examples section: + +```go +viper.WriteConfig() // writes current config to predefined path set by 'viper.AddConfigPath()' and 'viper.SetConfigName' +viper.SafeWriteConfig() +viper.WriteConfigAs("/path/to/my/.config") +viper.SafeWriteConfigAs("/path/to/my/.config") // will error since it has already been written +viper.SafeWriteConfigAs("/path/to/my/.other_config") +``` + ### Watching and re-reading config files Viper supports the ability to have your application live read a config file while running. @@ -186,7 +235,7 @@ with ENV: * `BindEnv(string...) : error` * `SetEnvPrefix(string)` * `SetEnvKeyReplacer(string...) *strings.Replacer` - * `AllowEmptyEnvVar(bool)` + * `AllowEmptyEnv(bool)` _When working with ENV variables, it’s important to recognize that Viper treats ENV variables as case sensitive._ @@ -199,9 +248,9 @@ prefix. `BindEnv` takes one or two parameters. The first parameter is the key name, the second is the name of the environment variable. The name of the environment variable is case sensitive. If the ENV variable name is not provided, then -Viper will automatically assume that the key name matches the ENV variable name, -but the ENV variable is IN ALL CAPS. When you explicitly provide the ENV -variable name, it **does not** automatically add the prefix. +Viper will automatically assume that the ENV variable matches the following format: prefix + "_" + the key name in ALL CAPS. When you explicitly provide the ENV variable name (the second parameter), +it **does not** automatically add the prefix. For example if the second parameter is "id", +Viper will look for the ENV variable "ID". One important thing to recognize when working with ENV variables is that the value will be read each time it is accessed. Viper does not fix the value when @@ -218,6 +267,9 @@ keys to an extent. This is useful if you want to use `-` or something in your `Get()` calls, but want your environmental variables to use `_` delimiters. An example of using it can be found in `viper_test.go`. +Alternatively, you can use `EnvKeyReplacer` with `NewWithOptions` factory function. +Unlike `SetEnvKeyReplacer`, it accepts a `StringReplacer` interface allowing you to write custom string replacing logic. + By default empty environment variables are considered unset and will fall back to the next configuration source. To treat empty environment variables as set, use the `AllowEmptyEnv` method. @@ -346,12 +398,12 @@ package: `import _ "github.com/spf13/viper/remote"` -Viper will read a config string (as JSON, TOML, YAML or HCL) retrieved from a path +Viper will read a config string (as JSON, TOML, YAML, HCL or envfile) retrieved from a path in a Key/Value store such as etcd or Consul. These values take precedence over default values, but are overridden by configuration values retrieved from disk, flags, or environment variables. -Viper uses [crypt](https://github.com/xordataexchange/crypt) to retrieve +Viper uses [crypt](https://github.com/bketelsen/crypt) to retrieve configuration from the K/V store, which means that you can store your configuration values encrypted and have them automatically decrypted if you have the correct gpg keyring. Encryption is optional. @@ -363,7 +415,7 @@ independently of it. K/V store. `crypt` defaults to etcd on http://127.0.0.1:4001. ```bash -$ go get github.com/xordataexchange/crypt/bin/crypt +$ go get github.com/bketelsen/crypt/bin/crypt $ crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json ``` @@ -381,12 +433,12 @@ how to use Consul. #### etcd ```go viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json") -viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" err := viper.ReadRemoteConfig() ``` #### Consul -You need to set a key to Consul key/value storage with JSON value containing your desired config. +You need to set a key to Consul key/value storage with JSON value containing your desired config. For example, create a Consul key/value store key `MY_CONSUL_KEY` with value: ```json @@ -405,11 +457,21 @@ fmt.Println(viper.Get("port")) // 8080 fmt.Println(viper.Get("hostname")) // myhostname.com ``` +#### Firestore + +```go +viper.AddRemoteProvider("firestore", "google-cloud-project-id", "collection/document") +viper.SetConfigType("json") // Config's format: "json", "toml", "yaml", "yml" +err := viper.ReadRemoteConfig() +``` + +Of course, you're allowed to use `SecureRemoteProvider` also + ### Remote Key/Value Store Example - Encrypted ```go viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg") -viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" err := viper.ReadRemoteConfig() ``` @@ -420,7 +482,7 @@ err := viper.ReadRemoteConfig() var runtime_viper = viper.New() runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml") -runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop" +runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv" // read from remote config the first time. err := runtime_viper.ReadRemoteConfig() @@ -456,6 +518,7 @@ The following functions and methods exist: * `GetBool(key string) : bool` * `GetFloat64(key string) : float64` * `GetInt(key string) : int` + * `GetIntSlice(key string) : []int` * `GetString(key string) : string` * `GetStringMap(key string) : map[string]interface{}` * `GetStringMapString(key string) : map[string]string` @@ -611,30 +674,89 @@ type config struct { var C config -err := Unmarshal(&C) +err := viper.Unmarshal(&C) +if err != nil { + t.Fatalf("unable to decode into struct, %v", err) +} +``` + +If you want to unmarshal configuration where the keys themselves contain dot (the default key delimiter), +you have to change the delimiter: + +```go +v := viper.NewWithOptions(viper.KeyDelimiter("::")) + +v.SetDefault("chart::values", map[string]interface{}{ + "ingress": map[string]interface{}{ + "annotations": map[string]interface{}{ + "traefik.frontend.rule.type": "PathPrefix", + "traefik.ingress.kubernetes.io/ssl-redirect": "true", + }, + }, +}) + +type config struct { + Chart struct{ + Values map[string]interface{} + } +} + +var C config + +v.Unmarshal(&C) +``` + +Viper also supports unmarshaling into embedded structs: + +```go +/* +Example config: + +module: + enabled: true + token: 89h3f98hbwf987h3f98wenf89ehf +*/ +type config struct { + Module struct { + Enabled bool + + moduleConfig `mapstructure:",squash"` + } +} + +// moduleConfig could be in a module specific package +type moduleConfig struct { + Token string +} + +var C config + +err := viper.Unmarshal(&C) if err != nil { t.Fatalf("unable to decode into struct, %v", err) } ``` +Viper uses [github.com/mitchellh/mapstructure](https://github.com/mitchellh/mapstructure) under the hood for unmarshaling values which uses `mapstructure` tags by default. + ### Marshalling to string -You may need to marhsal all the settings held in viper into a string rather than write them to a file. +You may need to marshal all the settings held in viper into a string rather than write them to a file. You can use your favorite format's marshaller with the config returned by `AllSettings()`. ```go import ( yaml "gopkg.in/yaml.v2" // ... -) +) func yamlStringSettings() string { c := viper.AllSettings() - bs, err := yaml.Marshal(c) - if err != nil { - t.Fatalf("unable to marshal config to YAML: %v", err) + bs, err := yaml.Marshal(c) + if err != nil { + log.Fatalf("unable to marshal config to YAML: %v", err) } - return string(bs) + return string(bs) } ``` @@ -672,13 +794,6 @@ different vipers. ## Q & A -Q: Why not INI files? - -A: Ini files are pretty awful. There’s no standard format, and they are hard to -validate. Viper is designed to work with JSON, TOML or YAML files. If someone -really wants to add this feature, I’d be happy to merge it. It’s easy to specify -which formats your application will permit. - Q: Why is it called “Viper”? A: Viper is designed to be a [companion](http://en.wikipedia.org/wiki/Viper_(G.I._Joe)) diff --git a/vendor/github.com/spf13/viper/flags.go b/vendor/github.com/spf13/viper/flags.go index dd32f4e1c2..b5ddbf5d46 100644 --- a/vendor/github.com/spf13/viper/flags.go +++ b/vendor/github.com/spf13/viper/flags.go @@ -36,7 +36,7 @@ type pflagValue struct { flag *pflag.Flag } -// HasChanges returns whether the flag has changes or not. +// HasChanged returns whether the flag has changes or not. func (p pflagValue) HasChanged() bool { return p.flag.Changed } diff --git a/vendor/github.com/spf13/viper/go.mod b/vendor/github.com/spf13/viper/go.mod index 2794300552..7d108dcc21 100644 --- a/vendor/github.com/spf13/viper/go.mod +++ b/vendor/github.com/spf13/viper/go.mod @@ -1,43 +1,40 @@ module github.com/spf13/viper +go 1.12 + require ( - github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 // indirect + github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c github.com/coreos/bbolt v1.3.2 // indirect - github.com/coreos/etcd v3.3.10+incompatible // indirect - github.com/coreos/go-semver v0.2.0 // indirect github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e // indirect github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect github.com/fsnotify/fsnotify v1.4.7 github.com/gogo/protobuf v1.2.1 // indirect github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef // indirect - github.com/google/btree v1.0.0 // indirect - github.com/gorilla/websocket v1.4.0 // indirect + github.com/gorilla/websocket v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.9.0 // indirect github.com/hashicorp/hcl v1.0.0 github.com/jonboulle/clockwork v0.1.0 // indirect - github.com/magiconair/properties v1.8.0 + github.com/magiconair/properties v1.8.1 github.com/mitchellh/mapstructure v1.1.2 github.com/pelletier/go-toml v1.2.0 github.com/prometheus/client_golang v0.9.3 // indirect + github.com/smartystreets/goconvey v1.6.4 // indirect github.com/soheilhy/cmux v0.1.4 // indirect github.com/spf13/afero v1.1.2 github.com/spf13/cast v1.3.0 github.com/spf13/jwalterweatherman v1.0.0 github.com/spf13/pflag v1.0.3 - github.com/stretchr/testify v1.2.2 + github.com/stretchr/testify v1.3.0 + github.com/subosito/gotenv v1.2.0 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect - github.com/ugorji/go v1.1.4 // indirect github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect - github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 go.etcd.io/bbolt v1.3.2 // indirect go.uber.org/atomic v1.4.0 // indirect go.uber.org/multierr v1.1.0 // indirect go.uber.org/zap v1.10.0 // indirect - golang.org/x/net v0.0.0-20190522155817-f3200d17e092 // indirect - golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect - google.golang.org/grpc v1.21.0 // indirect - gopkg.in/yaml.v2 v2.2.2 + gopkg.in/ini.v1 v1.51.0 + gopkg.in/yaml.v2 v2.2.4 ) diff --git a/vendor/github.com/spf13/viper/go.sum b/vendor/github.com/spf13/viper/go.sum index 97afaffe22..463aa7dbf5 100644 --- a/vendor/github.com/spf13/viper/go.sum +++ b/vendor/github.com/spf13/viper/go.sum @@ -1,35 +1,62 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/firestore v1.1.0 h1:9x7Bx0A9R5/M9jibeJeZWqjeVEIxYW9fZYqB9a70/bY= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da h1:8GUt8eRujhVEGZFFEjBj46YV4rDjvGrNxb0KMWYkL2I= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/etcd v3.3.13+incompatible h1:8F3hqu9fGYLBifCmRCJsicFqDx/D68Rt3q1JMazcgBQ= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 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/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= @@ -42,24 +69,79 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +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/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmonfrMlCDdsejg4CZE7c= 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 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= 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 h1:bM6ZAFZmc/wPFaRDi0d5L7hGEZEx/2u+Tmr2evNHDiI= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPTsYjhY= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +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/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= +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 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3 h1:EmmoJme1matNzb+hMpDuR/0sbJSUisxyqBGG676r31M= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -71,20 +153,41 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN 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/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -99,8 +202,16 @@ github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzr github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= 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= @@ -112,19 +223,23 @@ github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9 github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= 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.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +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/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= @@ -132,47 +247,142 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5 h1:58fnuSXlxZmFdJyvtTFVmVhcMLU6v5fEb/ok4wyqtNU= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0 h1:HyfiK1WMnHj5FXFXatD+Qs1A/xC2Run6RzeW1SyHxpc= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/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-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-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384 h1:TFlARGu6Czu1z7q93HTxcP1P+/ZFC/IKythI5RzrnRg= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/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 h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0 h1:G+97AoqBnmZIT91cLG/EkCoK9NSelj64P8bOHHNmGn0= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1 h1:j6XxA85m/6txkUCHvzlV5f+HBNl/1r5cZ2A/3IEFOO8= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -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= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/vendor/github.com/spf13/viper/util.go b/vendor/github.com/spf13/viper/util.go index 952cad44c6..b788969637 100644 --- a/vendor/github.com/spf13/viper/util.go +++ b/vendor/github.com/spf13/viper/util.go @@ -114,11 +114,11 @@ func absPathify(inPath string) string { return "" } -// Check if File / Directory Exists +// Check if file Exists func exists(fs afero.Fs, path string) (bool, error) { - _, err := fs.Stat(path) + stat, err := fs.Stat(path) if err == nil { - return true, nil + return !stat.IsDir(), nil } if os.IsNotExist(err) { return false, nil diff --git a/vendor/github.com/spf13/viper/viper.go b/vendor/github.com/spf13/viper/viper.go index a3d37f8c2b..f61f4ed755 100644 --- a/vendor/github.com/spf13/viper/viper.go +++ b/vendor/github.com/spf13/viper/viper.go @@ -3,7 +3,7 @@ // Use of this source code is governed by an MIT-style // license that can be found in the LICENSE file. -// Viper is a application configuration system. +// Viper is an application configuration system. // It believes that applications can be configured a variety of ways // via flags, ENVIRONMENT variables, configuration files retrieved // from the file system, or a remote key/value store. @@ -23,6 +23,7 @@ import ( "bytes" "encoding/csv" "encoding/json" + "errors" "fmt" "io" "log" @@ -33,18 +34,19 @@ import ( "sync" "time" - yaml "gopkg.in/yaml.v2" - "github.com/fsnotify/fsnotify" "github.com/hashicorp/hcl" "github.com/hashicorp/hcl/hcl/printer" "github.com/magiconair/properties" "github.com/mitchellh/mapstructure" - toml "github.com/pelletier/go-toml" + "github.com/pelletier/go-toml" "github.com/spf13/afero" "github.com/spf13/cast" jww "github.com/spf13/jwalterweatherman" "github.com/spf13/pflag" + "github.com/subosito/gotenv" + "gopkg.in/ini.v1" + "gopkg.in/yaml.v2" ) // ConfigMarshalError happens when failing to marshal the configuration. @@ -114,6 +116,14 @@ func (fnfe ConfigFileNotFoundError) Error() string { return fmt.Sprintf("Config File %q Not Found in %q", fnfe.name, fnfe.locations) } +// ConfigFileAlreadyExistsError denotes failure to write new configuration file. +type ConfigFileAlreadyExistsError string + +// Error returns the formatted error when configuration already exists. +func (faee ConfigFileAlreadyExistsError) Error() string { + return fmt.Sprintf("Config File %q Already Exists", string(faee)) +} + // A DecoderConfigOption can be passed to viper.Unmarshal to configure // mapstructure.DecoderConfig options type DecoderConfigOption func(*mapstructure.DecoderConfig) @@ -187,7 +197,7 @@ type Viper struct { envPrefix string automaticEnvApplied bool - envKeyReplacer *strings.Replacer + envKeyReplacer StringReplacer allowEmptyEnv bool config map[string]interface{} @@ -225,13 +235,59 @@ func New() *Viper { return v } -// Intended for testing, will reset all to default settings. +// Option configures Viper using the functional options paradigm popularized by Rob Pike and Dave Cheney. +// If you're unfamiliar with this style, +// see https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html and +// https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis. +type Option interface { + apply(v *Viper) +} + +type optionFunc func(v *Viper) + +func (fn optionFunc) apply(v *Viper) { + fn(v) +} + +// KeyDelimiter sets the delimiter used for determining key parts. +// By default it's value is ".". +func KeyDelimiter(d string) Option { + return optionFunc(func(v *Viper) { + v.keyDelim = d + }) +} + +// StringReplacer applies a set of replacements to a string. +type StringReplacer interface { + // Replace returns a copy of s with all replacements performed. + Replace(s string) string +} + +// EnvKeyReplacer sets a replacer used for mapping environment variables to internal keys. +func EnvKeyReplacer(r StringReplacer) Option { + return optionFunc(func(v *Viper) { + v.envKeyReplacer = r + }) +} + +// NewWithOptions creates a new Viper instance. +func NewWithOptions(opts ...Option) *Viper { + v := New() + + for _, opt := range opts { + opt.apply(v) + } + + return v +} + +// Reset is intended for testing, will reset all to default settings. // In the public interface for the viper package so applications // can use it in their testing as well. func Reset() { v = New() - SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} - SupportedRemoteProviders = []string{"etcd", "consul"} + SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "dotenv", "env", "ini"} + SupportedRemoteProviders = []string{"etcd", "consul", "firestore"} } type defaultRemoteProvider struct { @@ -269,10 +325,10 @@ type RemoteProvider interface { } // SupportedExts are universally supported extensions. -var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"} +var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl", "dotenv", "env", "ini"} // SupportedRemoteProviders are universally supported remote providers. -var SupportedRemoteProviders = []string{"etcd", "consul"} +var SupportedRemoteProviders = []string{"etcd", "consul", "firestore"} func OnConfigChange(run func(in fsnotify.Event)) { v.OnConfigChange(run) } func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) { @@ -294,6 +350,7 @@ func (v *Viper) WatchConfig() { filename, err := v.getConfigFile() if err != nil { log.Printf("error: %v\n", err) + initWG.Done() return } @@ -343,7 +400,7 @@ func (v *Viper) WatchConfig() { } }() watcher.Add(configDir) - initWG.Done() // done initalizing the watch in this go routine, so the parent routine can move on... + initWG.Done() // done initializing the watch in this go routine, so the parent routine can move on... eventsWG.Wait() // now, wait for event loop to end in this go-routine... }() initWG.Wait() // make sure that the go routine above fully ended before returning @@ -420,7 +477,7 @@ func (v *Viper) AddConfigPath(in string) { // AddRemoteProvider adds a remote configuration source. // Remote Providers are searched in the order they are added. -// provider is a string value, "etcd" or "consul" are currently supported. +// provider is a string value: "etcd", "consul" or "firestore" are currently supported. // endpoint is the url. etcd requires http://ip:port consul requires ip:port // path is the path in the k/v store to retrieve configuration // To retrieve a config file called myapp.json from /configs/myapp.json @@ -449,14 +506,14 @@ func (v *Viper) AddRemoteProvider(provider, endpoint, path string) error { // AddSecureRemoteProvider adds a remote configuration source. // Secure Remote Providers are searched in the order they are added. -// provider is a string value, "etcd" or "consul" are currently supported. +// provider is a string value: "etcd", "consul" or "firestore" are currently supported. // endpoint is the url. etcd requires http://ip:port consul requires ip:port // secretkeyring is the filepath to your openpgp secret keyring. e.g. /etc/secrets/myring.gpg // path is the path in the k/v store to retrieve configuration // To retrieve a config file called myapp.json from /configs/myapp.json // you should set path to /configs and set config name (SetConfigName()) to // "myapp" -// Secure Remote Providers are implemented with github.com/xordataexchange/crypt +// Secure Remote Providers are implemented with github.com/bketelsen/crypt func AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error { return v.AddSecureRemoteProvider(provider, endpoint, path, secretkeyring) } @@ -668,7 +725,7 @@ func GetViper() *Viper { func Get(key string) interface{} { return v.Get(key) } func (v *Viper) Get(key string) interface{} { lcaseKey := strings.ToLower(key) - val := v.find(lcaseKey) + val := v.find(lcaseKey, true) if val == nil { return nil } @@ -705,6 +762,8 @@ func (v *Viper) Get(key string) interface{} { return cast.ToDuration(val) case []string: return cast.ToStringSlice(val) + case []int: + return cast.ToIntSlice(val) } } @@ -794,6 +853,12 @@ func (v *Viper) GetDuration(key string) time.Duration { return cast.ToDuration(v.Get(key)) } +// GetIntSlice returns the value associated with the key as a slice of int values. +func GetIntSlice(key string) []int { return v.GetIntSlice(key) } +func (v *Viper) GetIntSlice(key string) []int { + return cast.ToIntSlice(v.Get(key)) +} + // GetStringSlice returns the value associated with the key as a slice of strings. func GetStringSlice(key string) []string { return v.GetStringSlice(key) } func (v *Viper) GetStringSlice(key string) []string { @@ -884,8 +949,11 @@ func decode(input interface{}, config *mapstructure.DecoderConfig) error { // UnmarshalExact unmarshals the config into a Struct, erroring if a field is nonexistent // in the destination struct. -func (v *Viper) UnmarshalExact(rawVal interface{}) error { - config := defaultDecoderConfig(rawVal) +func UnmarshalExact(rawVal interface{}, opts ...DecoderConfigOption) error { + return v.UnmarshalExact(rawVal, opts...) +} +func (v *Viper) UnmarshalExact(rawVal interface{}, opts ...DecoderConfigOption) error { + config := defaultDecoderConfig(rawVal, opts...) config.ErrorUnused = true err := decode(v.AllSettings(), config) @@ -928,11 +996,6 @@ func (v *Viper) BindFlagValues(flags FlagValueSet) (err error) { } // BindFlagValue binds a specific key to a FlagValue. -// Example (where serverCmd is a Cobra instance): -// -// serverCmd.Flags().Int("port", 1138, "Port to run Application server on") -// Viper.BindFlagValue("port", serverCmd.Flags().Lookup("port")) -// func BindFlagValue(key string, flag FlagValue) error { return v.BindFlagValue(key, flag) } func (v *Viper) BindFlagValue(key string, flag FlagValue) error { if flag == nil { @@ -950,7 +1013,7 @@ func BindEnv(input ...string) error { return v.BindEnv(input...) } func (v *Viper) BindEnv(input ...string) error { var key, envkey string if len(input) == 0 { - return fmt.Errorf("BindEnv missing key to bind to") + return fmt.Errorf("missing key to bind to") } key = strings.ToLower(input[0]) @@ -967,12 +1030,15 @@ func (v *Viper) BindEnv(input ...string) error { } // Given a key, find the value. -// Viper will check in the following order: -// flag, env, config file, key/value store, default. +// // Viper will check to see if an alias exists first. +// Viper will then check in the following order: +// flag, env, config file, key/value store. +// Lastly, if no value was found and flagDefault is true, and if the key +// corresponds to a flag, the flag's default value is returned. +// // Note: this assumes a lower-cased key given. -func (v *Viper) find(lcaseKey string) interface{} { - +func (v *Viper) find(lcaseKey string, flagDefault bool) interface{} { var ( val interface{} exists bool @@ -1012,6 +1078,13 @@ func (v *Viper) find(lcaseKey string) interface{} { s = strings.TrimSuffix(s, "]") res, _ := readAsCSV(s) return res + case "intSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return cast.ToIntSlice(res) + case "stringToString": + return stringToStringConv(flag.ValueString()) default: return flag.ValueString() } @@ -1068,24 +1141,33 @@ func (v *Viper) find(lcaseKey string) interface{} { return nil } - // last chance: if no other value is returned and a flag does exist for the value, - // get the flag's value even if the flag's value has not changed - if flag, exists := v.pflags[lcaseKey]; exists { - switch flag.ValueType() { - case "int", "int8", "int16", "int32", "int64": - return cast.ToInt(flag.ValueString()) - case "bool": - return cast.ToBool(flag.ValueString()) - case "stringSlice": - s := strings.TrimPrefix(flag.ValueString(), "[") - s = strings.TrimSuffix(s, "]") - res, _ := readAsCSV(s) - return res - default: - return flag.ValueString() + if flagDefault { + // last chance: if no value is found and a flag does exist for the key, + // get the flag's default value even if the flag's value has not been set. + if flag, exists := v.pflags[lcaseKey]; exists { + switch flag.ValueType() { + case "int", "int8", "int16", "int32", "int64": + return cast.ToInt(flag.ValueString()) + case "bool": + return cast.ToBool(flag.ValueString()) + case "stringSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return res + case "intSlice": + s := strings.TrimPrefix(flag.ValueString(), "[") + s = strings.TrimSuffix(s, "]") + res, _ := readAsCSV(s) + return cast.ToIntSlice(res) + case "stringToString": + return stringToStringConv(flag.ValueString()) + default: + return flag.ValueString() + } } + // last item, no need to check shadowing } - // last item, no need to check shadowing return nil } @@ -1099,12 +1181,36 @@ func readAsCSV(val string) ([]string, error) { return csvReader.Read() } +// mostly copied from pflag's implementation of this operation here https://github.com/spf13/pflag/blob/master/string_to_string.go#L79 +// alterations are: errors are swallowed, map[string]interface{} is returned in order to enable cast.ToStringMap +func stringToStringConv(val string) interface{} { + val = strings.Trim(val, "[]") + // An empty string would cause an empty map + if len(val) == 0 { + return map[string]interface{}{} + } + r := csv.NewReader(strings.NewReader(val)) + ss, err := r.Read() + if err != nil { + return nil + } + out := make(map[string]interface{}, len(ss)) + for _, pair := range ss { + kv := strings.SplitN(pair, "=", 2) + if len(kv) != 2 { + return nil + } + out[kv[0]] = kv[1] + } + return out +} + // IsSet checks to see if the key has been set in any of the data locations. // IsSet is case-insensitive for a key. func IsSet(key string) bool { return v.IsSet(key) } func (v *Viper) IsSet(key string) bool { lcaseKey := strings.ToLower(key) - val := v.find(lcaseKey) + val := v.find(lcaseKey, false) return val != nil } @@ -1123,8 +1229,8 @@ func (v *Viper) SetEnvKeyReplacer(r *strings.Replacer) { v.envKeyReplacer = r } -// Aliases provide another accessor for the same key. -// This enables one to change a name without breaking the application +// RegisterAlias creates an alias that provides another accessor for the same key. +// This enables one to change a name without breaking the application. func RegisterAlias(alias string, key string) { v.RegisterAlias(alias, key) } func (v *Viper) RegisterAlias(alias string, key string) { v.registerAlias(alias, strings.ToLower(key)) @@ -1311,11 +1417,10 @@ func (v *Viper) WriteConfig() error { // SafeWriteConfig writes current configuration to file only if the file does not exist. func SafeWriteConfig() error { return v.SafeWriteConfig() } func (v *Viper) SafeWriteConfig() error { - filename, err := v.getConfigFile() - if err != nil { - return err + if len(v.configPaths) < 1 { + return errors.New("missing configuration for 'configPath'") } - return v.writeConfig(filename, false) + return v.SafeWriteConfigAs(filepath.Join(v.configPaths[0], v.configName+"."+v.configType)) } // WriteConfigAs writes current configuration to a given filename. @@ -1327,38 +1432,48 @@ func (v *Viper) WriteConfigAs(filename string) error { // SafeWriteConfigAs writes current configuration to a given filename if it does not exist. func SafeWriteConfigAs(filename string) error { return v.SafeWriteConfigAs(filename) } func (v *Viper) SafeWriteConfigAs(filename string) error { + alreadyExists, err := afero.Exists(v.fs, filename) + if alreadyExists && err == nil { + return ConfigFileAlreadyExistsError(filename) + } return v.writeConfig(filename, false) } -func writeConfig(filename string, force bool) error { return v.writeConfig(filename, force) } func (v *Viper) writeConfig(filename string, force bool) error { jww.INFO.Println("Attempting to write configuration to file.") + var configType string + ext := filepath.Ext(filename) - if len(ext) <= 1 { - return fmt.Errorf("Filename: %s requires valid extension.", filename) + if ext != "" { + configType = ext[1:] + } else { + configType = v.configType } - configType := ext[1:] + if configType == "" { + return fmt.Errorf("config type could not be determined for %s", filename) + } + if !stringInSlice(configType, SupportedExts) { return UnsupportedConfigError(configType) } if v.config == nil { v.config = make(map[string]interface{}) } - var flags int - if force == true { - flags = os.O_CREATE | os.O_TRUNC | os.O_WRONLY - } else { - if _, err := os.Stat(filename); os.IsNotExist(err) { - flags = os.O_WRONLY - } else { - return fmt.Errorf("File: %s exists. Use WriteConfig to overwrite.", filename) - } + flags := os.O_CREATE | os.O_TRUNC | os.O_WRONLY + if !force { + flags |= os.O_EXCL } f, err := v.fs.OpenFile(filename, flags, v.configPermissions) if err != nil { return err } - return v.marshalWriter(f, configType) + defer f.Close() + + if err := v.marshalWriter(f, configType); err != nil { + return err + } + + return f.Sync() } // Unmarshal a Reader into a map. @@ -1382,7 +1497,7 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { } case "hcl": - obj, err := hcl.Parse(string(buf.Bytes())) + obj, err := hcl.Parse(buf.String()) if err != nil { return ConfigParseError{err} } @@ -1400,6 +1515,15 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { c[k] = v } + case "dotenv", "env": + env, err := gotenv.StrictParse(buf) + if err != nil { + return ConfigParseError{err} + } + for k, v := range env { + c[k] = v + } + case "properties", "props", "prop": v.properties = properties.NewProperties() var err error @@ -1415,6 +1539,23 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { // set innermost value deepestMap[lastKey] = value } + + case "ini": + cfg := ini.Empty() + err := cfg.Append(buf.Bytes()) + if err != nil { + return ConfigParseError{err} + } + sections := cfg.Sections() + for i := 0; i < len(sections); i++ { + section := sections[i] + keys := section.Keys() + for j := 0; j < len(keys); j++ { + key := keys[j] + value := cfg.Section(section.Name()).Key(key.Name()).String() + c[section.Name()+"."+key.Name()] = value + } + } } insensitiviseMap(c) @@ -1422,9 +1563,6 @@ func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error { } // Marshal a map into Writer. -func marshalWriter(f afero.File, configType string) error { - return v.marshalWriter(f, configType) -} func (v *Viper) marshalWriter(f afero.File, configType string) error { c := v.AllSettings() switch configType { @@ -1440,6 +1578,9 @@ func (v *Viper) marshalWriter(f afero.File, configType string) error { case "hcl": b, err := json.Marshal(c) + if err != nil { + return ConfigMarshalError{err} + } ast, err := hcl.Parse(string(b)) if err != nil { return ConfigMarshalError{err} @@ -1465,6 +1606,18 @@ func (v *Viper) marshalWriter(f afero.File, configType string) error { return ConfigMarshalError{err} } + case "dotenv", "env": + lines := []string{} + for _, key := range v.AllKeys() { + envName := strings.ToUpper(strings.Replace(key, ".", "_", -1)) + val := v.Get(key) + lines = append(lines, fmt.Sprintf("%v=%v", envName, val)) + } + s := strings.Join(lines, "\n") + if _, err := f.WriteString(s); err != nil { + return ConfigMarshalError{err} + } + case "toml": t, err := toml.TreeFromMap(c) if err != nil { @@ -1483,6 +1636,22 @@ func (v *Viper) marshalWriter(f afero.File, configType string) error { if _, err = f.WriteString(string(b)); err != nil { return ConfigMarshalError{err} } + + case "ini": + keys := v.AllKeys() + cfg := ini.Empty() + ini.PrettyFormat = false + for i := 0; i < len(keys); i++ { + key := keys[i] + lastSep := strings.LastIndex(key, ".") + sectionName := key[:(lastSep)] + keyName := key[(lastSep + 1):] + if sectionName == "default" { + sectionName = "" + } + cfg.Section(sectionName).Key(keyName).SetValue(v.Get(key).(string)) + } + cfg.WriteTo(f) } return nil } @@ -1629,7 +1798,7 @@ func (v *Viper) getRemoteConfig(provider RemoteProvider) (map[string]interface{} func (v *Viper) watchKeyValueConfigOnChannel() error { for _, rp := range v.remoteProviders { respc, _ := RemoteConfig.WatchChannel(rp) - //Todo: Add quit channel + // Todo: Add quit channel go func(rc <-chan *RemoteResponse) { for { b := <-rc @@ -1665,7 +1834,7 @@ func (v *Viper) watchRemoteConfig(provider RemoteProvider) (map[string]interface } // AllKeys returns all keys holding a value, regardless of where they are set. -// Nested keys are returned with a v.keyDelim (= ".") separator +// Nested keys are returned with a v.keyDelim separator func AllKeys() []string { return v.AllKeys() } func (v *Viper) AllKeys() []string { m := map[string]bool{} @@ -1679,7 +1848,7 @@ func (v *Viper) AllKeys() []string { m = v.flattenAndMergeMap(m, v.defaults, "") // convert set of paths to list - a := []string{} + a := make([]string, 0, len(m)) for x := range m { a = append(a, x) } @@ -1688,7 +1857,7 @@ func (v *Viper) AllKeys() []string { // flattenAndMergeMap recursively flattens the given map into a map[string]bool // of key paths (used as a set, easier to manipulate than a []string): -// - each path is merged into a single key string, delimited with v.keyDelim (= ".") +// - each path is merged into a single key string, delimited with v.keyDelim // - if a path is shadowed by an earlier value in the initial shadow map, // it is skipped. // The resulting set of paths is merged to the given shadow set at the same time. @@ -1728,7 +1897,7 @@ func (v *Viper) flattenAndMergeMap(shadow map[string]bool, m map[string]interfac func (v *Viper) mergeFlatMap(shadow map[string]bool, m map[string]interface{}) map[string]bool { // scan keys outer: - for k, _ := range m { + for k := range m { path := strings.Split(k, v.keyDelim) // scan intermediate paths var parentKey string @@ -1837,6 +2006,12 @@ func (v *Viper) searchInPath(in string) (filename string) { } } + if v.configType != "" { + if b, _ := exists(v.fs, filepath.Join(in, v.configName)); b { + return filepath.Join(in, v.configName) + } + } + return "" } diff --git a/vendor/github.com/stretchr/testify/LICENSE b/vendor/github.com/stretchr/testify/LICENSE index f38ec5956b..4b0421cf9e 100644 --- a/vendor/github.com/stretchr/testify/LICENSE +++ b/vendor/github.com/stretchr/testify/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2018 Mat Ryer and Tyler Bunnell +Copyright (c) 2012-2020 Mat Ryer, Tyler Bunnell and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/stretchr/testify/assert/assertion_order.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go index 15a486ca6e..dc200395ce 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_order.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare.go @@ -5,20 +5,28 @@ import ( "reflect" ) -func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { +type CompareType int + +const ( + compareLess CompareType = iota - 1 + compareEqual + compareGreater +) + +func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { switch kind { case reflect.Int: { intobj1 := obj1.(int) intobj2 := obj2.(int) if intobj1 > intobj2 { - return -1, true + return compareGreater, true } if intobj1 == intobj2 { - return 0, true + return compareEqual, true } if intobj1 < intobj2 { - return 1, true + return compareLess, true } } case reflect.Int8: @@ -26,13 +34,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { int8obj1 := obj1.(int8) int8obj2 := obj2.(int8) if int8obj1 > int8obj2 { - return -1, true + return compareGreater, true } if int8obj1 == int8obj2 { - return 0, true + return compareEqual, true } if int8obj1 < int8obj2 { - return 1, true + return compareLess, true } } case reflect.Int16: @@ -40,13 +48,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { int16obj1 := obj1.(int16) int16obj2 := obj2.(int16) if int16obj1 > int16obj2 { - return -1, true + return compareGreater, true } if int16obj1 == int16obj2 { - return 0, true + return compareEqual, true } if int16obj1 < int16obj2 { - return 1, true + return compareLess, true } } case reflect.Int32: @@ -54,13 +62,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { int32obj1 := obj1.(int32) int32obj2 := obj2.(int32) if int32obj1 > int32obj2 { - return -1, true + return compareGreater, true } if int32obj1 == int32obj2 { - return 0, true + return compareEqual, true } if int32obj1 < int32obj2 { - return 1, true + return compareLess, true } } case reflect.Int64: @@ -68,13 +76,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { int64obj1 := obj1.(int64) int64obj2 := obj2.(int64) if int64obj1 > int64obj2 { - return -1, true + return compareGreater, true } if int64obj1 == int64obj2 { - return 0, true + return compareEqual, true } if int64obj1 < int64obj2 { - return 1, true + return compareLess, true } } case reflect.Uint: @@ -82,13 +90,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uintobj1 := obj1.(uint) uintobj2 := obj2.(uint) if uintobj1 > uintobj2 { - return -1, true + return compareGreater, true } if uintobj1 == uintobj2 { - return 0, true + return compareEqual, true } if uintobj1 < uintobj2 { - return 1, true + return compareLess, true } } case reflect.Uint8: @@ -96,13 +104,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uint8obj1 := obj1.(uint8) uint8obj2 := obj2.(uint8) if uint8obj1 > uint8obj2 { - return -1, true + return compareGreater, true } if uint8obj1 == uint8obj2 { - return 0, true + return compareEqual, true } if uint8obj1 < uint8obj2 { - return 1, true + return compareLess, true } } case reflect.Uint16: @@ -110,13 +118,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uint16obj1 := obj1.(uint16) uint16obj2 := obj2.(uint16) if uint16obj1 > uint16obj2 { - return -1, true + return compareGreater, true } if uint16obj1 == uint16obj2 { - return 0, true + return compareEqual, true } if uint16obj1 < uint16obj2 { - return 1, true + return compareLess, true } } case reflect.Uint32: @@ -124,13 +132,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uint32obj1 := obj1.(uint32) uint32obj2 := obj2.(uint32) if uint32obj1 > uint32obj2 { - return -1, true + return compareGreater, true } if uint32obj1 == uint32obj2 { - return 0, true + return compareEqual, true } if uint32obj1 < uint32obj2 { - return 1, true + return compareLess, true } } case reflect.Uint64: @@ -138,13 +146,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { uint64obj1 := obj1.(uint64) uint64obj2 := obj2.(uint64) if uint64obj1 > uint64obj2 { - return -1, true + return compareGreater, true } if uint64obj1 == uint64obj2 { - return 0, true + return compareEqual, true } if uint64obj1 < uint64obj2 { - return 1, true + return compareLess, true } } case reflect.Float32: @@ -152,13 +160,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { float32obj1 := obj1.(float32) float32obj2 := obj2.(float32) if float32obj1 > float32obj2 { - return -1, true + return compareGreater, true } if float32obj1 == float32obj2 { - return 0, true + return compareEqual, true } if float32obj1 < float32obj2 { - return 1, true + return compareLess, true } } case reflect.Float64: @@ -166,13 +174,13 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { float64obj1 := obj1.(float64) float64obj2 := obj2.(float64) if float64obj1 > float64obj2 { - return -1, true + return compareGreater, true } if float64obj1 == float64obj2 { - return 0, true + return compareEqual, true } if float64obj1 < float64obj2 { - return 1, true + return compareLess, true } } case reflect.String: @@ -180,18 +188,18 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { stringobj1 := obj1.(string) stringobj2 := obj2.(string) if stringobj1 > stringobj2 { - return -1, true + return compareGreater, true } if stringobj1 == stringobj2 { - return 0, true + return compareEqual, true } if stringobj1 < stringobj2 { - return 1, true + return compareLess, true } } } - return 0, false + return compareEqual, false } // Greater asserts that the first element is greater than the second @@ -200,26 +208,7 @@ func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { // assert.Greater(t, float64(2), float64(1)) // assert.Greater(t, "b", "a") func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != -1 { - return Fail(t, fmt.Sprintf("\"%v\" is not greater than \"%v\"", e1, e2), msgAndArgs...) - } - - return true + return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) } // GreaterOrEqual asserts that the first element is greater than or equal to the second @@ -229,26 +218,7 @@ func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface // assert.GreaterOrEqual(t, "b", "a") // assert.GreaterOrEqual(t, "b", "b") func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != -1 && res != 0 { - return Fail(t, fmt.Sprintf("\"%v\" is not greater than or equal to \"%v\"", e1, e2), msgAndArgs...) - } - - return true + return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) } // Less asserts that the first element is less than the second @@ -257,26 +227,7 @@ func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...in // assert.Less(t, float64(1), float64(2)) // assert.Less(t, "a", "b") func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != 1 { - return Fail(t, fmt.Sprintf("\"%v\" is not less than \"%v\"", e1, e2), msgAndArgs...) - } - - return true + return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) } // LessOrEqual asserts that the first element is less than or equal to the second @@ -286,6 +237,10 @@ func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) // assert.LessOrEqual(t, "a", "b") // assert.LessOrEqual(t, "b", "b") func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) +} + +func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() } @@ -296,14 +251,24 @@ func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...inter return Fail(t, "Elements should be the same type", msgAndArgs...) } - res, isComparable := compare(e1, e2, e1Kind) + compareResult, isComparable := compare(e1, e2, e1Kind) if !isComparable { return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) } - if res != 1 && res != 0 { - return Fail(t, fmt.Sprintf("\"%v\" is not less than or equal to \"%v\"", e1, e2), msgAndArgs...) + if !containsValue(allowedComparesResults, compareResult) { + return Fail(t, fmt.Sprintf(failMessage, e1, e2), msgAndArgs...) } return true } + +func containsValue(values []CompareType, value CompareType) bool { + for _, v := range values { + if v == value { + return true + } + } + + return false +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go index bf89ecd21f..49370eb167 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -93,7 +93,7 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -127,7 +127,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick // Exactlyf asserts that two objects are equal in value and type. // -// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -173,7 +173,7 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool // Greaterf asserts that the first element is greater than the second // // assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2, "error message %s", "formatted"), float64(1)) +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") // assert.Greaterf(t, "b", "a", "error message %s", "formatted") func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -225,7 +225,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u // // assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -237,7 +237,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, // // assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -245,6 +245,18 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...) } +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(t, handler, method, url, values, statuscode, append([]interface{}{msg}, args...)...) +} + // HTTPSuccessf asserts that a specified handler returns a success status code. // // assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") @@ -259,7 +271,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin // Implementsf asserts that an object is implemented by the specified interface. // -// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -341,7 +353,7 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf // Lessf asserts that the first element is less than the second // // assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2)) +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") // assert.Lessf(t, "a", "b", "error message %s", "formatted") func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -454,6 +466,16 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) } +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // NotNilf asserts that the specified object is not nil. // // assert.NotNilf(t, err, "error message %s", "formatted") @@ -476,7 +498,7 @@ func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bo // NotRegexpf asserts that a specified regexp does not match a string. // -// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -552,7 +574,7 @@ func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg str // Regexpf asserts that a specified regexp matches a string. // -// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index 75ecdcaa2f..9db889427a 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -169,7 +169,7 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -251,7 +251,7 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg // Exactlyf asserts that two objects are equal in value and type. // -// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -370,7 +370,7 @@ func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, // Greaterf asserts that the first element is greater than the second // // a.Greaterf(2, 1, "error message %s", "formatted") -// a.Greaterf(float64(2, "error message %s", "formatted"), float64(1)) +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") // a.Greaterf("b", "a", "error message %s", "formatted") func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -447,7 +447,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri // // a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -471,7 +471,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s // // a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -479,6 +479,30 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url return HTTPRedirectf(a.t, handler, method, url, values, msg, args...) } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...) +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...) +} + // HTTPSuccess asserts that a specified handler returns a success status code. // // a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) @@ -515,7 +539,7 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, // Implementsf asserts that an object is implemented by the specified interface. // -// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -706,7 +730,7 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar // Lessf asserts that the first element is less than the second // // a.Lessf(1, 2, "error message %s", "formatted") -// a.Lessf(float64(1, "error message %s", "formatted"), float64(2)) +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") // a.Lessf("a", "b", "error message %s", "formatted") func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -884,6 +908,26 @@ func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndAr return NotEqual(a.t, expected, actual, msgAndArgs...) } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValues(obj1, obj2) +func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValuesf(a.t, expected, actual, msg, args...) +} + // NotEqualf asserts that the specified values are NOT equal. // // a.NotEqualf(obj1, obj2, "error message %s", "formatted") @@ -950,7 +994,7 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in // NotRegexpf asserts that a specified regexp does not match a string. // -// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -1102,7 +1146,7 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter // Regexpf asserts that a specified regexp matches a string. // -// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index bdd81389a9..914a10d83a 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -19,7 +19,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/pmezard/go-difflib/difflib" - yaml "gopkg.in/yaml.v2" + yaml "gopkg.in/yaml.v3" ) //go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl" @@ -45,7 +45,7 @@ type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool // for table driven tests. type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool -// Comparison a custom function that returns true on success and false on failure +// Comparison is a custom function that returns true on success and false on failure type Comparison func() (success bool) /* @@ -104,11 +104,11 @@ the problem actually occurred in calling code.*/ // failed. func CallerInfo() []string { - pc := uintptr(0) - file := "" - line := 0 - ok := false - name := "" + var pc uintptr + var ok bool + var file string + var line int + var name string callers := []string{} for i := 0; ; i++ { @@ -429,14 +429,27 @@ func samePointers(first, second interface{}) bool { // to a type conversion in the Go grammar. func formatUnequalValues(expected, actual interface{}) (e string, a string) { if reflect.TypeOf(expected) != reflect.TypeOf(actual) { - return fmt.Sprintf("%T(%#v)", expected, expected), - fmt.Sprintf("%T(%#v)", actual, actual) + return fmt.Sprintf("%T(%s)", expected, truncatingFormat(expected)), + fmt.Sprintf("%T(%s)", actual, truncatingFormat(actual)) } switch expected.(type) { case time.Duration: return fmt.Sprintf("%v", expected), fmt.Sprintf("%v", actual) } - return fmt.Sprintf("%#v", expected), fmt.Sprintf("%#v", actual) + return truncatingFormat(expected), truncatingFormat(actual) +} + +// truncatingFormat formats the data and truncates it if it's too long. +// +// This helps keep formatted error messages lines from exceeding the +// bufio.MaxScanTokenSize max line length that the go testing framework imposes. +func truncatingFormat(data interface{}) string { + value := fmt.Sprintf("%#v", data) + max := bufio.MaxScanTokenSize - 100 // Give us some space the type info too if needed. + if len(value) > max { + value = value[0:max] + "<... truncated>" + } + return value } // EqualValues asserts that two objects are equal or convertable to the same types @@ -483,12 +496,12 @@ func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{} // // assert.NotNil(t, err) func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if !isNil(object) { return true } + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Expected value not to be nil.", msgAndArgs...) } @@ -529,12 +542,12 @@ func isNil(object interface{}) bool { // // assert.Nil(t, err) func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if isNil(object) { return true } + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) } @@ -571,12 +584,11 @@ func isEmpty(object interface{}) bool { // // assert.Empty(t, obj) func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - pass := isEmpty(object) if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) } @@ -591,12 +603,11 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { // assert.Equal(t, "two", obj[1]) // } func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - pass := !isEmpty(object) if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) } @@ -639,16 +650,10 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) // // assert.True(t, myBool) func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if h, ok := t.(interface { - Helper() - }); ok { - h.Helper() - } - - if value != true { + if !value { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Should be true", msgAndArgs...) } @@ -660,11 +665,10 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { // // assert.False(t, myBool) func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - if value != false { + if value { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Should be false", msgAndArgs...) } @@ -695,6 +699,21 @@ func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{ } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValues(t, obj1, obj2) +func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if ObjectsAreEqualValues(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true +} + // containsElement try loop over the list check if the list includes the element. // return (false, false) if impossible. // return (true, false) if element was not found. @@ -747,10 +766,10 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo ok, found := includeElement(s, contains) if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...) } if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v does not contain %#v", s, contains), msgAndArgs...) } return true @@ -881,27 +900,39 @@ func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface return true } - aKind := reflect.TypeOf(listA).Kind() - bKind := reflect.TypeOf(listB).Kind() + if !isList(t, listA, msgAndArgs...) || !isList(t, listB, msgAndArgs...) { + return false + } - if aKind != reflect.Array && aKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listA, aKind), msgAndArgs...) + extraA, extraB := diffLists(listA, listB) + + if len(extraA) == 0 && len(extraB) == 0 { + return true } - if bKind != reflect.Array && bKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listB, bKind), msgAndArgs...) + return Fail(t, formatListDiff(listA, listB, extraA, extraB), msgAndArgs...) +} + +// isList checks that the provided value is array or slice. +func isList(t TestingT, list interface{}, msgAndArgs ...interface{}) (ok bool) { + kind := reflect.TypeOf(list).Kind() + if kind != reflect.Array && kind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s, expecting array or slice", list, kind), + msgAndArgs...) } + return true +} +// diffLists diffs two arrays/slices and returns slices of elements that are only in A and only in B. +// If some element is present multiple times, each instance is counted separately (e.g. if something is 2x in A and +// 5x in B, it will be 0x in extraA and 3x in extraB). The order of items in both lists is ignored. +func diffLists(listA, listB interface{}) (extraA, extraB []interface{}) { aValue := reflect.ValueOf(listA) bValue := reflect.ValueOf(listB) aLen := aValue.Len() bLen := bValue.Len() - if aLen != bLen { - return Fail(t, fmt.Sprintf("lengths don't match: %d != %d", aLen, bLen), msgAndArgs...) - } - // Mark indexes in bValue that we already used visited := make([]bool, bLen) for i := 0; i < aLen; i++ { @@ -918,11 +949,38 @@ func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface } } if !found { - return Fail(t, fmt.Sprintf("element %s appears more times in %s than in %s", element, aValue, bValue), msgAndArgs...) + extraA = append(extraA, element) } } - return true + for j := 0; j < bLen; j++ { + if visited[j] { + continue + } + extraB = append(extraB, bValue.Index(j).Interface()) + } + + return +} + +func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) string { + var msg bytes.Buffer + + msg.WriteString("elements differ") + if len(extraA) > 0 { + msg.WriteString("\n\nextra elements in list A:\n") + msg.WriteString(spewConfig.Sdump(extraA)) + } + if len(extraB) > 0 { + msg.WriteString("\n\nextra elements in list B:\n") + msg.WriteString(spewConfig.Sdump(extraB)) + } + msg.WriteString("\n\nlistA:\n") + msg.WriteString(spewConfig.Sdump(listA)) + msg.WriteString("\n\nlistB:\n") + msg.WriteString(spewConfig.Sdump(listB)) + + return msg.String() } // Condition uses a Comparison to assert a complex condition. @@ -1058,6 +1116,8 @@ func toFloat(x interface{}) (float64, bool) { xok := true switch xn := x.(type) { + case uint: + xf = float64(xn) case uint8: xf = float64(xn) case uint16: @@ -1079,7 +1139,7 @@ func toFloat(x interface{}) (float64, bool) { case float32: xf = float64(xn) case float64: - xf = float64(xn) + xf = xn case time.Duration: xf = float64(xn) default: @@ -1193,6 +1253,9 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { if !aok { return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) } + if math.IsNaN(af) { + return 0, errors.New("expected value must not be NaN") + } if af == 0 { return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") } @@ -1200,6 +1263,9 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { if !bok { return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) } + if math.IsNaN(bf) { + return 0, errors.New("actual value must not be NaN") + } return math.Abs(af-bf) / math.Abs(af), nil } @@ -1209,6 +1275,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd if h, ok := t.(tHelper); ok { h.Helper() } + if math.IsNaN(epsilon) { + return Fail(t, "epsilon must not be NaN") + } actualEpsilon, err := calcRelativeError(expected, actual) if err != nil { return Fail(t, err.Error(), msgAndArgs...) @@ -1256,10 +1325,10 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m // assert.Equal(t, expectedObj, actualObj) // } func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if err != nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) } @@ -1273,11 +1342,10 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { // assert.Equal(t, expectedError, err) // } func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if err == nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "An error is expected but got nil.", msgAndArgs...) } @@ -1553,6 +1621,7 @@ var spewConfig = spew.ConfigState{ DisablePointerAddresses: true, DisableCapacities: true, SortKeys: true, + DisableMethods: true, } type tHelper interface { diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go index df46fa777a..4ed341dd28 100644 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -33,7 +33,6 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent @@ -56,7 +55,6 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect @@ -79,7 +77,6 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isErrorCode := code >= http.StatusBadRequest @@ -90,6 +87,28 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values return isErrorCode } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + } + + successful := code == statuscode + if !successful { + Fail(t, fmt.Sprintf("Expected HTTP status code %d for %q but received %d", statuscode, url+"?"+values.Encode(), code)) + } + + return successful +} + // HTTPBody is a helper that returns HTTP body of the response. It returns // empty string if building a new request fails. func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { diff --git a/vendor/github.com/stretchr/testify/require/require.go b/vendor/github.com/stretchr/testify/require/require.go index cf6c7b5664..ec4624b282 100644 --- a/vendor/github.com/stretchr/testify/require/require.go +++ b/vendor/github.com/stretchr/testify/require/require.go @@ -212,7 +212,7 @@ func EqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArg // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -315,7 +315,7 @@ func Exactly(t TestingT, expected interface{}, actual interface{}, msgAndArgs .. // Exactlyf asserts that two objects are equal in value and type. // -// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -470,7 +470,7 @@ func GreaterOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, arg // Greaterf asserts that the first element is greater than the second // // assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2, "error message %s", "formatted"), float64(1)) +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") // assert.Greaterf(t, "b", "a", "error message %s", "formatted") func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -565,7 +565,7 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method string, url string, // // assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -595,7 +595,7 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method string, url strin // // assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -606,6 +606,36 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri t.FailNow() } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPStatusCode(t, handler, method, url, values, statuscode, msgAndArgs...) { + return + } + t.FailNow() +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.HTTPStatusCodef(t, handler, method, url, values, statuscode, msg, args...) { + return + } + t.FailNow() +} + // HTTPSuccess asserts that a specified handler returns a success status code. // // assert.HTTPSuccess(t, myHandler, "POST", "http://www.google.com", nil) @@ -651,7 +681,7 @@ func Implements(t TestingT, interfaceObject interface{}, object interface{}, msg // Implementsf asserts that an object is implemented by the specified interface. // -// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { h.Helper() @@ -902,7 +932,7 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args . // Lessf asserts that the first element is less than the second // // assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2)) +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") // assert.Lessf(t, "a", "b", "error message %s", "formatted") func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1128,6 +1158,32 @@ func NotEqual(t TestingT, expected interface{}, actual interface{}, msgAndArgs . t.FailNow() } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValues(t, obj1, obj2) +func NotEqualValues(t TestingT, expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEqualValues(t, expected, actual, msgAndArgs...) { + return + } + t.FailNow() +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if assert.NotEqualValuesf(t, expected, actual, msg, args...) { + return + } + t.FailNow() +} + // NotEqualf asserts that the specified values are NOT equal. // // assert.NotEqualf(t, obj1, obj2, "error message %s", "formatted") @@ -1212,7 +1268,7 @@ func NotRegexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interf // NotRegexpf asserts that a specified regexp does not match a string. // -// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { @@ -1406,7 +1462,7 @@ func Regexp(t TestingT, rx interface{}, str interface{}, msgAndArgs ...interface // Regexpf asserts that a specified regexp matches a string. // -// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/require/require_forward.go b/vendor/github.com/stretchr/testify/require/require_forward.go index 5aac226df8..103d7dcb6a 100644 --- a/vendor/github.com/stretchr/testify/require/require_forward.go +++ b/vendor/github.com/stretchr/testify/require/require_forward.go @@ -170,7 +170,7 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -252,7 +252,7 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg // Exactlyf asserts that two objects are equal in value and type. // -// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -371,7 +371,7 @@ func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, // Greaterf asserts that the first element is greater than the second // // a.Greaterf(2, 1, "error message %s", "formatted") -// a.Greaterf(float64(2, "error message %s", "formatted"), float64(1)) +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") // a.Greaterf("b", "a", "error message %s", "formatted") func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { @@ -448,7 +448,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri // // a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -472,7 +472,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s // // a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -480,6 +480,30 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url HTTPRedirectf(a.t, handler, method, url, values, msg, args...) } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...) +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...) +} + // HTTPSuccess asserts that a specified handler returns a success status code. // // a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) @@ -516,7 +540,7 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, // Implementsf asserts that an object is implemented by the specified interface. // -// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -707,7 +731,7 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar // Lessf asserts that the first element is less than the second // // a.Lessf(1, 2, "error message %s", "formatted") -// a.Lessf(float64(1, "error message %s", "formatted"), float64(2)) +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") // a.Lessf("a", "b", "error message %s", "formatted") func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { @@ -885,6 +909,26 @@ func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndAr NotEqual(a.t, expected, actual, msgAndArgs...) } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValues(obj1, obj2) +func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEqualValues(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + NotEqualValuesf(a.t, expected, actual, msg, args...) +} + // NotEqualf asserts that the specified values are NOT equal. // // a.NotEqualf(obj1, obj2, "error message %s", "formatted") @@ -951,7 +995,7 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in // NotRegexpf asserts that a specified regexp does not match a string. // -// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { @@ -1103,7 +1147,7 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter // Regexpf asserts that a specified regexp matches a string. // -// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/github.com/subosito/gotenv/.env b/vendor/github.com/subosito/gotenv/.env new file mode 100644 index 0000000000..6405eca71f --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.env @@ -0,0 +1 @@ +HELLO=world diff --git a/vendor/github.com/subosito/gotenv/.env.invalid b/vendor/github.com/subosito/gotenv/.env.invalid new file mode 100644 index 0000000000..016d5e0cea --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.env.invalid @@ -0,0 +1 @@ +lol$wut diff --git a/vendor/github.com/subosito/gotenv/.gitignore b/vendor/github.com/subosito/gotenv/.gitignore new file mode 100644 index 0000000000..2b8d456103 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.gitignore @@ -0,0 +1,3 @@ +*.test +*.out +annotate.json diff --git a/vendor/github.com/subosito/gotenv/.travis.yml b/vendor/github.com/subosito/gotenv/.travis.yml new file mode 100644 index 0000000000..3370d5f408 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/.travis.yml @@ -0,0 +1,10 @@ +language: go +go: + - 1.x +os: + - linux + - osx +script: + - go test -test.v -coverprofile=coverage.out -covermode=count +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/subosito/gotenv/CHANGELOG.md b/vendor/github.com/subosito/gotenv/CHANGELOG.md new file mode 100644 index 0000000000..67f687382b --- /dev/null +++ b/vendor/github.com/subosito/gotenv/CHANGELOG.md @@ -0,0 +1,47 @@ +# Changelog + +## [1.2.0] - 2019-08-03 + +### Added + +- Add `Must` helper to raise an error as panic. It can be used with `Load` and `OverLoad`. +- Add more tests to be 100% coverage. +- Add CHANGELOG +- Add more OS for the test: OSX and Windows + +### Changed + +- Reduce complexity and improve source code for having `A+` score in [goreportcard](https://goreportcard.com/report/github.com/subosito/gotenv). +- Updated README with mentions to all available functions + +### Removed + +- Remove `ErrFormat` +- Remove `MustLoad` and `MustOverload`, replaced with `Must` helper. + +## [1.1.1] - 2018-06-05 + +### Changed + +- Replace `os.Getenv` with `os.LookupEnv` to ensure that the environment variable is not set, by [radding](https://github.com/radding) + +## [1.1.0] - 2017-03-20 + +### Added + +- Supports carriage return in env +- Handle files with UTF-8 BOM + +### Changed + +- Whitespace handling + +### Fixed + +- Incorrect variable expansion +- Handling escaped '$' characters + +## [1.0.0] - 2014-10-05 + +First stable release. + diff --git a/vendor/github.com/subosito/gotenv/LICENSE b/vendor/github.com/subosito/gotenv/LICENSE new file mode 100644 index 0000000000..f64ccaedc3 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Alif Rachmawadi + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/subosito/gotenv/README.md b/vendor/github.com/subosito/gotenv/README.md new file mode 100644 index 0000000000..d610cdf0b8 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/README.md @@ -0,0 +1,131 @@ +# gotenv + +[![Build Status](https://travis-ci.org/subosito/gotenv.svg?branch=master)](https://travis-ci.org/subosito/gotenv) +[![Build status](https://ci.appveyor.com/api/projects/status/wb2e075xkfl0m0v2/branch/master?svg=true)](https://ci.appveyor.com/project/subosito/gotenv/branch/master) +[![Coverage Status](https://badgen.net/codecov/c/github/subosito/gotenv)](https://codecov.io/gh/subosito/gotenv) +[![Go Report Card](https://goreportcard.com/badge/github.com/subosito/gotenv)](https://goreportcard.com/report/github.com/subosito/gotenv) +[![GoDoc](https://godoc.org/github.com/subosito/gotenv?status.svg)](https://godoc.org/github.com/subosito/gotenv) + +Load environment variables dynamically in Go. + +## Usage + +Put the gotenv package on your `import` statement: + +```go +import "github.com/subosito/gotenv" +``` + +To modify your app environment variables, `gotenv` expose 2 main functions: + +- `gotenv.Load` +- `gotenv.Apply` + +By default, `gotenv.Load` will look for a file called `.env` in the current working directory. + +Behind the scene, it will then load `.env` file and export the valid variables to the environment variables. Make sure you call the method as soon as possible to ensure it loads all variables, say, put it on `init()` function. + +Once loaded you can use `os.Getenv()` to get the value of the variable. + +Let's say you have `.env` file: + +``` +APP_ID=1234567 +APP_SECRET=abcdef +``` + +Here's the example of your app: + +```go +package main + +import ( + "github.com/subosito/gotenv" + "log" + "os" +) + +func init() { + gotenv.Load() +} + +func main() { + log.Println(os.Getenv("APP_ID")) // "1234567" + log.Println(os.Getenv("APP_SECRET")) // "abcdef" +} +``` + +You can also load other than `.env` file if you wish. Just supply filenames when calling `Load()`. It will load them in order and the first value set for a variable will win.: + +```go +gotenv.Load(".env.production", "credentials") +``` + +While `gotenv.Load` loads entries from `.env` file, `gotenv.Apply` allows you to use any `io.Reader`: + +```go +gotenv.Apply(strings.NewReader("APP_ID=1234567")) + +log.Println(os.Getenv("APP_ID")) +// Output: "1234567" +``` + +Both `gotenv.Load` and `gotenv.Apply` **DO NOT** overrides existing environment variables. If you want to override existing ones, you can see section below. + +### Environment Overrides + +Besides above functions, `gotenv` also provides another functions that overrides existing: + +- `gotenv.OverLoad` +- `gotenv.OverApply` + + +Here's the example of this overrides behavior: + +```go +os.Setenv("HELLO", "world") + +// NOTE: using Apply existing value will be reserved +gotenv.Apply(strings.NewReader("HELLO=universe")) +fmt.Println(os.Getenv("HELLO")) +// Output: "world" + +// NOTE: using OverApply existing value will be overridden +gotenv.OverApply(strings.NewReader("HELLO=universe")) +fmt.Println(os.Getenv("HELLO")) +// Output: "universe" +``` + +### Throw a Panic + +Both `gotenv.Load` and `gotenv.OverLoad` returns an error on something wrong occurred, like your env file is not exist, and so on. To make it easier to use, `gotenv` also provides `gotenv.Must` helper, to let it panic when an error returned. + +```go +err := gotenv.Load(".env-is-not-exist") +fmt.Println("error", err) +// error: open .env-is-not-exist: no such file or directory + +gotenv.Must(gotenv.Load, ".env-is-not-exist") +// it will throw a panic +// panic: open .env-is-not-exist: no such file or directory +``` + +### Another Scenario + +Just in case you want to parse environment variables from any `io.Reader`, gotenv keeps its `Parse` and `StrictParse` function as public API so you can use that. + +```go +// import "strings" + +pairs := gotenv.Parse(strings.NewReader("FOO=test\nBAR=$FOO")) +// gotenv.Env{"FOO": "test", "BAR": "test"} + +err, pairs = gotenv.StrictParse(strings.NewReader(`FOO="bar"`)) +// gotenv.Env{"FOO": "bar"} +``` + +`Parse` ignores invalid lines and returns `Env` of valid environment variables, while `StrictParse` returns an error for invalid lines. + +## Notes + +The gotenv package is a Go port of [`dotenv`](https://github.com/bkeepers/dotenv) project with some additions made for Go. For general features, it aims to be compatible as close as possible. diff --git a/vendor/github.com/subosito/gotenv/appveyor.yml b/vendor/github.com/subosito/gotenv/appveyor.yml new file mode 100644 index 0000000000..33b4c40465 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/appveyor.yml @@ -0,0 +1,9 @@ +build: off +clone_folder: c:\gopath\src\github.com\subosito\gotenv +environment: + GOPATH: c:\gopath +stack: go 1.10 +before_test: + - go get -t +test_script: + - go test -v -cover -race diff --git a/vendor/github.com/subosito/gotenv/gotenv.go b/vendor/github.com/subosito/gotenv/gotenv.go new file mode 100644 index 0000000000..745a344899 --- /dev/null +++ b/vendor/github.com/subosito/gotenv/gotenv.go @@ -0,0 +1,265 @@ +// Package gotenv provides functionality to dynamically load the environment variables +package gotenv + +import ( + "bufio" + "fmt" + "io" + "os" + "regexp" + "strings" +) + +const ( + // Pattern for detecting valid line format + linePattern = `\A\s*(?:export\s+)?([\w\.]+)(?:\s*=\s*|:\s+?)('(?:\'|[^'])*'|"(?:\"|[^"])*"|[^#\n]+)?\s*(?:\s*\#.*)?\z` + + // Pattern for detecting valid variable within a value + variablePattern = `(\\)?(\$)(\{?([A-Z0-9_]+)?\}?)` +) + +// Env holds key/value pair of valid environment variable +type Env map[string]string + +/* +Load is a function to load a file or multiple files and then export the valid variables into environment variables if they do not exist. +When it's called with no argument, it will load `.env` file on the current path and set the environment variables. +Otherwise, it will loop over the filenames parameter and set the proper environment variables. +*/ +func Load(filenames ...string) error { + return loadenv(false, filenames...) +} + +/* +OverLoad is a function to load a file or multiple files and then export and override the valid variables into environment variables. +*/ +func OverLoad(filenames ...string) error { + return loadenv(true, filenames...) +} + +/* +Must is wrapper function that will panic when supplied function returns an error. +*/ +func Must(fn func(filenames ...string) error, filenames ...string) { + if err := fn(filenames...); err != nil { + panic(err.Error()) + } +} + +/* +Apply is a function to load an io Reader then export the valid variables into environment variables if they do not exist. +*/ +func Apply(r io.Reader) error { + return parset(r, false) +} + +/* +OverApply is a function to load an io Reader then export and override the valid variables into environment variables. +*/ +func OverApply(r io.Reader) error { + return parset(r, true) +} + +func loadenv(override bool, filenames ...string) error { + if len(filenames) == 0 { + filenames = []string{".env"} + } + + for _, filename := range filenames { + f, err := os.Open(filename) + if err != nil { + return err + } + + err = parset(f, override) + if err != nil { + return err + } + + f.Close() + } + + return nil +} + +// parse and set :) +func parset(r io.Reader, override bool) error { + env, err := StrictParse(r) + if err != nil { + return err + } + + for key, val := range env { + setenv(key, val, override) + } + + return nil +} + +func setenv(key, val string, override bool) { + if override { + os.Setenv(key, val) + } else { + if _, present := os.LookupEnv(key); !present { + os.Setenv(key, val) + } + } +} + +// Parse is a function to parse line by line any io.Reader supplied and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is skipping any invalid lines and only processing the valid one. +func Parse(r io.Reader) Env { + env, _ := StrictParse(r) + return env +} + +// StrictParse is a function to parse line by line any io.Reader supplied and returns the valid Env key/value pair of valid variables. +// It expands the value of a variable from the environment variable but does not set the value to the environment itself. +// This function is returning an error if there are any invalid lines. +func StrictParse(r io.Reader) (Env, error) { + env := make(Env) + scanner := bufio.NewScanner(r) + + i := 1 + bom := string([]byte{239, 187, 191}) + + for scanner.Scan() { + line := scanner.Text() + + if i == 1 { + line = strings.TrimPrefix(line, bom) + } + + i++ + + err := parseLine(line, env) + if err != nil { + return env, err + } + } + + return env, nil +} + +func parseLine(s string, env Env) error { + rl := regexp.MustCompile(linePattern) + rm := rl.FindStringSubmatch(s) + + if len(rm) == 0 { + return checkFormat(s, env) + } + + key := rm[1] + val := rm[2] + + // determine if string has quote prefix + hdq := strings.HasPrefix(val, `"`) + + // determine if string has single quote prefix + hsq := strings.HasPrefix(val, `'`) + + // trim whitespace + val = strings.Trim(val, " ") + + // remove quotes '' or "" + rq := regexp.MustCompile(`\A(['"])(.*)(['"])\z`) + val = rq.ReplaceAllString(val, "$2") + + if hdq { + val = strings.Replace(val, `\n`, "\n", -1) + val = strings.Replace(val, `\r`, "\r", -1) + + // Unescape all characters except $ so variables can be escaped properly + re := regexp.MustCompile(`\\([^$])`) + val = re.ReplaceAllString(val, "$1") + } + + rv := regexp.MustCompile(variablePattern) + fv := func(s string) string { + return varReplacement(s, hsq, env) + } + + val = rv.ReplaceAllStringFunc(val, fv) + val = parseVal(val, env) + + env[key] = val + return nil +} + +func parseExport(st string, env Env) error { + if strings.HasPrefix(st, "export") { + vs := strings.SplitN(st, " ", 2) + + if len(vs) > 1 { + if _, ok := env[vs[1]]; !ok { + return fmt.Errorf("line `%s` has an unset variable", st) + } + } + } + + return nil +} + +func varReplacement(s string, hsq bool, env Env) string { + if strings.HasPrefix(s, "\\") { + return strings.TrimPrefix(s, "\\") + } + + if hsq { + return s + } + + sn := `(\$)(\{?([A-Z0-9_]+)\}?)` + rn := regexp.MustCompile(sn) + mn := rn.FindStringSubmatch(s) + + if len(mn) == 0 { + return s + } + + v := mn[3] + + replace, ok := env[v] + if !ok { + replace = os.Getenv(v) + } + + return replace +} + +func checkFormat(s string, env Env) error { + st := strings.TrimSpace(s) + + if (st == "") || strings.HasPrefix(st, "#") { + return nil + } + + if err := parseExport(st, env); err != nil { + return err + } + + return fmt.Errorf("line `%s` doesn't match format", s) +} + +func parseVal(val string, env Env) string { + if strings.Contains(val, "=") { + if !(val == "\n" || val == "\r") { + kv := strings.Split(val, "\n") + + if len(kv) == 1 { + kv = strings.Split(val, "\r") + } + + if len(kv) > 1 { + val = kv[0] + + for i := 1; i < len(kv); i++ { + parseLine(kv[i], env) + } + } + } + } + + return val +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bson.go b/vendor/go.mongodb.org/mongo-driver/bson/bson.go index 37bf9811f3..ae1a87faa7 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bson.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bson.go @@ -22,39 +22,29 @@ type Zeroer interface { IsZero() bool } -// D represents a BSON Document. This type can be used to represent BSON in a concise and readable -// manner. It should generally be used when serializing to BSON. For deserializing, the Raw or -// Document types should be used. +// D is an ordered representation of a BSON document. This type should be used when the order of the elements matters, +// such as MongoDB command documents. If the order of the elements does not matter, an M should be used instead. // // Example usage: // // bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}} -// -// This type should be used in situations where order matters, such as MongoDB commands. If the -// order is not important, a map is more comfortable and concise. type D = primitive.D // E represents a BSON element for a D. It is usually used inside a D. type E = primitive.E -// M is an unordered, concise representation of a BSON Document. It should generally be used to -// serialize BSON when the order of the elements of a BSON document do not matter. If the element -// order matters, use a D instead. +// M is an unordered representation of a BSON document. This type should be used when the order of the elements does not +// matter. This type is handled as a regular map[string]interface{} when encoding and decoding. Elements will be +// serialized in an undefined, random order. If the order of the elements matters, a D should be used instead. // // Example usage: // // bson.M{"foo": "bar", "hello": "world", "pi": 3.14159} -// -// This type is handled in the encoders as a regular map[string]interface{}. The elements will be -// serialized in an undefined, random order, and the order will be different each time. type M = primitive.M -// An A represents a BSON array. This type can be used to represent a BSON array in a concise and -// readable manner. It should generally be used when serializing to BSON. For deserializing, the -// RawArray or Array types should be used. +// An A is an ordered representation of a BSON array. // // Example usage: // // bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}} -// type A = primitive.A diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bson_1_8.go b/vendor/go.mongodb.org/mongo-driver/bson/bson_1_8.go index caf5f50a71..bbe7792848 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bson_1_8.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bson_1_8.go @@ -21,16 +21,12 @@ type Zeroer interface { IsZero() bool } -// D represents a BSON Document. This type can be used to represent BSON in a concise and readable -// manner. It should generally be used when serializing to BSON. For deserializing, the Raw or -// Document types should be used. +// D is an ordered representation of a BSON document. This type should be used when the order of the elements matters, +// such as MongoDB command documents. If the order of the elements does not matter, an M should be used instead. // // Example usage: // -// primitive.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}} -// -// This type should be used in situations where order matters, such as MongoDB commands. If the -// order is not important, a map is more comfortable and concise. +// bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}} type D []E // Map creates a map from the elements of the D. @@ -48,26 +44,20 @@ type E struct { Value interface{} } -// M is an unordered, concise representation of a BSON Document. It should generally be used to -// serialize BSON when the order of the elements of a BSON document do not matter. If the element -// order matters, use a D instead. +// M is an unordered representation of a BSON document. This type should be used when the order of the elements does not +// matter. This type is handled as a regular map[string]interface{} when encoding and decoding. Elements will be +// serialized in an undefined, random order. If the order of the elements matters, a D should be used instead. // // Example usage: // -// primitive.M{"foo": "bar", "hello": "world", "pi": 3.14159} -// -// This type is handled in the encoders as a regular map[string]interface{}. The elements will be -// serialized in an undefined, random order, and the order will be different each time. +// bson.M{"foo": "bar", "hello": "world", "pi": 3.14159} type M map[string]interface{} -// An A represents a BSON array. This type can be used to represent a BSON array in a concise and -// readable manner. It should generally be used when serializing to BSON. For deserializing, the -// RawArray or Array types should be used. +// An A is an ordered representation of a BSON array. // // Example usage: // -// primitive.A{"bar", "world", 3.14159, primitive.D{{"qux", 12345}}} -// +// bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}} type A []interface{} func formatDouble(f float64) string { diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/byte_slice_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/byte_slice_codec.go new file mode 100644 index 0000000000..9eed911ac7 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/byte_slice_codec.go @@ -0,0 +1,87 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsoncodec + +import ( + "fmt" + "reflect" + + "go.mongodb.org/mongo-driver/bson/bsonoptions" + "go.mongodb.org/mongo-driver/bson/bsonrw" + "go.mongodb.org/mongo-driver/bson/bsontype" +) + +var defaultByteSliceCodec = NewByteSliceCodec() + +// ByteSliceCodec is the Codec used for []byte values. +type ByteSliceCodec struct { + EncodeNilAsEmpty bool +} + +var _ ValueCodec = &ByteSliceCodec{} + +// NewByteSliceCodec returns a StringCodec with options opts. +func NewByteSliceCodec(opts ...*bsonoptions.ByteSliceCodecOptions) *ByteSliceCodec { + byteSliceOpt := bsonoptions.MergeByteSliceCodecOptions(opts...) + codec := ByteSliceCodec{} + if byteSliceOpt.EncodeNilAsEmpty != nil { + codec.EncodeNilAsEmpty = *byteSliceOpt.EncodeNilAsEmpty + } + return &codec +} + +// EncodeValue is the ValueEncoder for []byte. +func (bsc *ByteSliceCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { + if !val.IsValid() || val.Type() != tByteSlice { + return ValueEncoderError{Name: "ByteSliceEncodeValue", Types: []reflect.Type{tByteSlice}, Received: val} + } + if val.IsNil() && !bsc.EncodeNilAsEmpty { + return vw.WriteNull() + } + return vw.WriteBinary(val.Interface().([]byte)) +} + +// DecodeValue is the ValueDecoder for []byte. +func (bsc *ByteSliceCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if !val.CanSet() || val.Type() != tByteSlice { + return ValueDecoderError{Name: "ByteSliceDecodeValue", Types: []reflect.Type{tByteSlice}, Received: val} + } + + var data []byte + var err error + switch vrType := vr.Type(); vrType { + case bsontype.String: + str, err := vr.ReadString() + if err != nil { + return err + } + data = []byte(str) + case bsontype.Symbol: + sym, err := vr.ReadSymbol() + if err != nil { + return err + } + data = []byte(sym) + case bsontype.Binary: + var subtype byte + data, subtype, err = vr.ReadBinary() + if err != nil { + return err + } + if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld { + return fmt.Errorf("ByteSliceDecodeValue can only be used to decode subtype 0x00 or 0x02 for %s, got %v", bsontype.Binary, subtype) + } + case bsontype.Null: + val.Set(reflect.Zero(val.Type())) + return vr.ReadNull() + default: + return fmt.Errorf("cannot decode %v into a []byte", vrType) + } + + val.Set(reflect.ValueOf(data)) + return nil +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/cond_addr_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/cond_addr_codec.go new file mode 100644 index 0000000000..cb8180f25c --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/cond_addr_codec.go @@ -0,0 +1,63 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsoncodec + +import ( + "reflect" + + "go.mongodb.org/mongo-driver/bson/bsonrw" +) + +// condAddrEncoder is the encoder used when a pointer to the encoding value has an encoder. +type condAddrEncoder struct { + canAddrEnc ValueEncoder + elseEnc ValueEncoder +} + +var _ ValueEncoder = (*condAddrEncoder)(nil) + +// newCondAddrEncoder returns an condAddrEncoder. +func newCondAddrEncoder(canAddrEnc, elseEnc ValueEncoder) *condAddrEncoder { + encoder := condAddrEncoder{canAddrEnc: canAddrEnc, elseEnc: elseEnc} + return &encoder +} + +// EncodeValue is the ValueEncoderFunc for a value that may be addressable. +func (cae *condAddrEncoder) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { + if val.CanAddr() { + return cae.canAddrEnc.EncodeValue(ec, vw, val) + } + if cae.elseEnc != nil { + return cae.elseEnc.EncodeValue(ec, vw, val) + } + return ErrNoEncoder{Type: val.Type()} +} + +// condAddrDecoder is the decoder used when a pointer to the value has a decoder. +type condAddrDecoder struct { + canAddrDec ValueDecoder + elseDec ValueDecoder +} + +var _ ValueDecoder = (*condAddrDecoder)(nil) + +// newCondAddrDecoder returns an CondAddrDecoder. +func newCondAddrDecoder(canAddrDec, elseDec ValueDecoder) *condAddrDecoder { + decoder := condAddrDecoder{canAddrDec: canAddrDec, elseDec: elseDec} + return &decoder +} + +// DecodeValue is the ValueDecoderFunc for a value that may be addressable. +func (cad *condAddrDecoder) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if val.CanAddr() { + return cad.canAddrDec.DecodeValue(dc, vr, val) + } + if cad.elseDec != nil { + return cad.elseDec.DecodeValue(dc, vr, val) + } + return ErrNoDecoder{Type: val.Type()} +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go index 65cd1c0a55..52d2365a34 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go @@ -40,46 +40,44 @@ func (dvd DefaultValueDecoders) RegisterDefaultDecoders(rb *RegistryBuilder) { } rb. - RegisterDecoder(tBinary, ValueDecoderFunc(dvd.BinaryDecodeValue)). - RegisterDecoder(tUndefined, ValueDecoderFunc(dvd.UndefinedDecodeValue)). - RegisterDecoder(tDateTime, ValueDecoderFunc(dvd.DateTimeDecodeValue)). - RegisterDecoder(tNull, ValueDecoderFunc(dvd.NullDecodeValue)). - RegisterDecoder(tRegex, ValueDecoderFunc(dvd.RegexDecodeValue)). - RegisterDecoder(tDBPointer, ValueDecoderFunc(dvd.DBPointerDecodeValue)). - RegisterDecoder(tTimestamp, ValueDecoderFunc(dvd.TimestampDecodeValue)). - RegisterDecoder(tMinKey, ValueDecoderFunc(dvd.MinKeyDecodeValue)). - RegisterDecoder(tMaxKey, ValueDecoderFunc(dvd.MaxKeyDecodeValue)). - RegisterDecoder(tJavaScript, ValueDecoderFunc(dvd.JavaScriptDecodeValue)). - RegisterDecoder(tSymbol, ValueDecoderFunc(dvd.SymbolDecodeValue)). - RegisterDecoder(tByteSlice, ValueDecoderFunc(dvd.ByteSliceDecodeValue)). - RegisterDecoder(tTime, ValueDecoderFunc(dvd.TimeDecodeValue)). - RegisterDecoder(tEmpty, ValueDecoderFunc(dvd.EmptyInterfaceDecodeValue)). - RegisterDecoder(tOID, ValueDecoderFunc(dvd.ObjectIDDecodeValue)). - RegisterDecoder(tDecimal, ValueDecoderFunc(dvd.Decimal128DecodeValue)). - RegisterDecoder(tJSONNumber, ValueDecoderFunc(dvd.JSONNumberDecodeValue)). - RegisterDecoder(tURL, ValueDecoderFunc(dvd.URLDecodeValue)). - RegisterDecoder(tValueUnmarshaler, ValueDecoderFunc(dvd.ValueUnmarshalerDecodeValue)). - RegisterDecoder(tUnmarshaler, ValueDecoderFunc(dvd.UnmarshalerDecodeValue)). - RegisterDecoder(tCoreDocument, ValueDecoderFunc(dvd.CoreDocumentDecodeValue)). - RegisterDecoder(tCodeWithScope, ValueDecoderFunc(dvd.CodeWithScopeDecodeValue)). + RegisterTypeDecoder(tBinary, ValueDecoderFunc(dvd.BinaryDecodeValue)). + RegisterTypeDecoder(tUndefined, ValueDecoderFunc(dvd.UndefinedDecodeValue)). + RegisterTypeDecoder(tDateTime, ValueDecoderFunc(dvd.DateTimeDecodeValue)). + RegisterTypeDecoder(tNull, ValueDecoderFunc(dvd.NullDecodeValue)). + RegisterTypeDecoder(tRegex, ValueDecoderFunc(dvd.RegexDecodeValue)). + RegisterTypeDecoder(tDBPointer, ValueDecoderFunc(dvd.DBPointerDecodeValue)). + RegisterTypeDecoder(tTimestamp, ValueDecoderFunc(dvd.TimestampDecodeValue)). + RegisterTypeDecoder(tMinKey, ValueDecoderFunc(dvd.MinKeyDecodeValue)). + RegisterTypeDecoder(tMaxKey, ValueDecoderFunc(dvd.MaxKeyDecodeValue)). + RegisterTypeDecoder(tJavaScript, ValueDecoderFunc(dvd.JavaScriptDecodeValue)). + RegisterTypeDecoder(tSymbol, ValueDecoderFunc(dvd.SymbolDecodeValue)). + RegisterTypeDecoder(tByteSlice, defaultByteSliceCodec). + RegisterTypeDecoder(tTime, defaultTimeCodec). + RegisterTypeDecoder(tEmpty, defaultEmptyInterfaceCodec). + RegisterTypeDecoder(tOID, ValueDecoderFunc(dvd.ObjectIDDecodeValue)). + RegisterTypeDecoder(tDecimal, ValueDecoderFunc(dvd.Decimal128DecodeValue)). + RegisterTypeDecoder(tJSONNumber, ValueDecoderFunc(dvd.JSONNumberDecodeValue)). + RegisterTypeDecoder(tURL, ValueDecoderFunc(dvd.URLDecodeValue)). + RegisterTypeDecoder(tCoreDocument, ValueDecoderFunc(dvd.CoreDocumentDecodeValue)). + RegisterTypeDecoder(tCodeWithScope, ValueDecoderFunc(dvd.CodeWithScopeDecodeValue)). RegisterDefaultDecoder(reflect.Bool, ValueDecoderFunc(dvd.BooleanDecodeValue)). RegisterDefaultDecoder(reflect.Int, ValueDecoderFunc(dvd.IntDecodeValue)). RegisterDefaultDecoder(reflect.Int8, ValueDecoderFunc(dvd.IntDecodeValue)). RegisterDefaultDecoder(reflect.Int16, ValueDecoderFunc(dvd.IntDecodeValue)). RegisterDefaultDecoder(reflect.Int32, ValueDecoderFunc(dvd.IntDecodeValue)). RegisterDefaultDecoder(reflect.Int64, ValueDecoderFunc(dvd.IntDecodeValue)). - RegisterDefaultDecoder(reflect.Uint, ValueDecoderFunc(dvd.UintDecodeValue)). - RegisterDefaultDecoder(reflect.Uint8, ValueDecoderFunc(dvd.UintDecodeValue)). - RegisterDefaultDecoder(reflect.Uint16, ValueDecoderFunc(dvd.UintDecodeValue)). - RegisterDefaultDecoder(reflect.Uint32, ValueDecoderFunc(dvd.UintDecodeValue)). - RegisterDefaultDecoder(reflect.Uint64, ValueDecoderFunc(dvd.UintDecodeValue)). + RegisterDefaultDecoder(reflect.Uint, defaultUIntCodec). + RegisterDefaultDecoder(reflect.Uint8, defaultUIntCodec). + RegisterDefaultDecoder(reflect.Uint16, defaultUIntCodec). + RegisterDefaultDecoder(reflect.Uint32, defaultUIntCodec). + RegisterDefaultDecoder(reflect.Uint64, defaultUIntCodec). RegisterDefaultDecoder(reflect.Float32, ValueDecoderFunc(dvd.FloatDecodeValue)). RegisterDefaultDecoder(reflect.Float64, ValueDecoderFunc(dvd.FloatDecodeValue)). RegisterDefaultDecoder(reflect.Array, ValueDecoderFunc(dvd.ArrayDecodeValue)). - RegisterDefaultDecoder(reflect.Map, ValueDecoderFunc(dvd.MapDecodeValue)). - RegisterDefaultDecoder(reflect.Slice, ValueDecoderFunc(dvd.SliceDecodeValue)). - RegisterDefaultDecoder(reflect.String, ValueDecoderFunc(dvd.StringDecodeValue)). - RegisterDefaultDecoder(reflect.Struct, &StructCodec{cache: make(map[reflect.Type]*structDescription), parser: DefaultStructTagParser}). + RegisterDefaultDecoder(reflect.Map, defaultMapCodec). + RegisterDefaultDecoder(reflect.Slice, defaultSliceCodec). + RegisterDefaultDecoder(reflect.String, defaultStringCodec). + RegisterDefaultDecoder(reflect.Struct, defaultStructCodec). RegisterDefaultDecoder(reflect.Ptr, NewPointerCodec()). RegisterTypeMapEntry(bsontype.Double, tFloat64). RegisterTypeMapEntry(bsontype.String, tString). @@ -100,28 +98,68 @@ func (dvd DefaultValueDecoders) RegisterDefaultDecoders(rb *RegistryBuilder) { RegisterTypeMapEntry(bsontype.Decimal128, tDecimal). RegisterTypeMapEntry(bsontype.MinKey, tMinKey). RegisterTypeMapEntry(bsontype.MaxKey, tMaxKey). - RegisterTypeMapEntry(bsontype.Type(0), tD) + RegisterTypeMapEntry(bsontype.Type(0), tD). + RegisterTypeMapEntry(bsontype.EmbeddedDocument, tD). + RegisterHookDecoder(tValueUnmarshaler, ValueDecoderFunc(dvd.ValueUnmarshalerDecodeValue)). + RegisterHookDecoder(tUnmarshaler, ValueDecoderFunc(dvd.UnmarshalerDecodeValue)) } // BooleanDecodeValue is the ValueDecoderFunc for bool types. func (dvd DefaultValueDecoders) BooleanDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if vr.Type() != bsontype.Boolean { - return fmt.Errorf("cannot decode %v into a boolean", vr.Type()) - } if !val.IsValid() || !val.CanSet() || val.Kind() != reflect.Bool { return ValueDecoderError{Name: "BooleanDecodeValue", Kinds: []reflect.Kind{reflect.Bool}, Received: val} } - b, err := vr.ReadBoolean() + var b bool + var err error + switch vrType := vr.Type(); vrType { + case bsontype.Int32: + i32, err := vr.ReadInt32() + if err != nil { + return err + } + b = (i32 != 0) + case bsontype.Int64: + i64, err := vr.ReadInt64() + if err != nil { + return err + } + b = (i64 != 0) + case bsontype.Double: + f64, err := vr.ReadDouble() + if err != nil { + return err + } + b = (f64 != 0) + case bsontype.Boolean: + b, err = vr.ReadBoolean() + if err != nil { + return err + } + case bsontype.Null: + if err = vr.ReadNull(); err != nil { + return err + } + default: + return fmt.Errorf("cannot decode %v into a boolean", vrType) + } val.SetBool(b) - return err + return nil } -// IntDecodeValue is the ValueDecoderFunc for bool types. +// IntDecodeValue is the ValueDecoderFunc for int types. func (dvd DefaultValueDecoders) IntDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if !val.CanSet() { + return ValueDecoderError{ + Name: "IntDecodeValue", + Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int}, + Received: val, + } + } + var i64 int64 var err error - switch vr.Type() { + switch vrType := vr.Type(); vrType { case bsontype.Int32: i32, err := vr.ReadInt32() if err != nil { @@ -145,16 +183,20 @@ func (dvd DefaultValueDecoders) IntDecodeValue(dc DecodeContext, vr bsonrw.Value return fmt.Errorf("%g overflows int64", f64) } i64 = int64(f64) - default: - return fmt.Errorf("cannot decode %v into an integer type", vr.Type()) - } - - if !val.CanSet() { - return ValueDecoderError{ - Name: "IntDecodeValue", - Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int}, - Received: val, + case bsontype.Boolean: + b, err := vr.ReadBoolean() + if err != nil { + return err + } + if b { + i64 = 1 + } + case bsontype.Null: + if err = vr.ReadNull(); err != nil { + return err } + default: + return fmt.Errorf("cannot decode %v into an integer type", vrType) } switch val.Kind() { @@ -188,6 +230,8 @@ func (dvd DefaultValueDecoders) IntDecodeValue(dc DecodeContext, vr bsonrw.Value } // UintDecodeValue is the ValueDecoderFunc for uint types. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use UIntCodec.DecodeValue instead. func (dvd DefaultValueDecoders) UintDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { var i64 int64 var err error @@ -215,6 +259,14 @@ func (dvd DefaultValueDecoders) UintDecodeValue(dc DecodeContext, vr bsonrw.Valu return fmt.Errorf("%g overflows int64", f64) } i64 = int64(f64) + case bsontype.Boolean: + b, err := vr.ReadBoolean() + if err != nil { + return err + } + if b { + i64 = 1 + } default: return fmt.Errorf("cannot decode %v into an integer type", vr.Type()) } @@ -262,9 +314,17 @@ func (dvd DefaultValueDecoders) UintDecodeValue(dc DecodeContext, vr bsonrw.Valu // FloatDecodeValue is the ValueDecoderFunc for float types. func (dvd DefaultValueDecoders) FloatDecodeValue(ec DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if !val.CanSet() { + return ValueDecoderError{ + Name: "FloatDecodeValue", + Kinds: []reflect.Kind{reflect.Float32, reflect.Float64}, + Received: val, + } + } + var f float64 var err error - switch vr.Type() { + switch vrType := vr.Type(); vrType { case bsontype.Int32: i32, err := vr.ReadInt32() if err != nil { @@ -282,12 +342,20 @@ func (dvd DefaultValueDecoders) FloatDecodeValue(ec DecodeContext, vr bsonrw.Val if err != nil { return err } + case bsontype.Boolean: + b, err := vr.ReadBoolean() + if err != nil { + return err + } + if b { + f = 1 + } + case bsontype.Null: + if err = vr.ReadNull(); err != nil { + return err + } default: - return fmt.Errorf("cannot decode %v into a float32 or float64 type", vr.Type()) - } - - if !val.CanSet() { - return ValueDecoderError{Name: "FloatDecodeValue", Kinds: []reflect.Kind{reflect.Float32, reflect.Float64}, Received: val} + return fmt.Errorf("cannot decode %v into a float32 or float64 type", vrType) } switch val.Kind() { @@ -305,6 +373,8 @@ func (dvd DefaultValueDecoders) FloatDecodeValue(ec DecodeContext, vr bsonrw.Val } // StringDecodeValue is the ValueDecoderFunc for string types. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use StringCodec.DecodeValue instead. func (dvd DefaultValueDecoders) StringDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { var str string var err error @@ -329,18 +399,23 @@ func (dvd DefaultValueDecoders) StringDecodeValue(dctx DecodeContext, vr bsonrw. // JavaScriptDecodeValue is the ValueDecoderFunc for the primitive.JavaScript type. func (DefaultValueDecoders) JavaScriptDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { if !val.CanSet() || val.Type() != tJavaScript { - return ValueDecoderError{Name: "BinaryDecodeValue", Types: []reflect.Type{tJavaScript}, Received: val} + return ValueDecoderError{Name: "JavaScriptDecodeValue", Types: []reflect.Type{tJavaScript}, Received: val} } - if vr.Type() != bsontype.JavaScript { - return fmt.Errorf("cannot decode %v into a primitive.JavaScript", vr.Type()) + var js string + var err error + switch vrType := vr.Type(); vrType { + case bsontype.JavaScript: + js, err = vr.ReadJavascript() + case bsontype.Null: + err = vr.ReadNull() + default: + return fmt.Errorf("cannot decode %v into a primitive.JavaScript", vrType) } - js, err := vr.ReadJavascript() if err != nil { return err } - val.SetString(js) return nil } @@ -348,16 +423,37 @@ func (DefaultValueDecoders) JavaScriptDecodeValue(dctx DecodeContext, vr bsonrw. // SymbolDecodeValue is the ValueDecoderFunc for the primitive.Symbol type. func (DefaultValueDecoders) SymbolDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { if !val.CanSet() || val.Type() != tSymbol { - return ValueDecoderError{Name: "BinaryDecodeValue", Types: []reflect.Type{tSymbol}, Received: val} - } - - if vr.Type() != bsontype.Symbol { - return fmt.Errorf("cannot decode %v into a primitive.Symbol", vr.Type()) + return ValueDecoderError{Name: "SymbolDecodeValue", Types: []reflect.Type{tSymbol}, Received: val} } - symbol, err := vr.ReadSymbol() - if err != nil { - return err + var symbol string + var err error + switch vrType := vr.Type(); vrType { + case bsontype.String: + symbol, err = vr.ReadString() + if err != nil { + return err + } + case bsontype.Symbol: + symbol, err = vr.ReadSymbol() + if err != nil { + return err + } + case bsontype.Binary: + data, subtype, err := vr.ReadBinary() + if err != nil { + return err + } + if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld { + return fmt.Errorf("SymbolDecodeValue can only be used to decode subtype 0x00 or 0x02 for %s, got %v", bsontype.Binary, subtype) + } + symbol = string(data) + case bsontype.Null: + if err = vr.ReadNull(); err != nil { + return err + } + default: + return fmt.Errorf("cannot decode %v into a primitive.Symbol", vrType) } val.SetString(symbol) @@ -370,15 +466,21 @@ func (DefaultValueDecoders) BinaryDecodeValue(dc DecodeContext, vr bsonrw.ValueR return ValueDecoderError{Name: "BinaryDecodeValue", Types: []reflect.Type{tBinary}, Received: val} } - if vr.Type() != bsontype.Binary { - return fmt.Errorf("cannot decode %v into a Binary", vr.Type()) + var data []byte + var subtype byte + var err error + switch vrType := vr.Type(); vrType { + case bsontype.Binary: + data, subtype, err = vr.ReadBinary() + case bsontype.Null: + err = vr.ReadNull() + default: + return fmt.Errorf("cannot decode %v into a Binary", vrType) } - data, subtype, err := vr.ReadBinary() if err != nil { return err } - val.Set(reflect.ValueOf(primitive.Binary{Subtype: subtype, Data: data})) return nil } @@ -389,12 +491,21 @@ func (DefaultValueDecoders) UndefinedDecodeValue(dc DecodeContext, vr bsonrw.Val return ValueDecoderError{Name: "UndefinedDecodeValue", Types: []reflect.Type{tUndefined}, Received: val} } - if vr.Type() != bsontype.Undefined { + var err error + switch vrType := vr.Type(); vrType { + case bsontype.Undefined: + err = vr.ReadUndefined() + case bsontype.Null: + err = vr.ReadNull() + default: return fmt.Errorf("cannot decode %v into an Undefined", vr.Type()) } + if err != nil { + return err + } val.Set(reflect.ValueOf(primitive.Undefined{})) - return vr.ReadUndefined() + return nil } // ObjectIDDecodeValue is the ValueDecoderFunc for primitive.ObjectID. @@ -403,12 +514,34 @@ func (dvd DefaultValueDecoders) ObjectIDDecodeValue(dc DecodeContext, vr bsonrw. return ValueDecoderError{Name: "ObjectIDDecodeValue", Types: []reflect.Type{tOID}, Received: val} } - if vr.Type() != bsontype.ObjectID { - return fmt.Errorf("cannot decode %v into an ObjectID", vr.Type()) + var oid primitive.ObjectID + var err error + switch vrType := vr.Type(); vrType { + case bsontype.ObjectID: + oid, err = vr.ReadObjectID() + if err != nil { + return err + } + case bsontype.String: + str, err := vr.ReadString() + if err != nil { + return err + } + if len(str) != 12 { + return fmt.Errorf("an ObjectID string must be exactly 12 bytes long (got %v)", len(str)) + } + byteArr := []byte(str) + copy(oid[:], byteArr) + case bsontype.Null: + if err = vr.ReadNull(); err != nil { + return err + } + default: + return fmt.Errorf("cannot decode %v into an ObjectID", vrType) } - oid, err := vr.ReadObjectID() + val.Set(reflect.ValueOf(oid)) - return err + return nil } // DateTimeDecodeValue is the ValueDecoderFunc for DateTime. @@ -417,15 +550,20 @@ func (DefaultValueDecoders) DateTimeDecodeValue(dc DecodeContext, vr bsonrw.Valu return ValueDecoderError{Name: "DateTimeDecodeValue", Types: []reflect.Type{tDateTime}, Received: val} } - if vr.Type() != bsontype.DateTime { - return fmt.Errorf("cannot decode %v into a DateTime", vr.Type()) + var dt int64 + var err error + switch vrType := vr.Type(); vrType { + case bsontype.DateTime: + dt, err = vr.ReadDateTime() + case bsontype.Null: + err = vr.ReadNull() + default: + return fmt.Errorf("cannot decode %v into a DateTime", vrType) } - dt, err := vr.ReadDateTime() if err != nil { return err } - val.Set(reflect.ValueOf(primitive.DateTime(dt))) return nil } @@ -436,8 +574,8 @@ func (DefaultValueDecoders) NullDecodeValue(dc DecodeContext, vr bsonrw.ValueRea return ValueDecoderError{Name: "NullDecodeValue", Types: []reflect.Type{tNull}, Received: val} } - if vr.Type() != bsontype.Null { - return fmt.Errorf("cannot decode %v into a Null", vr.Type()) + if vrType := vr.Type(); vrType != bsontype.Null { + return fmt.Errorf("cannot decode %v into a Null", vrType) } val.Set(reflect.ValueOf(primitive.Null{})) @@ -450,15 +588,20 @@ func (DefaultValueDecoders) RegexDecodeValue(dc DecodeContext, vr bsonrw.ValueRe return ValueDecoderError{Name: "RegexDecodeValue", Types: []reflect.Type{tRegex}, Received: val} } - if vr.Type() != bsontype.Regex { - return fmt.Errorf("cannot decode %v into a Regex", vr.Type()) + var pattern, options string + var err error + switch vrType := vr.Type(); vrType { + case bsontype.Regex: + pattern, options, err = vr.ReadRegex() + case bsontype.Null: + err = vr.ReadNull() + default: + return fmt.Errorf("cannot decode %v into a Regex", vrType) } - pattern, options, err := vr.ReadRegex() if err != nil { return err } - val.Set(reflect.ValueOf(primitive.Regex{Pattern: pattern, Options: options})) return nil } @@ -469,15 +612,21 @@ func (DefaultValueDecoders) DBPointerDecodeValue(dc DecodeContext, vr bsonrw.Val return ValueDecoderError{Name: "DBPointerDecodeValue", Types: []reflect.Type{tDBPointer}, Received: val} } - if vr.Type() != bsontype.DBPointer { - return fmt.Errorf("cannot decode %v into a DBPointer", vr.Type()) + var ns string + var pointer primitive.ObjectID + var err error + switch vrType := vr.Type(); vrType { + case bsontype.DBPointer: + ns, pointer, err = vr.ReadDBPointer() + case bsontype.Null: + err = vr.ReadNull() + default: + return fmt.Errorf("cannot decode %v into a DBPointer", vrType) } - ns, pointer, err := vr.ReadDBPointer() if err != nil { return err } - val.Set(reflect.ValueOf(primitive.DBPointer{DB: ns, Pointer: pointer})) return nil } @@ -488,15 +637,20 @@ func (DefaultValueDecoders) TimestampDecodeValue(dc DecodeContext, vr bsonrw.Val return ValueDecoderError{Name: "TimestampDecodeValue", Types: []reflect.Type{tTimestamp}, Received: val} } - if vr.Type() != bsontype.Timestamp { - return fmt.Errorf("cannot decode %v into a Timestamp", vr.Type()) + var t, incr uint32 + var err error + switch vrType := vr.Type(); vrType { + case bsontype.Timestamp: + t, incr, err = vr.ReadTimestamp() + case bsontype.Null: + err = vr.ReadNull() + default: + return fmt.Errorf("cannot decode %v into a Timestamp", vrType) } - t, incr, err := vr.ReadTimestamp() if err != nil { return err } - val.Set(reflect.ValueOf(primitive.Timestamp{T: t, I: incr})) return nil } @@ -507,12 +661,21 @@ func (DefaultValueDecoders) MinKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueR return ValueDecoderError{Name: "MinKeyDecodeValue", Types: []reflect.Type{tMinKey}, Received: val} } - if vr.Type() != bsontype.MinKey { + var err error + switch vrType := vr.Type(); vrType { + case bsontype.MinKey: + err = vr.ReadMinKey() + case bsontype.Null: + err = vr.ReadNull() + default: return fmt.Errorf("cannot decode %v into a MinKey", vr.Type()) } + if err != nil { + return err + } val.Set(reflect.ValueOf(primitive.MinKey{})) - return vr.ReadMinKey() + return nil } // MaxKeyDecodeValue is the ValueDecoderFunc for MaxKey. @@ -521,24 +684,43 @@ func (DefaultValueDecoders) MaxKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueR return ValueDecoderError{Name: "MaxKeyDecodeValue", Types: []reflect.Type{tMaxKey}, Received: val} } - if vr.Type() != bsontype.MaxKey { + var err error + switch vrType := vr.Type(); vrType { + case bsontype.MaxKey: + err = vr.ReadMaxKey() + case bsontype.Null: + err = vr.ReadNull() + default: return fmt.Errorf("cannot decode %v into a MaxKey", vr.Type()) } + if err != nil { + return err + } val.Set(reflect.ValueOf(primitive.MaxKey{})) - return vr.ReadMaxKey() + return nil } // Decimal128DecodeValue is the ValueDecoderFunc for primitive.Decimal128. func (dvd DefaultValueDecoders) Decimal128DecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if vr.Type() != bsontype.Decimal128 { + if !val.CanSet() || val.Type() != tDecimal { + return ValueDecoderError{Name: "Decimal128DecodeValue", Types: []reflect.Type{tDecimal}, Received: val} + } + + var d128 primitive.Decimal128 + var err error + switch vrType := vr.Type(); vrType { + case bsontype.Decimal128: + d128, err = vr.ReadDecimal128() + case bsontype.Null: + err = vr.ReadNull() + default: return fmt.Errorf("cannot decode %v into a primitive.Decimal128", vr.Type()) } - if !val.CanSet() || val.Type() != tDecimal { - return ValueDecoderError{Name: "Decimal128DecodeValue", Types: []reflect.Type{tDecimal}, Received: val} + if err != nil { + return err } - d128, err := vr.ReadDecimal128() val.Set(reflect.ValueOf(d128)) return err } @@ -549,13 +731,13 @@ func (dvd DefaultValueDecoders) JSONNumberDecodeValue(dc DecodeContext, vr bsonr return ValueDecoderError{Name: "JSONNumberDecodeValue", Types: []reflect.Type{tJSONNumber}, Received: val} } - switch vr.Type() { + switch vrType := vr.Type(); vrType { case bsontype.Double: f64, err := vr.ReadDouble() if err != nil { return err } - val.Set(reflect.ValueOf(json.Number(strconv.FormatFloat(f64, 'g', -1, 64)))) + val.Set(reflect.ValueOf(json.Number(strconv.FormatFloat(f64, 'f', -1, 64)))) case bsontype.Int32: i32, err := vr.ReadInt32() if err != nil { @@ -568,8 +750,13 @@ func (dvd DefaultValueDecoders) JSONNumberDecodeValue(dc DecodeContext, vr bsonr return err } val.Set(reflect.ValueOf(json.Number(strconv.FormatInt(i64, 10)))) + case bsontype.Null: + if err := vr.ReadNull(); err != nil { + return err + } + val.SetString("") default: - return fmt.Errorf("cannot decode %v into a json.Number", vr.Type()) + return fmt.Errorf("cannot decode %v into a json.Number", vrType) } return nil @@ -577,29 +764,37 @@ func (dvd DefaultValueDecoders) JSONNumberDecodeValue(dc DecodeContext, vr bsonr // URLDecodeValue is the ValueDecoderFunc for url.URL. func (dvd DefaultValueDecoders) URLDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { - if vr.Type() != bsontype.String { - return fmt.Errorf("cannot decode %v into a *url.URL", vr.Type()) - } - - str, err := vr.ReadString() - if err != nil { - return err - } - - u, err := url.Parse(str) - if err != nil { - return err - } - if !val.CanSet() || val.Type() != tURL { return ValueDecoderError{Name: "URLDecodeValue", Types: []reflect.Type{tURL}, Received: val} } - val.Set(reflect.ValueOf(u).Elem()) - return nil + switch vrType := vr.Type(); vrType { + case bsontype.String: + str, err := vr.ReadString() + if err != nil { + return err + } + + parsedURL, err := url.Parse(str) + if err != nil { + return err + } + val.Set(reflect.ValueOf(parsedURL).Elem()) + return nil + case bsontype.Null: + if err := vr.ReadNull(); err != nil { + return err + } + val.Set(reflect.ValueOf(url.URL{})) + return nil + default: + return fmt.Errorf("cannot decode %v into a *url.URL", vrType) + } } // TimeDecodeValue is the ValueDecoderFunc for time.Time. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use Time.DecodeValue instead. func (dvd DefaultValueDecoders) TimeDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { if vr.Type() != bsontype.DateTime { return fmt.Errorf("cannot decode %v into a time.Time", vr.Type()) @@ -619,6 +814,8 @@ func (dvd DefaultValueDecoders) TimeDecodeValue(dc DecodeContext, vr bsonrw.Valu } // ByteSliceDecodeValue is the ValueDecoderFunc for []byte. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use ByteSliceCodec.DecodeValue instead. func (dvd DefaultValueDecoders) ByteSliceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { if vr.Type() != bsontype.Binary && vr.Type() != bsontype.Null { return fmt.Errorf("cannot decode %v into a []byte", vr.Type()) @@ -646,6 +843,8 @@ func (dvd DefaultValueDecoders) ByteSliceDecodeValue(dc DecodeContext, vr bsonrw } // MapDecodeValue is the ValueDecoderFunc for map[string]* types. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use Map.DecodeValue instead. func (dvd DefaultValueDecoders) MapDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { if !val.CanSet() || val.Kind() != reflect.Map || val.Type().Key().Kind() != reflect.String { return ValueDecoderError{Name: "MapDecodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val} @@ -707,14 +906,37 @@ func (dvd DefaultValueDecoders) ArrayDecodeValue(dc DecodeContext, vr bsonrw.Val return ValueDecoderError{Name: "ArrayDecodeValue", Kinds: []reflect.Kind{reflect.Array}, Received: val} } - switch vr.Type() { + switch vrType := vr.Type(); vrType { case bsontype.Array: case bsontype.Type(0), bsontype.EmbeddedDocument: if val.Type().Elem() != tE { return fmt.Errorf("cannot decode document into %s", val.Type()) } + case bsontype.Binary: + if val.Type().Elem() != tByte { + return fmt.Errorf("ArrayDecodeValue can only be used to decode binary into a byte array, got %v", vrType) + } + data, subtype, err := vr.ReadBinary() + if err != nil { + return err + } + if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld { + return fmt.Errorf("ArrayDecodeValue can only be used to decode subtype 0x00 or 0x02 for %s, got %v", bsontype.Binary, subtype) + } + + if len(data) > val.Len() { + return fmt.Errorf("more elements returned in array than can fit inside %s", val.Type()) + } + + for idx, elem := range data { + val.Index(idx).Set(reflect.ValueOf(elem)) + } + return nil + case bsontype.Null: + val.Set(reflect.Zero(val.Type())) + return vr.ReadNull() default: - return fmt.Errorf("cannot decode %v into an array", vr.Type()) + return fmt.Errorf("cannot decode %v into an array", vrType) } var elemsFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) ([]reflect.Value, error) @@ -731,7 +953,7 @@ func (dvd DefaultValueDecoders) ArrayDecodeValue(dc DecodeContext, vr bsonrw.Val } if len(elems) > val.Len() { - return fmt.Errorf("more elements returned in array than can fit inside %s", val.Type()) + return fmt.Errorf("more elements returned in array than can fit inside %s, got %v elements", val.Type(), len(elems)) } for idx, elem := range elems { @@ -742,6 +964,8 @@ func (dvd DefaultValueDecoders) ArrayDecodeValue(dc DecodeContext, vr bsonrw.Val } // SliceDecodeValue is the ValueDecoderFunc for slice types. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use SliceCodec.DecodeValue instead. func (dvd DefaultValueDecoders) SliceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { if !val.CanSet() || val.Kind() != reflect.Slice { return ValueDecoderError{Name: "SliceDecodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val} @@ -851,6 +1075,8 @@ func (dvd DefaultValueDecoders) UnmarshalerDecodeValue(dc DecodeContext, vr bson } // EmptyInterfaceDecodeValue is the ValueDecoderFunc for interface{}. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use EmptyInterfaceCodec.DecodeValue instead. func (dvd DefaultValueDecoders) EmptyInterfaceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { if !val.CanSet() || val.Type() != tEmpty { return ValueDecoderError{Name: "EmptyInterfaceDecodeValue", Types: []reflect.Type{tEmpty}, Received: val} @@ -947,27 +1173,36 @@ func (dvd DefaultValueDecoders) CodeWithScopeDecodeValue(dc DecodeContext, vr bs return ValueDecoderError{Name: "CodeWithScopeDecodeValue", Types: []reflect.Type{tCodeWithScope}, Received: val} } - if vr.Type() != bsontype.CodeWithScope { - return fmt.Errorf("cannot decode %v into a primitive.CodeWithScope", vr.Type()) - } + switch vrType := vr.Type(); vrType { + case bsontype.CodeWithScope: + code, dr, err := vr.ReadCodeWithScope() + if err != nil { + return err + } - code, dr, err := vr.ReadCodeWithScope() - if err != nil { - return err - } + scope := reflect.New(tD).Elem() + elems, err := dvd.decodeElemsFromDocumentReader(dc, dr) + if err != nil { + return err + } - scope := reflect.New(tD).Elem() + scope.Set(reflect.MakeSlice(tD, 0, len(elems))) + scope.Set(reflect.Append(scope, elems...)) - elems, err := dvd.decodeElemsFromDocumentReader(dc, dr) - if err != nil { - return err + val.Set(reflect.ValueOf(primitive.CodeWithScope{ + Code: primitive.JavaScript(code), + Scope: scope.Interface().(primitive.D), + })) + return nil + case bsontype.Null: + if err := vr.ReadNull(); err != nil { + return err + } + val.Set(reflect.ValueOf(primitive.CodeWithScope{})) + return nil + default: + return fmt.Errorf("cannot decode %v into a primitive.CodeWithScope", vrType) } - - scope.Set(reflect.MakeSlice(tD, 0, len(elems))) - scope.Set(reflect.Append(scope, elems...)) - - val.Set(reflect.ValueOf(primitive.CodeWithScope{Code: primitive.JavaScript(code), Scope: scope.Interface().(primitive.D)})) - return nil } func (dvd DefaultValueDecoders) decodeD(dc DecodeContext, vr bsonrw.ValueReader, _ reflect.Value) ([]reflect.Value, error) { diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go index 39ebfc7ecd..08078b304d 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go @@ -26,6 +26,8 @@ var defaultValueEncoders DefaultValueEncoders var bvwPool = bsonrw.NewBSONValueWriterPool() +var errInvalidValue = errors.New("cannot encode invalid element") + var sliceWriterPool = sync.Pool{ New: func() interface{} { sw := make(bsonrw.SliceWriter, 0, 0) @@ -65,48 +67,48 @@ func (dve DefaultValueEncoders) RegisterDefaultEncoders(rb *RegistryBuilder) { panic(errors.New("argument to RegisterDefaultEncoders must not be nil")) } rb. - RegisterEncoder(tByteSlice, ValueEncoderFunc(dve.ByteSliceEncodeValue)). - RegisterEncoder(tTime, ValueEncoderFunc(dve.TimeEncodeValue)). - RegisterEncoder(tEmpty, ValueEncoderFunc(dve.EmptyInterfaceEncodeValue)). - RegisterEncoder(tOID, ValueEncoderFunc(dve.ObjectIDEncodeValue)). - RegisterEncoder(tDecimal, ValueEncoderFunc(dve.Decimal128EncodeValue)). - RegisterEncoder(tJSONNumber, ValueEncoderFunc(dve.JSONNumberEncodeValue)). - RegisterEncoder(tURL, ValueEncoderFunc(dve.URLEncodeValue)). - RegisterEncoder(tValueMarshaler, ValueEncoderFunc(dve.ValueMarshalerEncodeValue)). - RegisterEncoder(tMarshaler, ValueEncoderFunc(dve.MarshalerEncodeValue)). - RegisterEncoder(tProxy, ValueEncoderFunc(dve.ProxyEncodeValue)). - RegisterEncoder(tJavaScript, ValueEncoderFunc(dve.JavaScriptEncodeValue)). - RegisterEncoder(tSymbol, ValueEncoderFunc(dve.SymbolEncodeValue)). - RegisterEncoder(tBinary, ValueEncoderFunc(dve.BinaryEncodeValue)). - RegisterEncoder(tUndefined, ValueEncoderFunc(dve.UndefinedEncodeValue)). - RegisterEncoder(tDateTime, ValueEncoderFunc(dve.DateTimeEncodeValue)). - RegisterEncoder(tNull, ValueEncoderFunc(dve.NullEncodeValue)). - RegisterEncoder(tRegex, ValueEncoderFunc(dve.RegexEncodeValue)). - RegisterEncoder(tDBPointer, ValueEncoderFunc(dve.DBPointerEncodeValue)). - RegisterEncoder(tTimestamp, ValueEncoderFunc(dve.TimestampEncodeValue)). - RegisterEncoder(tMinKey, ValueEncoderFunc(dve.MinKeyEncodeValue)). - RegisterEncoder(tMaxKey, ValueEncoderFunc(dve.MaxKeyEncodeValue)). - RegisterEncoder(tCoreDocument, ValueEncoderFunc(dve.CoreDocumentEncodeValue)). - RegisterEncoder(tCodeWithScope, ValueEncoderFunc(dve.CodeWithScopeEncodeValue)). + RegisterTypeEncoder(tByteSlice, defaultByteSliceCodec). + RegisterTypeEncoder(tTime, defaultTimeCodec). + RegisterTypeEncoder(tEmpty, defaultEmptyInterfaceCodec). + RegisterTypeEncoder(tOID, ValueEncoderFunc(dve.ObjectIDEncodeValue)). + RegisterTypeEncoder(tDecimal, ValueEncoderFunc(dve.Decimal128EncodeValue)). + RegisterTypeEncoder(tJSONNumber, ValueEncoderFunc(dve.JSONNumberEncodeValue)). + RegisterTypeEncoder(tURL, ValueEncoderFunc(dve.URLEncodeValue)). + RegisterTypeEncoder(tJavaScript, ValueEncoderFunc(dve.JavaScriptEncodeValue)). + RegisterTypeEncoder(tSymbol, ValueEncoderFunc(dve.SymbolEncodeValue)). + RegisterTypeEncoder(tBinary, ValueEncoderFunc(dve.BinaryEncodeValue)). + RegisterTypeEncoder(tUndefined, ValueEncoderFunc(dve.UndefinedEncodeValue)). + RegisterTypeEncoder(tDateTime, ValueEncoderFunc(dve.DateTimeEncodeValue)). + RegisterTypeEncoder(tNull, ValueEncoderFunc(dve.NullEncodeValue)). + RegisterTypeEncoder(tRegex, ValueEncoderFunc(dve.RegexEncodeValue)). + RegisterTypeEncoder(tDBPointer, ValueEncoderFunc(dve.DBPointerEncodeValue)). + RegisterTypeEncoder(tTimestamp, ValueEncoderFunc(dve.TimestampEncodeValue)). + RegisterTypeEncoder(tMinKey, ValueEncoderFunc(dve.MinKeyEncodeValue)). + RegisterTypeEncoder(tMaxKey, ValueEncoderFunc(dve.MaxKeyEncodeValue)). + RegisterTypeEncoder(tCoreDocument, ValueEncoderFunc(dve.CoreDocumentEncodeValue)). + RegisterTypeEncoder(tCodeWithScope, ValueEncoderFunc(dve.CodeWithScopeEncodeValue)). RegisterDefaultEncoder(reflect.Bool, ValueEncoderFunc(dve.BooleanEncodeValue)). RegisterDefaultEncoder(reflect.Int, ValueEncoderFunc(dve.IntEncodeValue)). RegisterDefaultEncoder(reflect.Int8, ValueEncoderFunc(dve.IntEncodeValue)). RegisterDefaultEncoder(reflect.Int16, ValueEncoderFunc(dve.IntEncodeValue)). RegisterDefaultEncoder(reflect.Int32, ValueEncoderFunc(dve.IntEncodeValue)). RegisterDefaultEncoder(reflect.Int64, ValueEncoderFunc(dve.IntEncodeValue)). - RegisterDefaultEncoder(reflect.Uint, ValueEncoderFunc(dve.UintEncodeValue)). - RegisterDefaultEncoder(reflect.Uint8, ValueEncoderFunc(dve.UintEncodeValue)). - RegisterDefaultEncoder(reflect.Uint16, ValueEncoderFunc(dve.UintEncodeValue)). - RegisterDefaultEncoder(reflect.Uint32, ValueEncoderFunc(dve.UintEncodeValue)). - RegisterDefaultEncoder(reflect.Uint64, ValueEncoderFunc(dve.UintEncodeValue)). + RegisterDefaultEncoder(reflect.Uint, defaultUIntCodec). + RegisterDefaultEncoder(reflect.Uint8, defaultUIntCodec). + RegisterDefaultEncoder(reflect.Uint16, defaultUIntCodec). + RegisterDefaultEncoder(reflect.Uint32, defaultUIntCodec). + RegisterDefaultEncoder(reflect.Uint64, defaultUIntCodec). RegisterDefaultEncoder(reflect.Float32, ValueEncoderFunc(dve.FloatEncodeValue)). RegisterDefaultEncoder(reflect.Float64, ValueEncoderFunc(dve.FloatEncodeValue)). RegisterDefaultEncoder(reflect.Array, ValueEncoderFunc(dve.ArrayEncodeValue)). - RegisterDefaultEncoder(reflect.Map, ValueEncoderFunc(dve.MapEncodeValue)). - RegisterDefaultEncoder(reflect.Slice, ValueEncoderFunc(dve.SliceEncodeValue)). - RegisterDefaultEncoder(reflect.String, ValueEncoderFunc(dve.StringEncodeValue)). - RegisterDefaultEncoder(reflect.Struct, &StructCodec{cache: make(map[reflect.Type]*structDescription), parser: DefaultStructTagParser}). - RegisterDefaultEncoder(reflect.Ptr, NewPointerCodec()) + RegisterDefaultEncoder(reflect.Map, defaultMapCodec). + RegisterDefaultEncoder(reflect.Slice, defaultSliceCodec). + RegisterDefaultEncoder(reflect.String, defaultStringCodec). + RegisterDefaultEncoder(reflect.Struct, defaultStructCodec). + RegisterDefaultEncoder(reflect.Ptr, NewPointerCodec()). + RegisterHookEncoder(tValueMarshaler, ValueEncoderFunc(dve.ValueMarshalerEncodeValue)). + RegisterHookEncoder(tMarshaler, ValueEncoderFunc(dve.MarshalerEncodeValue)). + RegisterHookEncoder(tProxy, ValueEncoderFunc(dve.ProxyEncodeValue)) } // BooleanEncodeValue is the ValueEncoderFunc for bool types. @@ -148,6 +150,8 @@ func (dve DefaultValueEncoders) IntEncodeValue(ec EncodeContext, vw bsonrw.Value } // UintEncodeValue is the ValueEncoderFunc for uint types. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use UIntCodec.EncodeValue instead. func (dve DefaultValueEncoders) UintEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { switch val.Kind() { case reflect.Uint8, reflect.Uint16: @@ -181,6 +185,8 @@ func (dve DefaultValueEncoders) FloatEncodeValue(ec EncodeContext, vw bsonrw.Val } // StringEncodeValue is the ValueEncoderFunc for string types. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use StringCodec.EncodeValue instead. func (dve DefaultValueEncoders) StringEncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { if val.Kind() != reflect.String { return ValueEncoderError{ @@ -239,6 +245,8 @@ func (dve DefaultValueEncoders) URLEncodeValue(ec EncodeContext, vw bsonrw.Value } // TimeEncodeValue is the ValueEncoderFunc for time.TIme. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use TimeCodec.EncodeValue instead. func (dve DefaultValueEncoders) TimeEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { if !val.IsValid() || val.Type() != tTime { return ValueEncoderError{Name: "TimeEncodeValue", Types: []reflect.Type{tTime}, Received: val} @@ -248,6 +256,8 @@ func (dve DefaultValueEncoders) TimeEncodeValue(ec EncodeContext, vw bsonrw.Valu } // ByteSliceEncodeValue is the ValueEncoderFunc for []byte. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use ByteSliceCodec.EncodeValue instead. func (dve DefaultValueEncoders) ByteSliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { if !val.IsValid() || val.Type() != tByteSlice { return ValueEncoderError{Name: "ByteSliceEncodeValue", Types: []reflect.Type{tByteSlice}, Received: val} @@ -259,6 +269,8 @@ func (dve DefaultValueEncoders) ByteSliceEncodeValue(ec EncodeContext, vw bsonrw } // MapEncodeValue is the ValueEncoderFunc for map[string]* types. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use MapCodec.EncodeValue instead. func (dve DefaultValueEncoders) MapEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { if !val.IsValid() || val.Kind() != reflect.Map || val.Type().Key().Kind() != reflect.String { return ValueEncoderError{Name: "MapEncodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val} @@ -289,8 +301,9 @@ func (dve DefaultValueEncoders) MapEncodeValue(ec EncodeContext, vw bsonrw.Value // struct codec. func (dve DefaultValueEncoders) mapEncodeValue(ec EncodeContext, dw bsonrw.DocumentWriter, val reflect.Value, collisionFn func(string) bool) error { - encoder, err := ec.LookupEncoder(val.Type().Elem()) - if err != nil { + elemType := val.Type().Elem() + encoder, err := ec.LookupEncoder(elemType) + if err != nil && elemType.Kind() != reflect.Interface { return err } @@ -299,19 +312,33 @@ func (dve DefaultValueEncoders) mapEncodeValue(ec EncodeContext, dw bsonrw.Docum if collisionFn != nil && collisionFn(key.String()) { return fmt.Errorf("Key %s of inlined map conflicts with a struct field name", key) } + + currEncoder, currVal, lookupErr := dve.lookupElementEncoder(ec, encoder, val.MapIndex(key)) + if lookupErr != nil && lookupErr != errInvalidValue { + return lookupErr + } + vw, err := dw.WriteDocumentElement(key.String()) if err != nil { return err } - if enc, ok := encoder.(ValueEncoder); ok { - err = enc.EncodeValue(ec, vw, val.MapIndex(key)) + if lookupErr == errInvalidValue { + err = vw.WriteNull() + if err != nil { + return err + } + continue + } + + if enc, ok := currEncoder.(ValueEncoder); ok { + err = enc.EncodeValue(ec, vw, currVal) if err != nil { return err } continue } - err = encoder.EncodeValue(ec, vw, val.MapIndex(key)) + err = encoder.EncodeValue(ec, vw, currVal) if err != nil { return err } @@ -344,23 +371,46 @@ func (dve DefaultValueEncoders) ArrayEncodeValue(ec EncodeContext, vw bsonrw.Val return dw.WriteDocumentEnd() } + // If we have a []byte we want to treat it as a binary instead of as an array. + if val.Type().Elem() == tByte { + var byteSlice []byte + for idx := 0; idx < val.Len(); idx++ { + byteSlice = append(byteSlice, val.Index(idx).Interface().(byte)) + } + return vw.WriteBinary(byteSlice) + } + aw, err := vw.WriteArray() if err != nil { return err } - encoder, err := ec.LookupEncoder(val.Type().Elem()) - if err != nil { + elemType := val.Type().Elem() + encoder, err := ec.LookupEncoder(elemType) + if err != nil && elemType.Kind() != reflect.Interface { return err } for idx := 0; idx < val.Len(); idx++ { + currEncoder, currVal, lookupErr := dve.lookupElementEncoder(ec, encoder, val.Index(idx)) + if lookupErr != nil && lookupErr != errInvalidValue { + return lookupErr + } + vw, err := aw.WriteArrayElement() if err != nil { return err } - err = encoder.EncodeValue(ec, vw, val.Index(idx)) + if lookupErr == errInvalidValue { + err = vw.WriteNull() + if err != nil { + return err + } + continue + } + + err = currEncoder.EncodeValue(ec, vw, currVal) if err != nil { return err } @@ -369,6 +419,8 @@ func (dve DefaultValueEncoders) ArrayEncodeValue(ec EncodeContext, vw bsonrw.Val } // SliceEncodeValue is the ValueEncoderFunc for slice types. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use SliceCodec.EncodeValue instead. func (dve DefaultValueEncoders) SliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { if !val.IsValid() || val.Kind() != reflect.Slice { return ValueEncoderError{Name: "SliceEncodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val} @@ -402,18 +454,32 @@ func (dve DefaultValueEncoders) SliceEncodeValue(ec EncodeContext, vw bsonrw.Val return err } - encoder, err := ec.LookupEncoder(val.Type().Elem()) - if err != nil { + elemType := val.Type().Elem() + encoder, err := ec.LookupEncoder(elemType) + if err != nil && elemType.Kind() != reflect.Interface { return err } for idx := 0; idx < val.Len(); idx++ { + currEncoder, currVal, lookupErr := dve.lookupElementEncoder(ec, encoder, val.Index(idx)) + if lookupErr != nil && lookupErr != errInvalidValue { + return lookupErr + } + vw, err := aw.WriteArrayElement() if err != nil { return err } - err = encoder.EncodeValue(ec, vw, val.Index(idx)) + if lookupErr == errInvalidValue { + err = vw.WriteNull() + if err != nil { + return err + } + continue + } + + err = currEncoder.EncodeValue(ec, vw, currVal) if err != nil { return err } @@ -421,7 +487,22 @@ func (dve DefaultValueEncoders) SliceEncodeValue(ec EncodeContext, vw bsonrw.Val return aw.WriteArrayEnd() } +func (dve DefaultValueEncoders) lookupElementEncoder(ec EncodeContext, origEncoder ValueEncoder, currVal reflect.Value) (ValueEncoder, reflect.Value, error) { + if origEncoder != nil || (currVal.Kind() != reflect.Interface) { + return origEncoder, currVal, nil + } + currVal = currVal.Elem() + if !currVal.IsValid() { + return nil, currVal, errInvalidValue + } + currEncoder, err := ec.LookupEncoder(currVal.Type()) + + return currEncoder, currVal, err +} + // EmptyInterfaceEncodeValue is the ValueEncoderFunc for interface{}. +// This method is deprecated and does not have any stability guarantees. It may be removed in the +// future. Use EmptyInterfaceCodec.EncodeValue instead. func (dve DefaultValueEncoders) EmptyInterfaceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { if !val.IsValid() || val.Type() != tEmpty { return ValueEncoderError{Name: "EmptyInterfaceEncodeValue", Types: []reflect.Type{tEmpty}, Received: val} @@ -440,7 +521,18 @@ func (dve DefaultValueEncoders) EmptyInterfaceEncodeValue(ec EncodeContext, vw b // ValueMarshalerEncodeValue is the ValueEncoderFunc for ValueMarshaler implementations. func (dve DefaultValueEncoders) ValueMarshalerEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || !val.Type().Implements(tValueMarshaler) { + // Either val or a pointer to val must implement ValueMarshaler + switch { + case !val.IsValid(): + return ValueEncoderError{Name: "ValueMarshalerEncodeValue", Types: []reflect.Type{tValueMarshaler}, Received: val} + case val.Type().Implements(tValueMarshaler): + // If ValueMarshaler is implemented on a concrete type, make sure that val isn't a nil pointer + if isImplementationNil(val, tValueMarshaler) { + return vw.WriteNull() + } + case reflect.PtrTo(val.Type()).Implements(tValueMarshaler) && val.CanAddr(): + val = val.Addr() + default: return ValueEncoderError{Name: "ValueMarshalerEncodeValue", Types: []reflect.Type{tValueMarshaler}, Received: val} } @@ -455,7 +547,18 @@ func (dve DefaultValueEncoders) ValueMarshalerEncodeValue(ec EncodeContext, vw b // MarshalerEncodeValue is the ValueEncoderFunc for Marshaler implementations. func (dve DefaultValueEncoders) MarshalerEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || !val.Type().Implements(tMarshaler) { + // Either val or a pointer to val must implement Marshaler + switch { + case !val.IsValid(): + return ValueEncoderError{Name: "MarshalerEncodeValue", Types: []reflect.Type{tMarshaler}, Received: val} + case val.Type().Implements(tMarshaler): + // If Marshaler is implemented on a concrete type, make sure that val isn't a nil pointer + if isImplementationNil(val, tMarshaler) { + return vw.WriteNull() + } + case reflect.PtrTo(val.Type()).Implements(tMarshaler) && val.CanAddr(): + val = val.Addr() + default: return ValueEncoderError{Name: "MarshalerEncodeValue", Types: []reflect.Type{tMarshaler}, Received: val} } @@ -470,7 +573,18 @@ func (dve DefaultValueEncoders) MarshalerEncodeValue(ec EncodeContext, vw bsonrw // ProxyEncodeValue is the ValueEncoderFunc for Proxy implementations. func (dve DefaultValueEncoders) ProxyEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { - if !val.IsValid() || !val.Type().Implements(tProxy) { + // Either val or a pointer to val must implement Proxy + switch { + case !val.IsValid(): + return ValueEncoderError{Name: "ProxyEncodeValue", Types: []reflect.Type{tProxy}, Received: val} + case val.Type().Implements(tProxy): + // If Proxy is implemented on a concrete type, make sure that val isn't a nil pointer + if isImplementationNil(val, tProxy) { + return vw.WriteNull() + } + case reflect.PtrTo(val.Type()).Implements(tProxy) && val.CanAddr(): + val = val.Addr() + default: return ValueEncoderError{Name: "ProxyEncodeValue", Types: []reflect.Type{tProxy}, Received: val} } @@ -646,3 +760,12 @@ func (dve DefaultValueEncoders) CodeWithScopeEncodeValue(ec EncodeContext, vw bs } return dw.WriteDocumentEnd() } + +// isImplementationNil returns if val is a nil pointer and inter is implemented on a concrete type +func isImplementationNil(val reflect.Value, inter reflect.Type) bool { + vt := val.Type() + for vt.Kind() == reflect.Ptr { + vt = vt.Elem() + } + return vt.Implements(inter) && val.Kind() == reflect.Ptr && val.IsNil() +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go index 978511cbfa..c1e20f9489 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go @@ -27,28 +27,51 @@ // // Registry and RegistryBuilder // -// A Registry is an immutable store for ValueEncoders, ValueDecoders, and a type map. For looking up -// ValueEncoders and Decoders the Registry first attempts to find a ValueEncoder or ValueDecoder for -// the type provided; if one cannot be found it then checks to see if a registered ValueEncoder or -// ValueDecoder exists for an interface the type implements. Finally, the reflect.Kind of the type -// is used to lookup a default ValueEncoder or ValueDecoder for that kind. If no ValueEncoder or -// ValueDecoder can be found, an error is returned. -// -// The Registry also holds a type map. This allows users to retrieve the Go type that should be used -// when decoding a BSON value into an empty interface. This is primarily only used for the empty -// interface ValueDecoder. -// -// A RegistryBuilder is used to construct a Registry. The Register methods are used to associate -// either a reflect.Type or a reflect.Kind with a ValueEncoder or ValueDecoder. A RegistryBuilder -// returned from NewRegistryBuilder contains no registered ValueEncoders nor ValueDecoders and -// contains an empty type map. -// -// The RegisterTypeMapEntry method handles associating a BSON type with a Go type. For example, if -// you want to decode BSON int64 and int32 values into Go int instances, you would do the following: -// -// var regbuilder *RegistryBuilder = ... intType := reflect.TypeOf(int(0)) -// regbuilder.RegisterTypeMapEntry(bsontype.Int64, intType).RegisterTypeMapEntry(bsontype.Int32, -// intType) +// A Registry is an immutable store for ValueEncoders, ValueDecoders, and a type map. See the Registry type +// documentation for examples of registering various custom encoders and decoders. A Registry can be constructed using a +// RegistryBuilder, which handles three main types of codecs: +// +// 1. Type encoders/decoders - These can be registered using the RegisterTypeEncoder and RegisterTypeDecoder methods. +// The registered codec will be invoked when encoding/decoding a value whose type matches the registered type exactly. +// If the registered type is an interface, the codec will be invoked when encoding or decoding values whose type is the +// interface, but not for values with concrete types that implement the interface. +// +// 2. Hook encoders/decoders - These can be registered using the RegisterHookEncoder and RegisterHookDecoder methods. +// These methods only accept interface types and the registered codecs will be invoked when encoding or decoding values +// whose types implement the interface. An example of a hook defined by the driver is bson.Marshaler. The driver will +// call the MarshalBSON method for any value whose type implements bson.Marshaler, regardless of the value's concrete +// type. +// +// 3. Type map entries - This can be used to associate a BSON type with a Go type. These type associations are used when +// decoding into a bson.D/bson.M or a struct field of type interface{}. For example, by default, BSON int32 and int64 +// values decode as Go int32 and int64 instances, respectively, when decoding into a bson.D. The following code would +// change the behavior so these values decode as Go int instances instead: +// +// intType := reflect.TypeOf(int(0)) +// registryBuilder.RegisterTypeMapEntry(bsontype.Int32, intType).RegisterTypeMapEntry(bsontype.Int64, intType) +// +// 4. Kind encoder/decoders - These can be registered using the RegisterDefaultEncoder and RegisterDefaultDecoder +// methods. The registered codec will be invoked when encoding or decoding values whose reflect.Kind matches the +// registered reflect.Kind as long as the value's type doesn't match a registered type or hook encoder/decoder first. +// These methods should be used to change the behavior for all values for a specific kind. +// +// Registry Lookup Procedure +// +// When looking up an encoder in a Registry, the precedence rules are as follows: +// +// 1. A type encoder registered for the exact type of the value. +// +// 2. A hook encoder registered for an interface that is implemented by the value or by a pointer to the value. If the +// value matches multiple hooks (e.g. the type implements bsoncodec.Marshaler and bsoncodec.ValueMarshaler), the first +// one registered will be selected. Note that registries constructed using bson.NewRegistryBuilder have driver-defined +// hooks registered for the bsoncodec.Marshaler, bsoncodec.ValueMarshaler, and bsoncodec.Proxy interfaces, so those +// will take precedence over any new hooks. +// +// 3. A kind encoder registered for the value's kind. +// +// If all of these lookups fail to find an encoder, an error of type ErrNoEncoder is returned. The same precedence +// rules apply for decoders, with the exception that an error of type ErrNoDecoder will be returned if no decoder is +// found. // // DefaultValueEncoders and DefaultValueDecoders // diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/empty_interface_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/empty_interface_codec.go new file mode 100644 index 0000000000..c215ec3849 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/empty_interface_codec.go @@ -0,0 +1,125 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsoncodec + +import ( + "reflect" + + "go.mongodb.org/mongo-driver/bson/bsonoptions" + "go.mongodb.org/mongo-driver/bson/bsonrw" + "go.mongodb.org/mongo-driver/bson/bsontype" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +var defaultEmptyInterfaceCodec = NewEmptyInterfaceCodec() + +// EmptyInterfaceCodec is the Codec used for interface{} values. +type EmptyInterfaceCodec struct { + DecodeBinaryAsSlice bool +} + +var _ ValueCodec = &EmptyInterfaceCodec{} + +// NewEmptyInterfaceCodec returns a EmptyInterfaceCodec with options opts. +func NewEmptyInterfaceCodec(opts ...*bsonoptions.EmptyInterfaceCodecOptions) *EmptyInterfaceCodec { + interfaceOpt := bsonoptions.MergeEmptyInterfaceCodecOptions(opts...) + + codec := EmptyInterfaceCodec{} + if interfaceOpt.DecodeBinaryAsSlice != nil { + codec.DecodeBinaryAsSlice = *interfaceOpt.DecodeBinaryAsSlice + } + return &codec +} + +// EncodeValue is the ValueEncoderFunc for interface{}. +func (eic EmptyInterfaceCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { + if !val.IsValid() || val.Type() != tEmpty { + return ValueEncoderError{Name: "EmptyInterfaceEncodeValue", Types: []reflect.Type{tEmpty}, Received: val} + } + + if val.IsNil() { + return vw.WriteNull() + } + encoder, err := ec.LookupEncoder(val.Elem().Type()) + if err != nil { + return err + } + + return encoder.EncodeValue(ec, vw, val.Elem()) +} + +func (eic EmptyInterfaceCodec) getEmptyInterfaceDecodeType(dc DecodeContext, valueType bsontype.Type) (reflect.Type, error) { + isDocument := valueType == bsontype.Type(0) || valueType == bsontype.EmbeddedDocument + if isDocument && dc.Ancestor != nil { + // Using ancestor information rather than looking up the type map entry forces consistent decoding. + // If we're decoding into a bson.D, subdocuments should also be decoded as bson.D, even if a type map entry + // has been registered. + return dc.Ancestor, nil + } + + rtype, err := dc.LookupTypeMapEntry(valueType) + if err == nil { + return rtype, nil + } + + if isDocument { + // For documents, fallback to looking up a type map entry for bsontype.Type(0) or bsontype.EmbeddedDocument, + // depending on the original valueType. + var lookupType bsontype.Type + switch valueType { + case bsontype.Type(0): + lookupType = bsontype.EmbeddedDocument + case bsontype.EmbeddedDocument: + lookupType = bsontype.Type(0) + } + + rtype, err = dc.LookupTypeMapEntry(lookupType) + if err == nil { + return rtype, nil + } + } + + return nil, err +} + +// DecodeValue is the ValueDecoderFunc for interface{}. +func (eic EmptyInterfaceCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if !val.CanSet() || val.Type() != tEmpty { + return ValueDecoderError{Name: "EmptyInterfaceDecodeValue", Types: []reflect.Type{tEmpty}, Received: val} + } + + rtype, err := eic.getEmptyInterfaceDecodeType(dc, vr.Type()) + if err != nil { + switch vr.Type() { + case bsontype.Null: + val.Set(reflect.Zero(val.Type())) + return vr.ReadNull() + default: + return err + } + } + + decoder, err := dc.LookupDecoder(rtype) + if err != nil { + return err + } + + elem := reflect.New(rtype).Elem() + err = decoder.DecodeValue(dc, vr, elem) + if err != nil { + return err + } + if eic.DecodeBinaryAsSlice && rtype == tBinary { + binElem := elem.Interface().(primitive.Binary) + if binElem.Subtype == bsontype.BinaryGeneric || binElem.Subtype == bsontype.BinaryBinaryOld { + elem = reflect.ValueOf(binElem.Data) + } + } + + val.Set(elem) + return nil +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/map_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/map_codec.go new file mode 100644 index 0000000000..85ae9c6a19 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/map_codec.go @@ -0,0 +1,206 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsoncodec + +import ( + "fmt" + "reflect" + "strconv" + + "go.mongodb.org/mongo-driver/bson/bsonoptions" + "go.mongodb.org/mongo-driver/bson/bsonrw" + "go.mongodb.org/mongo-driver/bson/bsontype" +) + +var defaultMapCodec = NewMapCodec() + +// MapCodec is the Codec used for map values. +type MapCodec struct { + DecodeZerosMap bool + EncodeNilAsEmpty bool +} + +var _ ValueCodec = &MapCodec{} + +// NewMapCodec returns a MapCodec with options opts. +func NewMapCodec(opts ...*bsonoptions.MapCodecOptions) *MapCodec { + mapOpt := bsonoptions.MergeMapCodecOptions(opts...) + + codec := MapCodec{} + if mapOpt.DecodeZerosMap != nil { + codec.DecodeZerosMap = *mapOpt.DecodeZerosMap + } + if mapOpt.EncodeNilAsEmpty != nil { + codec.EncodeNilAsEmpty = *mapOpt.EncodeNilAsEmpty + } + return &codec +} + +// EncodeValue is the ValueEncoder for map[*]* types. +func (mc *MapCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { + if !val.IsValid() || val.Kind() != reflect.Map { + return ValueEncoderError{Name: "MapEncodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val} + } + + if val.IsNil() && !mc.EncodeNilAsEmpty { + // If we have a nil map but we can't WriteNull, that means we're probably trying to encode + // to a TopLevel document. We can't currently tell if this is what actually happened, but if + // there's a deeper underlying problem, the error will also be returned from WriteDocument, + // so just continue. The operations on a map reflection value are valid, so we can call + // MapKeys within mapEncodeValue without a problem. + err := vw.WriteNull() + if err == nil { + return nil + } + } + + dw, err := vw.WriteDocument() + if err != nil { + return err + } + + return mc.mapEncodeValue(ec, dw, val, nil) +} + +// mapEncodeValue handles encoding of the values of a map. The collisionFn returns +// true if the provided key exists, this is mainly used for inline maps in the +// struct codec. +func (mc *MapCodec) mapEncodeValue(ec EncodeContext, dw bsonrw.DocumentWriter, val reflect.Value, collisionFn func(string) bool) error { + + elemType := val.Type().Elem() + encoder, err := ec.LookupEncoder(elemType) + if err != nil && elemType.Kind() != reflect.Interface { + return err + } + + keys := val.MapKeys() + for _, key := range keys { + keyStr := fmt.Sprint(key) + if collisionFn != nil && collisionFn(keyStr) { + return fmt.Errorf("Key %s of inlined map conflicts with a struct field name", key) + } + + currEncoder, currVal, lookupErr := defaultValueEncoders.lookupElementEncoder(ec, encoder, val.MapIndex(key)) + if lookupErr != nil && lookupErr != errInvalidValue { + return lookupErr + } + + vw, err := dw.WriteDocumentElement(keyStr) + if err != nil { + return err + } + + if lookupErr == errInvalidValue { + err = vw.WriteNull() + if err != nil { + return err + } + continue + } + + if enc, ok := currEncoder.(ValueEncoder); ok { + err = enc.EncodeValue(ec, vw, currVal) + if err != nil { + return err + } + continue + } + err = encoder.EncodeValue(ec, vw, currVal) + if err != nil { + return err + } + } + + return dw.WriteDocumentEnd() +} + +// DecodeValue is the ValueDecoder for map[string/decimal]* types. +func (mc *MapCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if val.Kind() != reflect.Map || (!val.CanSet() && val.IsNil()) { + return ValueDecoderError{Name: "MapDecodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val} + } + + switch vrType := vr.Type(); vrType { + case bsontype.Type(0), bsontype.EmbeddedDocument: + case bsontype.Null: + val.Set(reflect.Zero(val.Type())) + return vr.ReadNull() + default: + return fmt.Errorf("cannot decode %v into a %s", vrType, val.Type()) + } + + dr, err := vr.ReadDocument() + if err != nil { + return err + } + + if val.IsNil() { + val.Set(reflect.MakeMap(val.Type())) + } + + if val.Len() > 0 && mc.DecodeZerosMap { + clearMap(val) + } + + eType := val.Type().Elem() + decoder, err := dc.LookupDecoder(eType) + if err != nil { + return err + } + + if eType == tEmpty { + dc.Ancestor = val.Type() + } + + keyType := val.Type().Key() + keyKind := keyType.Kind() + + for { + key, vr, err := dr.ReadElement() + if err == bsonrw.ErrEOD { + break + } + if err != nil { + return err + } + + k := reflect.ValueOf(key) + if keyType != tString { + switch keyKind { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, + reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, + reflect.Float32, reflect.Float64: + parsed, err := strconv.ParseFloat(k.String(), 64) + if err != nil { + return fmt.Errorf("Map key is defined to be a decimal type (%v) but got error %v", keyKind, err) + } + k = reflect.ValueOf(parsed) + case reflect.String: // if keyType wraps string + default: + return fmt.Errorf("BSON map must have string or decimal keys. Got:%v", val.Type()) + } + + k = k.Convert(keyType) + } + + elem := reflect.New(eType).Elem() + err = decoder.DecodeValue(dc, vr, elem) + if err != nil { + return err + } + + val.SetMapIndex(k, elem) + } + return nil +} + +func clearMap(m reflect.Value) { + var none reflect.Value + for _, k := range m.MapKeys() { + m.SetMapIndex(k, none) + } +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go index 42e362b6ad..02b63bbe46 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go @@ -8,6 +8,7 @@ package bsoncodec import ( "errors" + "fmt" "reflect" "sync" @@ -115,15 +116,79 @@ func buildDefaultRegistry() *Registry { // RegisterCodec will register the provided ValueCodec for the provided type. func (rb *RegistryBuilder) RegisterCodec(t reflect.Type, codec ValueCodec) *RegistryBuilder { - rb.RegisterEncoder(t, codec) - rb.RegisterDecoder(t, codec) + rb.RegisterTypeEncoder(t, codec) + rb.RegisterTypeDecoder(t, codec) return rb } -// RegisterEncoder will register the provided ValueEncoder to the provided type. +// RegisterTypeEncoder will register the provided ValueEncoder for the provided type. // -// The type registered will be used directly, so an encoder can be registered for a type and a -// different encoder can be registered for a pointer to that type. +// The type will be used directly, so an encoder can be registered for a type and a different encoder can be registered +// for a pointer to that type. +// +// If the given type is an interface, the encoder will be called when marshalling a type that is that interface. It +// will not be called when marshalling a non-interface type that implements the interface. +func (rb *RegistryBuilder) RegisterTypeEncoder(t reflect.Type, enc ValueEncoder) *RegistryBuilder { + rb.typeEncoders[t] = enc + return rb +} + +// RegisterHookEncoder will register an encoder for the provided interface type t. This encoder will be called when +// marshalling a type if the type implements t or a pointer to the type implements t. If the provided type is not +// an interface (i.e. t.Kind() != reflect.Interface), this method will panic. +func (rb *RegistryBuilder) RegisterHookEncoder(t reflect.Type, enc ValueEncoder) *RegistryBuilder { + if t.Kind() != reflect.Interface { + panicStr := fmt.Sprintf("RegisterHookEncoder expects a type with kind reflect.Interface, "+ + "got type %s with kind %s", t, t.Kind()) + panic(panicStr) + } + + for idx, encoder := range rb.interfaceEncoders { + if encoder.i == t { + rb.interfaceEncoders[idx].ve = enc + return rb + } + } + + rb.interfaceEncoders = append(rb.interfaceEncoders, interfaceValueEncoder{i: t, ve: enc}) + return rb +} + +// RegisterTypeDecoder will register the provided ValueDecoder for the provided type. +// +// The type will be used directly, so a decoder can be registered for a type and a different decoder can be registered +// for a pointer to that type. +// +// If the given type is an interface, the decoder will be called when unmarshalling into a type that is that interface. +// It will not be called when unmarshalling into a non-interface type that implements the interface. +func (rb *RegistryBuilder) RegisterTypeDecoder(t reflect.Type, dec ValueDecoder) *RegistryBuilder { + rb.typeDecoders[t] = dec + return rb +} + +// RegisterHookDecoder will register an decoder for the provided interface type t. This decoder will be called when +// unmarshalling into a type if the type implements t or a pointer to the type implements t. If the provided type is not +// an interface (i.e. t.Kind() != reflect.Interface), this method will panic. +func (rb *RegistryBuilder) RegisterHookDecoder(t reflect.Type, dec ValueDecoder) *RegistryBuilder { + if t.Kind() != reflect.Interface { + panicStr := fmt.Sprintf("RegisterHookDecoder expects a type with kind reflect.Interface, "+ + "got type %s with kind %s", t, t.Kind()) + panic(panicStr) + } + + for idx, decoder := range rb.interfaceDecoders { + if decoder.i == t { + rb.interfaceDecoders[idx].vd = dec + return rb + } + } + + rb.interfaceDecoders = append(rb.interfaceDecoders, interfaceValueDecoder{i: t, vd: dec}) + return rb +} + +// RegisterEncoder has been deprecated and will be removed in a future major version release. Use RegisterTypeEncoder +// or RegisterHookEncoder instead. func (rb *RegistryBuilder) RegisterEncoder(t reflect.Type, enc ValueEncoder) *RegistryBuilder { if t == tEmpty { rb.typeEncoders[t] = enc @@ -145,10 +210,8 @@ func (rb *RegistryBuilder) RegisterEncoder(t reflect.Type, enc ValueEncoder) *Re return rb } -// RegisterDecoder will register the provided ValueDecoder to the provided type. -// -// The type registered will be used directly, so a decoder can be registered for a type and a -// different decoder can be registered for a pointer to that type. +// RegisterDecoder has been deprecated and will be removed in a future major version release. Use RegisterTypeDecoder +// or RegisterHookDecoder instead. func (rb *RegistryBuilder) RegisterDecoder(t reflect.Type, dec ValueDecoder) *RegistryBuilder { if t == nil { rb.typeDecoders[nil] = dec @@ -192,11 +255,10 @@ func (rb *RegistryBuilder) RegisterDefaultDecoder(kind reflect.Kind, dec ValueDe // mapping is decoding situations where an empty interface is used and a default type needs to be // created and decoded into. // -// NOTE: It is unlikely that registering a type for BSON Embedded Document is actually desired. By -// registering a type map entry for BSON Embedded Document the type registered will be used in any -// case where a BSON Embedded Document will be decoded into an empty interface. For example, if you -// register primitive.M, the EmptyInterface decoder will always use primitive.M, even if an ancestor -// was a primitive.D. +// By default, BSON documents will decode into interface{} values as bson.D. To change the default type for BSON +// documents, a type map entry for bsontype.EmbeddedDocument should be registered. For example, to force BSON documents +// to decode to bson.Raw, use the following code: +// rb.RegisterTypeMapEntry(bsontype.EmbeddedDocument, reflect.TypeOf(bson.Raw{})) func (rb *RegistryBuilder) RegisterTypeMapEntry(bt bsontype.Type, rt reflect.Type) *RegistryBuilder { rb.typeMap[bt] = rt return rb @@ -240,11 +302,17 @@ func (rb *RegistryBuilder) Build() *Registry { return registry } -// LookupEncoder will inspect the registry for an encoder that satisfies the -// type provided. An encoder registered for a specific type will take -// precedence over an encoder registered for an interface the type satisfies, -// which takes precedence over an encoder for the reflect.Kind of the value. If -// no encoder can be found, an error is returned. +// LookupEncoder inspects the registry for an encoder for the given type. The lookup precendence works as follows: +// +// 1. An encoder registered for the exact type. If the given type represents an interface, an encoder registered using +// RegisterTypeEncoder for the interface will be selected. +// +// 2. An encoder registered using RegisterHookEncoder for an interface implemented by the type or by a pointer to the +// type. +// +// 3. An encoder registered for the reflect.Kind of the value. +// +// If no encoder is found, an error of type ErrNoEncoder is returned. func (r *Registry) LookupEncoder(t reflect.Type) (ValueEncoder, error) { encodererr := ErrNoEncoder{Type: t} r.mu.RLock() @@ -257,7 +325,7 @@ func (r *Registry) LookupEncoder(t reflect.Type) (ValueEncoder, error) { return enc, nil } - enc, found = r.lookupInterfaceEncoder(t) + enc, found = r.lookupInterfaceEncoder(t, true) if found { r.mu.Lock() r.typeEncoders[t] = enc @@ -291,25 +359,38 @@ func (r *Registry) lookupTypeEncoder(t reflect.Type) (ValueEncoder, bool) { return enc, found } -func (r *Registry) lookupInterfaceEncoder(t reflect.Type) (ValueEncoder, bool) { +func (r *Registry) lookupInterfaceEncoder(t reflect.Type, allowAddr bool) (ValueEncoder, bool) { if t == nil { return nil, false } for _, ienc := range r.interfaceEncoders { - if !t.Implements(ienc.i) { - continue + if t.Implements(ienc.i) { + return ienc.ve, true + } + if allowAddr && t.Kind() != reflect.Ptr && reflect.PtrTo(t).Implements(ienc.i) { + // if *t implements an interface, this will catch if t implements an interface further ahead + // in interfaceEncoders + defaultEnc, found := r.lookupInterfaceEncoder(t, false) + if !found { + defaultEnc, _ = r.kindEncoders[t.Kind()] + } + return newCondAddrEncoder(ienc.ve, defaultEnc), true } - - return ienc.ve, true } return nil, false } -// LookupDecoder will inspect the registry for a decoder that satisfies the -// type provided. A decoder registered for a specific type will take -// precedence over a decoder registered for an interface the type satisfies, -// which takes precedence over a decoder for the reflect.Kind of the value. If -// no decoder can be found, an error is returned. +// LookupDecoder inspects the registry for an decoder for the given type. The lookup precendence works as follows: +// +// 1. A decoder registered for the exact type. If the given type represents an interface, a decoder registered using +// RegisterTypeDecoder for the interface will be selected. +// +// 2. A decoder registered using RegisterHookDecoder for an interface implemented by the type or by a pointer to the +// type. +// +// 3. A decoder registered for the reflect.Kind of the value. +// +// If no decoder is found, an error of type ErrNoDecoder is returned. func (r *Registry) LookupDecoder(t reflect.Type) (ValueDecoder, error) { if t == nil { return nil, ErrNilType @@ -325,7 +406,7 @@ func (r *Registry) LookupDecoder(t reflect.Type) (ValueDecoder, error) { return dec, nil } - dec, found = r.lookupInterfaceDecoder(t) + dec, found = r.lookupInterfaceDecoder(t, true) if found { r.mu.Lock() r.typeDecoders[t] = dec @@ -352,13 +433,20 @@ func (r *Registry) lookupTypeDecoder(t reflect.Type) (ValueDecoder, bool) { return dec, found } -func (r *Registry) lookupInterfaceDecoder(t reflect.Type) (ValueDecoder, bool) { +func (r *Registry) lookupInterfaceDecoder(t reflect.Type, allowAddr bool) (ValueDecoder, bool) { for _, idec := range r.interfaceDecoders { - if !t.Implements(idec.i) && !reflect.PtrTo(t).Implements(idec.i) { - continue + if t.Implements(idec.i) { + return idec.vd, true + } + if allowAddr && t.Kind() != reflect.Ptr && reflect.PtrTo(t).Implements(idec.i) { + // if *t implements an interface, this will catch if t implements an interface further ahead + // in interfaceDecoders + defaultDec, found := r.lookupInterfaceDecoder(t, false) + if !found { + defaultDec, _ = r.kindDecoders[t.Kind()] + } + return newCondAddrDecoder(idec.vd, defaultDec), true } - - return idec.vd, true } return nil, false } diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/slice_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/slice_codec.go new file mode 100644 index 0000000000..f0282eb23b --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/slice_codec.go @@ -0,0 +1,196 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsoncodec + +import ( + "fmt" + "reflect" + + "go.mongodb.org/mongo-driver/bson/bsonoptions" + "go.mongodb.org/mongo-driver/bson/bsonrw" + "go.mongodb.org/mongo-driver/bson/bsontype" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +var defaultSliceCodec = NewSliceCodec() + +// SliceCodec is the Codec used for slice values. +type SliceCodec struct { + EncodeNilAsEmpty bool +} + +var _ ValueCodec = &MapCodec{} + +// NewSliceCodec returns a MapCodec with options opts. +func NewSliceCodec(opts ...*bsonoptions.SliceCodecOptions) *SliceCodec { + sliceOpt := bsonoptions.MergeSliceCodecOptions(opts...) + + codec := SliceCodec{} + if sliceOpt.EncodeNilAsEmpty != nil { + codec.EncodeNilAsEmpty = *sliceOpt.EncodeNilAsEmpty + } + return &codec +} + +// EncodeValue is the ValueEncoder for slice types. +func (sc SliceCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { + if !val.IsValid() || val.Kind() != reflect.Slice { + return ValueEncoderError{Name: "SliceEncodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val} + } + + if val.IsNil() && !sc.EncodeNilAsEmpty { + return vw.WriteNull() + } + + // If we have a []byte we want to treat it as a binary instead of as an array. + if val.Type().Elem() == tByte { + var byteSlice []byte + for idx := 0; idx < val.Len(); idx++ { + byteSlice = append(byteSlice, val.Index(idx).Interface().(byte)) + } + return vw.WriteBinary(byteSlice) + } + + // If we have a []primitive.E we want to treat it as a document instead of as an array. + if val.Type().ConvertibleTo(tD) { + d := val.Convert(tD).Interface().(primitive.D) + + dw, err := vw.WriteDocument() + if err != nil { + return err + } + + for _, e := range d { + err = encodeElement(ec, dw, e) + if err != nil { + return err + } + } + + return dw.WriteDocumentEnd() + } + + aw, err := vw.WriteArray() + if err != nil { + return err + } + + elemType := val.Type().Elem() + encoder, err := ec.LookupEncoder(elemType) + if err != nil && elemType.Kind() != reflect.Interface { + return err + } + + for idx := 0; idx < val.Len(); idx++ { + currEncoder, currVal, lookupErr := defaultValueEncoders.lookupElementEncoder(ec, encoder, val.Index(idx)) + if lookupErr != nil && lookupErr != errInvalidValue { + return lookupErr + } + + vw, err := aw.WriteArrayElement() + if err != nil { + return err + } + + if lookupErr == errInvalidValue { + err = vw.WriteNull() + if err != nil { + return err + } + continue + } + + err = currEncoder.EncodeValue(ec, vw, currVal) + if err != nil { + return err + } + } + return aw.WriteArrayEnd() +} + +// DecodeValue is the ValueDecoder for slice types. +func (sc *SliceCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if !val.CanSet() || val.Kind() != reflect.Slice { + return ValueDecoderError{Name: "SliceDecodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val} + } + + switch vrType := vr.Type(); vrType { + case bsontype.Array: + case bsontype.Null: + val.Set(reflect.Zero(val.Type())) + return vr.ReadNull() + case bsontype.Type(0), bsontype.EmbeddedDocument: + if val.Type().Elem() != tE { + return fmt.Errorf("cannot decode document into %s", val.Type()) + } + case bsontype.Binary: + if val.Type().Elem() != tByte { + return fmt.Errorf("SliceDecodeValue can only decode a binary into a byte array, got %v", vrType) + } + data, subtype, err := vr.ReadBinary() + if err != nil { + return err + } + if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld { + return fmt.Errorf("SliceDecodeValue can only be used to decode subtype 0x00 or 0x02 for %s, got %v", bsontype.Binary, subtype) + } + + if val.IsNil() { + val.Set(reflect.MakeSlice(val.Type(), 0, len(data))) + } + + val.SetLen(0) + for _, elem := range data { + val.Set(reflect.Append(val, reflect.ValueOf(elem))) + } + return nil + case bsontype.String: + if val.Type().Elem() != tByte { + return fmt.Errorf("SliceDecodeValue can only decode a string into a byte array, got %v", vrType) + } + str, err := vr.ReadString() + if err != nil { + return err + } + byteStr := []byte(str) + + if val.IsNil() { + val.Set(reflect.MakeSlice(val.Type(), 0, len(byteStr))) + } + + val.SetLen(0) + for _, elem := range byteStr { + val.Set(reflect.Append(val, reflect.ValueOf(elem))) + } + return nil + default: + return fmt.Errorf("cannot decode %v into a slice", vrType) + } + + var elemsFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) ([]reflect.Value, error) + switch val.Type().Elem() { + case tE: + dc.Ancestor = val.Type() + elemsFunc = defaultValueDecoders.decodeD + default: + elemsFunc = defaultValueDecoders.decodeDefault + } + + elems, err := elemsFunc(dc, vr, val) + if err != nil { + return err + } + + if val.IsNil() { + val.Set(reflect.MakeSlice(val.Type(), 0, len(elems))) + } + + val.SetLen(0) + val.Set(reflect.Append(val, elems...)) + + return nil +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/string_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/string_codec.go new file mode 100644 index 0000000000..c672cf5a68 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/string_codec.go @@ -0,0 +1,94 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsoncodec + +import ( + "fmt" + "reflect" + + "go.mongodb.org/mongo-driver/bson/bsonoptions" + "go.mongodb.org/mongo-driver/bson/bsonrw" + "go.mongodb.org/mongo-driver/bson/bsontype" +) + +var defaultStringCodec = NewStringCodec() + +// StringCodec is the Codec used for struct values. +type StringCodec struct { + DecodeObjectIDAsHex bool +} + +var _ ValueCodec = &StringCodec{} + +// NewStringCodec returns a StringCodec with options opts. +func NewStringCodec(opts ...*bsonoptions.StringCodecOptions) *StringCodec { + stringOpt := bsonoptions.MergeStringCodecOptions(opts...) + return &StringCodec{*stringOpt.DecodeObjectIDAsHex} +} + +// EncodeValue is the ValueEncoder for string types. +func (sc *StringCodec) EncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { + if val.Kind() != reflect.String { + return ValueEncoderError{ + Name: "StringEncodeValue", + Kinds: []reflect.Kind{reflect.String}, + Received: val, + } + } + + return vw.WriteString(val.String()) +} + +// DecodeValue is the ValueDecoder for string types. +func (sc *StringCodec) DecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if !val.CanSet() || val.Kind() != reflect.String { + return ValueDecoderError{Name: "StringDecodeValue", Kinds: []reflect.Kind{reflect.String}, Received: val} + } + var str string + var err error + switch vr.Type() { + case bsontype.String: + str, err = vr.ReadString() + if err != nil { + return err + } + case bsontype.ObjectID: + oid, err := vr.ReadObjectID() + if err != nil { + return err + } + if sc.DecodeObjectIDAsHex { + str = oid.Hex() + } else { + byteArray := [12]byte(oid) + str = string(byteArray[:]) + } + case bsontype.Symbol: + str, err = vr.ReadSymbol() + if err != nil { + return err + } + case bsontype.Binary: + data, subtype, err := vr.ReadBinary() + if err != nil { + return err + } + if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld { + return fmt.Errorf("SliceDecodeValue can only be used to decode subtype 0x00 or 0x02 for %s, got %v", bsontype.Binary, subtype) + } + str = string(data) + case bsontype.Null: + if err = vr.ReadNull(); err != nil { + return err + } + default: + return fmt.Errorf("cannot decode %v into a string type", vr.Type()) + } + + val.SetString(str) + return nil +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go index 56eeff94b1..777cdfb695 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go @@ -12,7 +12,9 @@ import ( "reflect" "strings" "sync" + "time" + "go.mongodb.org/mongo-driver/bson/bsonoptions" "go.mongodb.org/mongo-driver/bson/bsonrw" "go.mongodb.org/mongo-driver/bson/bsontype" ) @@ -31,24 +33,45 @@ type Zeroer interface { // StructCodec is the Codec used for struct values. type StructCodec struct { - cache map[reflect.Type]*structDescription - l sync.RWMutex - parser StructTagParser + cache map[reflect.Type]*structDescription + l sync.RWMutex + parser StructTagParser + DecodeZeroStruct bool + DecodeDeepZeroInline bool + EncodeOmitDefaultStruct bool + AllowUnexportedFields bool } var _ ValueEncoder = &StructCodec{} var _ ValueDecoder = &StructCodec{} // NewStructCodec returns a StructCodec that uses p for struct tag parsing. -func NewStructCodec(p StructTagParser) (*StructCodec, error) { +func NewStructCodec(p StructTagParser, opts ...*bsonoptions.StructCodecOptions) (*StructCodec, error) { if p == nil { return nil, errors.New("a StructTagParser must be provided to NewStructCodec") } - return &StructCodec{ + structOpt := bsonoptions.MergeStructCodecOptions(opts...) + + codec := &StructCodec{ cache: make(map[reflect.Type]*structDescription), parser: p, - }, nil + } + + if structOpt.DecodeZeroStruct != nil { + codec.DecodeZeroStruct = *structOpt.DecodeZeroStruct + } + if structOpt.DecodeDeepZeroInline != nil { + codec.DecodeDeepZeroInline = *structOpt.DecodeDeepZeroInline + } + if structOpt.EncodeOmitDefaultStruct != nil { + codec.EncodeOmitDefaultStruct = *structOpt.EncodeOmitDefaultStruct + } + if structOpt.AllowUnexportedFields != nil { + codec.AllowUnexportedFields = *structOpt.AllowUnexportedFields + } + + return codec, nil } // EncodeValue handles encoding generic struct types. @@ -71,7 +94,31 @@ func (sc *StructCodec) EncodeValue(r EncodeContext, vw bsonrw.ValueWriter, val r if desc.inline == nil { rv = val.Field(desc.idx) } else { - rv = val.FieldByIndex(desc.inline) + rv, err = fieldByIndexErr(val, desc.inline) + if err != nil { + continue + } + } + + desc.encoder, rv, err = defaultValueEncoders.lookupElementEncoder(r, desc.encoder, rv) + + if err != nil && err != errInvalidValue { + return err + } + + if err == errInvalidValue { + if desc.omitEmpty { + continue + } + vw2, err := dw.WriteDocumentElement(desc.name) + if err != nil { + return err + } + err = vw2.WriteNull() + if err != nil { + return err + } + continue } if desc.encoder == nil { @@ -80,12 +127,17 @@ func (sc *StructCodec) EncodeValue(r EncodeContext, vw bsonrw.ValueWriter, val r encoder := desc.encoder - iszero := sc.isZero - if iz, ok := encoder.(CodecZeroer); ok { - iszero = iz.IsTypeZero + var isZero bool + rvInterface := rv.Interface() + if cz, ok := encoder.(CodecZeroer); ok { + isZero = cz.IsTypeZero(rvInterface) + } else if rv.Kind() == reflect.Interface { + // sc.isZero will not treat an interface rv as an interface, so we need to check for the zero interface separately. + isZero = rv.IsNil() + } else { + isZero = sc.isZero(rvInterface) } - - if desc.omitEmpty && iszero(rv.Interface()) { + if desc.omitEmpty && isZero { continue } @@ -108,7 +160,7 @@ func (sc *StructCodec) EncodeValue(r EncodeContext, vw bsonrw.ValueWriter, val r return exists } - return defaultValueEncoders.mapEncodeValue(r, dw, rv, collisionFn) + return defaultMapCodec.mapEncodeValue(r, dw, rv, collisionFn) } return dw.WriteDocumentEnd() @@ -122,10 +174,17 @@ func (sc *StructCodec) DecodeValue(r DecodeContext, vr bsonrw.ValueReader, val r return ValueDecoderError{Name: "StructCodec.DecodeValue", Kinds: []reflect.Kind{reflect.Struct}, Received: val} } - switch vr.Type() { + switch vrType := vr.Type(); vrType { case bsontype.Type(0), bsontype.EmbeddedDocument: + case bsontype.Null: + if err := vr.ReadNull(); err != nil { + return err + } + + val.Set(reflect.Zero(val.Type())) + return nil default: - return fmt.Errorf("cannot decode %v into a %s", vr.Type(), val.Type()) + return fmt.Errorf("cannot decode %v into a %s", vrType, val.Type()) } sd, err := sc.describeStruct(r.Registry, val.Type()) @@ -133,13 +192,17 @@ func (sc *StructCodec) DecodeValue(r DecodeContext, vr bsonrw.ValueReader, val r return err } + if sc.DecodeZeroStruct { + val.Set(reflect.Zero(val.Type())) + } + if sc.DecodeDeepZeroInline && sd.inline { + val.Set(deepZero(val.Type())) + } + var decoder ValueDecoder var inlineMap reflect.Value if sd.inlineMap >= 0 { inlineMap = val.Field(sd.inlineMap) - if inlineMap.IsNil() { - inlineMap.Set(reflect.MakeMap(inlineMap.Type())) - } decoder, err = r.LookupDecoder(inlineMap.Type().Elem()) if err != nil { return err @@ -179,7 +242,12 @@ func (sc *StructCodec) DecodeValue(r DecodeContext, vr bsonrw.ValueReader, val r continue } + if inlineMap.IsNil() { + inlineMap.Set(reflect.MakeMap(inlineMap.Type())) + } + elem := reflect.New(inlineMap.Type().Elem()).Elem() + r.Ancestor = inlineMap.Type() err = decoder.DecodeValue(r, vr, elem) if err != nil { return err @@ -192,7 +260,10 @@ func (sc *StructCodec) DecodeValue(r DecodeContext, vr bsonrw.ValueReader, val r if fd.inline == nil { field = val.Field(fd.idx) } else { - field = val.FieldByIndex(fd.inline) + field, err = getInlineField(val, fd.inline) + if err != nil { + return err + } } if !field.CanSet() { // Being settable is a super set of being addressable. @@ -249,6 +320,23 @@ func (sc *StructCodec) isZero(i interface{}) bool { return v.Float() == 0 case reflect.Interface, reflect.Ptr: return v.IsNil() + case reflect.Struct: + if sc.EncodeOmitDefaultStruct { + vt := v.Type() + if vt == tTime { + return v.Interface().(time.Time).IsZero() + } + for i := 0; i < v.NumField(); i++ { + if vt.Field(i).PkgPath != "" && !vt.Field(i).Anonymous { + continue // Private field + } + fld := v.Field(i) + if !sc.isZero(fld.Interface()) { + return false + } + } + return true + } } return false @@ -258,6 +346,7 @@ type structDescription struct { fm map[string]fieldDescription fl []fieldDescription inlineMap int + inline bool } type fieldDescription struct { @@ -290,16 +379,17 @@ func (sc *StructCodec) describeStruct(r *Registry, t reflect.Type) (*structDescr for i := 0; i < numFields; i++ { sf := t.Field(i) - if sf.PkgPath != "" { - // unexported, ignore + if sf.PkgPath != "" && (!sc.AllowUnexportedFields || !sf.Anonymous) { + // field is private or unexported fields aren't allowed, ignore continue } - encoder, err := r.LookupEncoder(sf.Type) + sfType := sf.Type + encoder, err := r.LookupEncoder(sfType) if err != nil { encoder = nil } - decoder, err := r.LookupDecoder(sf.Type) + decoder, err := r.LookupDecoder(sfType) if err != nil { decoder = nil } @@ -319,17 +409,24 @@ func (sc *StructCodec) describeStruct(r *Registry, t reflect.Type) (*structDescr description.truncate = stags.Truncate if stags.Inline { - switch sf.Type.Kind() { + sd.inline = true + switch sfType.Kind() { case reflect.Map: if sd.inlineMap >= 0 { return nil, errors.New("(struct " + t.String() + ") multiple inline maps") } - if sf.Type.Key() != tString { + if sfType.Key() != tString { return nil, errors.New("(struct " + t.String() + ") inline map must have a string keys") } sd.inlineMap = description.idx + case reflect.Ptr: + sfType = sfType.Elem() + if sfType.Kind() != reflect.Struct { + return nil, fmt.Errorf("(struct %s) inline fields must be a struct, a struct pointer, or a map", t.String()) + } + fallthrough case reflect.Struct: - inlinesf, err := sc.describeStruct(r, sf.Type) + inlinesf, err := sc.describeStruct(r, sfType) if err != nil { return nil, err } @@ -346,7 +443,7 @@ func (sc *StructCodec) describeStruct(r *Registry, t reflect.Type) (*structDescr sd.fl = append(sd.fl, fd) } default: - return nil, fmt.Errorf("(struct %s) inline fields must be either a struct or a map", t.String()) + return nil, fmt.Errorf("(struct %s) inline fields must be a struct, a struct pointer, or a map", t.String()) } continue } @@ -365,3 +462,75 @@ func (sc *StructCodec) describeStruct(r *Registry, t reflect.Type) (*structDescr return sd, nil } + +func fieldByIndexErr(v reflect.Value, index []int) (result reflect.Value, err error) { + defer func() { + if recovered := recover(); recovered != nil { + switch r := recovered.(type) { + case string: + err = fmt.Errorf("%s", r) + case error: + err = r + } + } + }() + + result = v.FieldByIndex(index) + return +} + +func getInlineField(val reflect.Value, index []int) (reflect.Value, error) { + field, err := fieldByIndexErr(val, index) + if err == nil { + return field, nil + } + + // if parent of this element doesn't exist, fix its parent + inlineParent := index[:len(index)-1] + var fParent reflect.Value + if fParent, err = fieldByIndexErr(val, inlineParent); err != nil { + fParent, err = getInlineField(val, inlineParent) + if err != nil { + return fParent, err + } + } + fParent.Set(reflect.New(fParent.Type().Elem())) + + return fieldByIndexErr(val, index) +} + +// DeepZero returns recursive zero object +func deepZero(st reflect.Type) (result reflect.Value) { + result = reflect.Indirect(reflect.New(st)) + + if result.Kind() == reflect.Struct { + for i := 0; i < result.NumField(); i++ { + if f := result.Field(i); f.Kind() == reflect.Ptr { + if f.CanInterface() { + if ft := reflect.TypeOf(f.Interface()); ft.Elem().Kind() == reflect.Struct { + result.Field(i).Set(recursivePointerTo(deepZero(ft.Elem()))) + } + } + } + } + } + + return +} + +// recursivePointerTo calls reflect.New(v.Type) but recursively for its fields inside +func recursivePointerTo(v reflect.Value) reflect.Value { + v = reflect.Indirect(v) + result := reflect.New(v.Type()) + if v.Kind() == reflect.Struct { + for i := 0; i < v.NumField(); i++ { + if f := v.Field(i); f.Kind() == reflect.Ptr { + if f.Elem().Kind() == reflect.Struct { + result.Elem().Field(i).Set(recursivePointerTo(f)) + } + } + } + } + + return result +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/time_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/time_codec.go new file mode 100644 index 0000000000..6f1b724d19 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/time_codec.go @@ -0,0 +1,101 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsoncodec + +import ( + "fmt" + "reflect" + "time" + + "go.mongodb.org/mongo-driver/bson/bsonoptions" + "go.mongodb.org/mongo-driver/bson/bsonrw" + "go.mongodb.org/mongo-driver/bson/bsontype" +) + +const ( + timeFormatString = "2006-01-02T15:04:05.999Z07:00" +) + +var defaultTimeCodec = NewTimeCodec() + +// TimeCodec is the Codec used for time.Time values. +type TimeCodec struct { + UseLocalTimeZone bool +} + +var _ ValueCodec = &TimeCodec{} + +// NewTimeCodec returns a TimeCodec with options opts. +func NewTimeCodec(opts ...*bsonoptions.TimeCodecOptions) *TimeCodec { + timeOpt := bsonoptions.MergeTimeCodecOptions(opts...) + + codec := TimeCodec{} + if timeOpt.UseLocalTimeZone != nil { + codec.UseLocalTimeZone = *timeOpt.UseLocalTimeZone + } + return &codec +} + +// DecodeValue is the ValueDecoderFunc for time.Time. +func (tc *TimeCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if !val.CanSet() || val.Type() != tTime { + return ValueDecoderError{Name: "TimeDecodeValue", Types: []reflect.Type{tTime}, Received: val} + } + + var timeVal time.Time + switch vrType := vr.Type(); vrType { + case bsontype.DateTime: + dt, err := vr.ReadDateTime() + if err != nil { + return err + } + timeVal = time.Unix(dt/1000, dt%1000*1000000) + case bsontype.String: + // assume strings are in the isoTimeFormat + timeStr, err := vr.ReadString() + if err != nil { + return err + } + timeVal, err = time.Parse(timeFormatString, timeStr) + if err != nil { + return err + } + case bsontype.Int64: + i64, err := vr.ReadInt64() + if err != nil { + return err + } + timeVal = time.Unix(i64/1000, i64%1000*1000000) + case bsontype.Timestamp: + t, _, err := vr.ReadTimestamp() + if err != nil { + return err + } + timeVal = time.Unix(int64(t), 0) + case bsontype.Null: + if err := vr.ReadNull(); err != nil { + return err + } + default: + return fmt.Errorf("cannot decode %v into a time.Time", vrType) + } + + if !tc.UseLocalTimeZone { + timeVal = timeVal.UTC() + } + val.Set(reflect.ValueOf(timeVal)) + return nil +} + +// EncodeValue is the ValueEncoderFunc for time.TIme. +func (tc *TimeCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { + if !val.IsValid() || val.Type() != tTime { + return ValueEncoderError{Name: "TimeEncodeValue", Types: []reflect.Type{tTime}, Received: val} + } + tt := val.Interface().(time.Time) + return vw.WriteDateTime(tt.Unix()*1000 + int64(tt.Nanosecond()/1e6)) +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go index 77264876aa..bbb6bb9cea 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go @@ -74,6 +74,7 @@ var tDecimal = reflect.TypeOf(primitive.Decimal128{}) var tMinKey = reflect.TypeOf(primitive.MinKey{}) var tMaxKey = reflect.TypeOf(primitive.MaxKey{}) var tD = reflect.TypeOf(primitive.D{}) +var tM = reflect.TypeOf(primitive.M{}) var tA = reflect.TypeOf(primitive.A{}) var tE = reflect.TypeOf(primitive.E{}) diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/uint_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/uint_codec.go new file mode 100644 index 0000000000..e0df058374 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/uint_codec.go @@ -0,0 +1,150 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsoncodec + +import ( + "errors" + "fmt" + "math" + "reflect" + + "go.mongodb.org/mongo-driver/bson/bsonoptions" + "go.mongodb.org/mongo-driver/bson/bsonrw" + "go.mongodb.org/mongo-driver/bson/bsontype" +) + +var defaultUIntCodec = NewUIntCodec() + +// UIntCodec is the Codec used for uint values. +type UIntCodec struct { + EncodeToMinSize bool +} + +var _ ValueCodec = &UIntCodec{} + +// NewUIntCodec returns a UIntCodec with options opts. +func NewUIntCodec(opts ...*bsonoptions.UIntCodecOptions) *UIntCodec { + uintOpt := bsonoptions.MergeUIntCodecOptions(opts...) + + codec := UIntCodec{} + if uintOpt.EncodeToMinSize != nil { + codec.EncodeToMinSize = *uintOpt.EncodeToMinSize + } + return &codec +} + +// EncodeValue is the ValueEncoder for uint types. +func (uic *UIntCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error { + switch val.Kind() { + case reflect.Uint8, reflect.Uint16: + return vw.WriteInt32(int32(val.Uint())) + case reflect.Uint, reflect.Uint32, reflect.Uint64: + u64 := val.Uint() + + // If ec.MinSize or if encodeToMinSize is true for a non-uint64 value we should write val as an int32 + useMinSize := ec.MinSize || (uic.EncodeToMinSize && val.Kind() != reflect.Uint64) + + if u64 <= math.MaxInt32 && useMinSize { + return vw.WriteInt32(int32(u64)) + } + if u64 > math.MaxInt64 { + return fmt.Errorf("%d overflows int64", u64) + } + return vw.WriteInt64(int64(u64)) + } + + return ValueEncoderError{ + Name: "UintEncodeValue", + Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint}, + Received: val, + } +} + +// DecodeValue is the ValueDecoder for uint types. +func (uic *UIntCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error { + if !val.CanSet() { + return ValueDecoderError{ + Name: "UintDecodeValue", + Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint}, + Received: val, + } + } + + var i64 int64 + var err error + switch vrType := vr.Type(); vrType { + case bsontype.Int32: + i32, err := vr.ReadInt32() + if err != nil { + return err + } + i64 = int64(i32) + case bsontype.Int64: + i64, err = vr.ReadInt64() + if err != nil { + return err + } + case bsontype.Double: + f64, err := vr.ReadDouble() + if err != nil { + return err + } + if !dc.Truncate && math.Floor(f64) != f64 { + return errors.New("UintDecodeValue can only truncate float64 to an integer type when truncation is enabled") + } + if f64 > float64(math.MaxInt64) { + return fmt.Errorf("%g overflows int64", f64) + } + i64 = int64(f64) + case bsontype.Boolean: + b, err := vr.ReadBoolean() + if err != nil { + return err + } + if b { + i64 = 1 + } + case bsontype.Null: + if err = vr.ReadNull(); err != nil { + return err + } + default: + return fmt.Errorf("cannot decode %v into an integer type", vrType) + } + + switch val.Kind() { + case reflect.Uint8: + if i64 < 0 || i64 > math.MaxUint8 { + return fmt.Errorf("%d overflows uint8", i64) + } + case reflect.Uint16: + if i64 < 0 || i64 > math.MaxUint16 { + return fmt.Errorf("%d overflows uint16", i64) + } + case reflect.Uint32: + if i64 < 0 || i64 > math.MaxUint32 { + return fmt.Errorf("%d overflows uint32", i64) + } + case reflect.Uint64: + if i64 < 0 { + return fmt.Errorf("%d overflows uint64", i64) + } + case reflect.Uint: + if i64 < 0 || int64(uint(i64)) != i64 { // Can we fit this inside of an uint + return fmt.Errorf("%d overflows uint", i64) + } + default: + return ValueDecoderError{ + Name: "UintDecodeValue", + Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint}, + Received: val, + } + } + + val.SetUint(uint64(i64)) + return nil +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/byte_slice_codec_options.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/byte_slice_codec_options.go new file mode 100644 index 0000000000..b1256a4dca --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/byte_slice_codec_options.go @@ -0,0 +1,38 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsonoptions + +// ByteSliceCodecOptions represents all possible options for byte slice encoding and decoding. +type ByteSliceCodecOptions struct { + EncodeNilAsEmpty *bool // Specifies if a nil byte slice should encode as an empty binary instead of null. Defaults to false. +} + +// ByteSliceCodec creates a new *ByteSliceCodecOptions +func ByteSliceCodec() *ByteSliceCodecOptions { + return &ByteSliceCodecOptions{} +} + +// SetEncodeNilAsEmpty specifies if a nil byte slice should encode as an empty binary instead of null. Defaults to false. +func (bs *ByteSliceCodecOptions) SetEncodeNilAsEmpty(b bool) *ByteSliceCodecOptions { + bs.EncodeNilAsEmpty = &b + return bs +} + +// MergeByteSliceCodecOptions combines the given *ByteSliceCodecOptions into a single *ByteSliceCodecOptions in a last one wins fashion. +func MergeByteSliceCodecOptions(opts ...*ByteSliceCodecOptions) *ByteSliceCodecOptions { + bs := ByteSliceCodec() + for _, opt := range opts { + if opt == nil { + continue + } + if opt.EncodeNilAsEmpty != nil { + bs.EncodeNilAsEmpty = opt.EncodeNilAsEmpty + } + } + + return bs +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/empty_interface_codec_options.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/empty_interface_codec_options.go new file mode 100644 index 0000000000..6caaa000e6 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/empty_interface_codec_options.go @@ -0,0 +1,38 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsonoptions + +// EmptyInterfaceCodecOptions represents all possible options for interface{} encoding and decoding. +type EmptyInterfaceCodecOptions struct { + DecodeBinaryAsSlice *bool // Specifies if Old and Generic type binarys should default to []slice instead of primitive.Binary. Defaults to false. +} + +// EmptyInterfaceCodec creates a new *EmptyInterfaceCodecOptions +func EmptyInterfaceCodec() *EmptyInterfaceCodecOptions { + return &EmptyInterfaceCodecOptions{} +} + +// SetDecodeBinaryAsSlice specifies if Old and Generic type binarys should default to []slice instead of primitive.Binary. Defaults to false. +func (e *EmptyInterfaceCodecOptions) SetDecodeBinaryAsSlice(b bool) *EmptyInterfaceCodecOptions { + e.DecodeBinaryAsSlice = &b + return e +} + +// MergeEmptyInterfaceCodecOptions combines the given *EmptyInterfaceCodecOptions into a single *EmptyInterfaceCodecOptions in a last one wins fashion. +func MergeEmptyInterfaceCodecOptions(opts ...*EmptyInterfaceCodecOptions) *EmptyInterfaceCodecOptions { + e := EmptyInterfaceCodec() + for _, opt := range opts { + if opt == nil { + continue + } + if opt.DecodeBinaryAsSlice != nil { + e.DecodeBinaryAsSlice = opt.DecodeBinaryAsSlice + } + } + + return e +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/map_codec_options.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/map_codec_options.go new file mode 100644 index 0000000000..1ac3e20088 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/map_codec_options.go @@ -0,0 +1,48 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsonoptions + +// MapCodecOptions represents all possible options for map encoding and decoding. +type MapCodecOptions struct { + DecodeZerosMap *bool // Specifies if the map should be zeroed before decoding into it. Defaults to false. + EncodeNilAsEmpty *bool // Specifies if a nil map should encode as an empty document instead of null. Defaults to false. +} + +// MapCodec creates a new *MapCodecOptions +func MapCodec() *MapCodecOptions { + return &MapCodecOptions{} +} + +// SetDecodeZerosMap specifies if the map should be zeroed before decoding into it. Defaults to false. +func (t *MapCodecOptions) SetDecodeZerosMap(b bool) *MapCodecOptions { + t.DecodeZerosMap = &b + return t +} + +// SetEncodeNilAsEmpty specifies if a nil map should encode as an empty document instead of null. Defaults to false. +func (t *MapCodecOptions) SetEncodeNilAsEmpty(b bool) *MapCodecOptions { + t.EncodeNilAsEmpty = &b + return t +} + +// MergeMapCodecOptions combines the given *MapCodecOptions into a single *MapCodecOptions in a last one wins fashion. +func MergeMapCodecOptions(opts ...*MapCodecOptions) *MapCodecOptions { + s := MapCodec() + for _, opt := range opts { + if opt == nil { + continue + } + if opt.DecodeZerosMap != nil { + s.DecodeZerosMap = opt.DecodeZerosMap + } + if opt.EncodeNilAsEmpty != nil { + s.EncodeNilAsEmpty = opt.EncodeNilAsEmpty + } + } + + return s +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/slice_codec_options.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/slice_codec_options.go new file mode 100644 index 0000000000..ef965e4b41 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/slice_codec_options.go @@ -0,0 +1,38 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsonoptions + +// SliceCodecOptions represents all possible options for slice encoding and decoding. +type SliceCodecOptions struct { + EncodeNilAsEmpty *bool // Specifies if a nil slice should encode as an empty array instead of null. Defaults to false. +} + +// SliceCodec creates a new *SliceCodecOptions +func SliceCodec() *SliceCodecOptions { + return &SliceCodecOptions{} +} + +// SetEncodeNilAsEmpty specifies if a nil slice should encode as an empty array instead of null. Defaults to false. +func (s *SliceCodecOptions) SetEncodeNilAsEmpty(b bool) *SliceCodecOptions { + s.EncodeNilAsEmpty = &b + return s +} + +// MergeSliceCodecOptions combines the given *SliceCodecOptions into a single *SliceCodecOptions in a last one wins fashion. +func MergeSliceCodecOptions(opts ...*SliceCodecOptions) *SliceCodecOptions { + s := SliceCodec() + for _, opt := range opts { + if opt == nil { + continue + } + if opt.EncodeNilAsEmpty != nil { + s.EncodeNilAsEmpty = opt.EncodeNilAsEmpty + } + } + + return s +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/string_codec_options.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/string_codec_options.go new file mode 100644 index 0000000000..65964f4207 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/string_codec_options.go @@ -0,0 +1,41 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsonoptions + +var defaultDecodeOIDAsHex = true + +// StringCodecOptions represents all possible options for string encoding and decoding. +type StringCodecOptions struct { + DecodeObjectIDAsHex *bool // Specifies if we should decode ObjectID as the hex value. Defaults to true. +} + +// StringCodec creates a new *StringCodecOptions +func StringCodec() *StringCodecOptions { + return &StringCodecOptions{} +} + +// SetDecodeObjectIDAsHex specifies if object IDs should be decoded as their hex representation. If false, a string made +// from the raw object ID bytes will be used. Defaults to true. +func (t *StringCodecOptions) SetDecodeObjectIDAsHex(b bool) *StringCodecOptions { + t.DecodeObjectIDAsHex = &b + return t +} + +// MergeStringCodecOptions combines the given *StringCodecOptions into a single *StringCodecOptions in a last one wins fashion. +func MergeStringCodecOptions(opts ...*StringCodecOptions) *StringCodecOptions { + s := &StringCodecOptions{&defaultDecodeOIDAsHex} + for _, opt := range opts { + if opt == nil { + continue + } + if opt.DecodeObjectIDAsHex != nil { + s.DecodeObjectIDAsHex = opt.DecodeObjectIDAsHex + } + } + + return s +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/struct_codec_options.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/struct_codec_options.go new file mode 100644 index 0000000000..ad32c7c382 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/struct_codec_options.go @@ -0,0 +1,70 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsonoptions + +// StructCodecOptions represents all possible options for struct encoding and decoding. +type StructCodecOptions struct { + DecodeZeroStruct *bool // Specifies if structs should be zeroed before decoding into them. Defaults to false. + DecodeDeepZeroInline *bool // Specifies if structs should be recursively zeroed when a inline value is decoded. Defaults to false. + EncodeOmitDefaultStruct *bool // Specifies if default structs should be considered empty by omitempty. Defaults to false. + AllowUnexportedFields *bool // Specifies if unexported fields should be marshaled/unmarshaled. Defaults to false. +} + +// StructCodec creates a new *StructCodecOptions +func StructCodec() *StructCodecOptions { + return &StructCodecOptions{} +} + +// SetDecodeZeroStruct specifies if structs should be zeroed before decoding into them. Defaults to false. +func (t *StructCodecOptions) SetDecodeZeroStruct(b bool) *StructCodecOptions { + t.DecodeZeroStruct = &b + return t +} + +// SetDecodeDeepZeroInline specifies if structs should be zeroed before decoding into them. Defaults to false. +func (t *StructCodecOptions) SetDecodeDeepZeroInline(b bool) *StructCodecOptions { + t.DecodeDeepZeroInline = &b + return t +} + +// SetEncodeOmitDefaultStruct specifies if default structs should be considered empty by omitempty. A default struct has all +// its values set to their default value. Defaults to false. +func (t *StructCodecOptions) SetEncodeOmitDefaultStruct(b bool) *StructCodecOptions { + t.EncodeOmitDefaultStruct = &b + return t +} + +// SetAllowUnexportedFields specifies if unexported fields should be marshaled/unmarshaled. Defaults to false. +func (t *StructCodecOptions) SetAllowUnexportedFields(b bool) *StructCodecOptions { + t.AllowUnexportedFields = &b + return t +} + +// MergeStructCodecOptions combines the given *StructCodecOptions into a single *StructCodecOptions in a last one wins fashion. +func MergeStructCodecOptions(opts ...*StructCodecOptions) *StructCodecOptions { + s := StructCodec() + for _, opt := range opts { + if opt == nil { + continue + } + + if opt.DecodeZeroStruct != nil { + s.DecodeZeroStruct = opt.DecodeZeroStruct + } + if opt.DecodeDeepZeroInline != nil { + s.DecodeDeepZeroInline = opt.DecodeDeepZeroInline + } + if opt.EncodeOmitDefaultStruct != nil { + s.EncodeOmitDefaultStruct = opt.EncodeOmitDefaultStruct + } + if opt.AllowUnexportedFields != nil { + s.AllowUnexportedFields = opt.AllowUnexportedFields + } + } + + return s +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/time_codec_options.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/time_codec_options.go new file mode 100644 index 0000000000..13496d1217 --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/time_codec_options.go @@ -0,0 +1,38 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsonoptions + +// TimeCodecOptions represents all possible options for time.Time encoding and decoding. +type TimeCodecOptions struct { + UseLocalTimeZone *bool // Specifies if we should decode into the local time zone. Defaults to false. +} + +// TimeCodec creates a new *TimeCodecOptions +func TimeCodec() *TimeCodecOptions { + return &TimeCodecOptions{} +} + +// SetUseLocalTimeZone specifies if we should decode into the local time zone. Defaults to false. +func (t *TimeCodecOptions) SetUseLocalTimeZone(b bool) *TimeCodecOptions { + t.UseLocalTimeZone = &b + return t +} + +// MergeTimeCodecOptions combines the given *TimeCodecOptions into a single *TimeCodecOptions in a last one wins fashion. +func MergeTimeCodecOptions(opts ...*TimeCodecOptions) *TimeCodecOptions { + t := TimeCodec() + for _, opt := range opts { + if opt == nil { + continue + } + if opt.UseLocalTimeZone != nil { + t.UseLocalTimeZone = opt.UseLocalTimeZone + } + } + + return t +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/uint_codec_options.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/uint_codec_options.go new file mode 100644 index 0000000000..e08b7f192e --- /dev/null +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonoptions/uint_codec_options.go @@ -0,0 +1,38 @@ +// Copyright (C) MongoDB, Inc. 2017-present. +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + +package bsonoptions + +// UIntCodecOptions represents all possible options for uint encoding and decoding. +type UIntCodecOptions struct { + EncodeToMinSize *bool // Specifies if all uints except uint64 should be decoded to minimum size bsontype. Defaults to false. +} + +// UIntCodec creates a new *UIntCodecOptions +func UIntCodec() *UIntCodecOptions { + return &UIntCodecOptions{} +} + +// SetEncodeToMinSize specifies if all uints except uint64 should be decoded to minimum size bsontype. Defaults to false. +func (u *UIntCodecOptions) SetEncodeToMinSize(b bool) *UIntCodecOptions { + u.EncodeToMinSize = &b + return u +} + +// MergeUIntCodecOptions combines the given *UIntCodecOptions into a single *UIntCodecOptions in a last one wins fashion. +func MergeUIntCodecOptions(opts ...*UIntCodecOptions) *UIntCodecOptions { + u := UIntCodec() + for _, opt := range opts { + if opt == nil { + continue + } + if opt.EncodeToMinSize != nil { + u.EncodeToMinSize = opt.EncodeToMinSize + } + } + + return u +} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_parser.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_parser.go index 9e223edf9d..3ff17c197d 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_parser.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_parser.go @@ -86,6 +86,7 @@ func newExtJSONParser(r io.Reader, canonical bool) *extJSONParser { func (ejp *extJSONParser) peekType() (bsontype.Type, error) { var t bsontype.Type var err error + initialState := ejp.s ejp.advanceState() switch ejp.s { @@ -113,12 +114,15 @@ func (ejp *extJSONParser) peekType() (bsontype.Type, error) { case jpsInvalidState: err = ejp.err case jpsSawKey: + if initialState == jpsStartState { + return bsontype.EmbeddedDocument, nil + } t = wrapperKeyBSONType(ejp.k) - if t == bsontype.JavaScript { + switch t { + case bsontype.JavaScript: // just saw $code, need to check for $scope at same level - _, err := ejp.readValue(bsontype.JavaScript) - + _, err = ejp.readValue(bsontype.JavaScript) if err != nil { break } @@ -127,6 +131,7 @@ func (ejp *extJSONParser) peekType() (bsontype.Type, error) { case jpsSawEndObject: // type is TypeJavaScript case jpsSawComma: ejp.advanceState() + if ejp.s == jpsSawKey && ejp.k == "$scope" { t = bsontype.CodeWithScope } else { @@ -137,6 +142,8 @@ func (ejp *extJSONParser) peekType() (bsontype.Type, error) { default: err = ErrInvalidJSON } + case bsontype.CodeWithScope: + err = errors.New("invalid extended JSON: code with $scope must contain $code before $scope") } } } diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_wrappers.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_wrappers.go index e6ca0e038a..7e9612c074 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_wrappers.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_wrappers.go @@ -180,7 +180,13 @@ func (ejv *extJSONValue) parseDBPointer() (ns string, oid primitive.ObjectID, er return ns, oid, nil } -const rfc3339Milli = "2006-01-02T15:04:05.999Z07:00" +const ( + rfc3339Milli = "2006-01-02T15:04:05.999Z07:00" +) + +var ( + timeFormats = []string{rfc3339Milli, "2006-01-02T15:04:05.999Z0700"} +) func (ejv *extJSONValue) parseDateTime() (int64, error) { switch ejv.t { @@ -198,7 +204,15 @@ func (ejv *extJSONValue) parseDateTime() (int64, error) { } func parseDatetimeString(data string) (int64, error) { - t, err := time.Parse(rfc3339Milli, data) + var t time.Time + var err error + // try acceptable time formats until one matches + for _, format := range timeFormats { + t, err = time.Parse(format, data) + if err == nil { + break + } + } if err != nil { return 0, fmt.Errorf("invalid $date value string: %s", data) } @@ -416,17 +430,20 @@ func (ejv *extJSONValue) parseTimestamp() (t, i uint32, err error) { switch val.t { case bsontype.Int32: - if val.v.(int32) < 0 { - return 0, fmt.Errorf("$timestamp %s number should be uint32: %s", key, string(val.v.(int32))) + value := val.v.(int32) + + if value < 0 { + return 0, fmt.Errorf("$timestamp %s number should be uint32: %d", key, value) } - return uint32(val.v.(int32)), nil + return uint32(value), nil case bsontype.Int64: - if val.v.(int64) < 0 || uint32(val.v.(int64)) > math.MaxUint32 { - return 0, fmt.Errorf("$timestamp %s number should be uint32: %s", key, string(val.v.(int32))) + value := val.v.(int64) + if value < 0 || value > int64(math.MaxUint32) { + return 0, fmt.Errorf("$timestamp %s number should be uint32: %d", key, value) } - return uint32(val.v.(int64)), nil + return uint32(value), nil default: return 0, fmt.Errorf("$timestamp %s value should be uint32, but instead is %s", key, val.t) } diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_writer.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_writer.go index b34b937379..605e41a138 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_writer.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/extjson_writer.go @@ -536,7 +536,10 @@ func (ejvw *extJSONValueWriter) WriteUndefined() error { func (ejvw *extJSONValueWriter) WriteDocumentElement(key string) (ValueWriter, error) { switch ejvw.stack[ejvw.frame].mode { case mDocument, mTopLevel, mCodeWithScope: - ejvw.buf = append(ejvw.buf, []byte(fmt.Sprintf(`"%s":`, key))...) + var buf bytes.Buffer + writeStringWithEscapes(key, &buf, ejvw.escapeHTML) + + ejvw.buf = append(ejvw.buf, []byte(fmt.Sprintf(`%s:`, buf.String()))...) ejvw.push(mElement) default: return nil, ejvw.invalidTransitionErr(mElement, "WriteDocumentElement", []mode{mDocument, mTopLevel, mCodeWithScope}) diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/json_scanner.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/json_scanner.go index 03aabf5527..212f348348 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/json_scanner.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/json_scanner.go @@ -183,7 +183,7 @@ func (js *jsonScanner) scanString() (*jsonToken, error) { case '\\': c, err = js.readNextByte() switch c { - case '"', '\\', '/', '\'': + case '"', '\\', '/': b.WriteByte(c) case 'b': b.WriteByte('\b') diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_reader.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_reader.go index fad47ba7a2..55378093a2 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_reader.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_reader.go @@ -14,7 +14,6 @@ import ( "io" "math" "sync" - "unicode" "go.mongodb.org/mongo-driver/bson/bsontype" "go.mongodb.org/mongo-driver/bson/primitive" @@ -373,7 +372,8 @@ func (vr *valueReader) ReadBinary() (b []byte, btype byte, err error) { return nil, 0, err } - if btype == 0x02 { + // Check length in case it is an old binary without a length. + if btype == 0x02 && length > 4 { length, err = vr.readLength() if err != nil { return nil, 0, err @@ -449,6 +449,9 @@ func (vr *valueReader) ReadCodeWithScope() (code string, dr DocumentReader, err if err != nil { return "", nil, err } + if strLength <= 0 { + return "", nil, fmt.Errorf("invalid string length: %d", strLength) + } strBytes, err := vr.readBytes(strLength) if err != nil { return "", nil, err @@ -817,14 +820,6 @@ func (vr *valueReader) readString() (string, error) { start := vr.offset vr.offset += int64(length) - - if length == 2 { - asciiByte := vr.d[start] - if asciiByte > unicode.MaxASCII { - return "", fmt.Errorf("invalid ascii byte") - } - } - return string(vr.d[start : start+int64(length)-1]), nil } diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_writer.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_writer.go index caa6fae3aa..3717198366 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_writer.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/value_writer.go @@ -56,6 +56,13 @@ func (bvwp *BSONValueWriterPool) Get(w io.Writer) ValueWriter { return vw } +// GetAtModeElement retrieves a ValueWriterFlusher from the pool and resets it to use w as the destination. +func (bvwp *BSONValueWriterPool) GetAtModeElement(w io.Writer) ValueWriterFlusher { + vw := bvwp.Get(w).(*valueWriter) + vw.push(mElement) + return vw +} + // Put inserts a ValueWriter into the pool. If the ValueWriter is not a BSON ValueWriter, nothing // happens and ok will be false. func (bvwp *BSONValueWriterPool) Put(vw ValueWriter) (ok bool) { @@ -512,17 +519,8 @@ func (vw *valueWriter) WriteDocumentEnd() error { } if vw.stack[vw.frame].mode == mTopLevel { - if vw.w != nil { - if sw, ok := vw.w.(*SliceWriter); ok { - *sw = vw.buf - } else { - _, err = vw.w.Write(vw.buf) - if err != nil { - return err - } - // reset buffer - vw.buf = vw.buf[:0] - } + if err = vw.Flush(); err != nil { + return err } } @@ -537,6 +535,23 @@ func (vw *valueWriter) WriteDocumentEnd() error { return nil } +func (vw *valueWriter) Flush() error { + if vw.w == nil { + return nil + } + + if sw, ok := vw.w.(*SliceWriter); ok { + *sw = vw.buf + return nil + } + if _, err := vw.w.Write(vw.buf); err != nil { + return err + } + // reset buffer + vw.buf = vw.buf[:0] + return nil +} + func (vw *valueWriter) WriteArrayElement() (ValueWriter, error) { if vw.stack[vw.frame].mode != mArray { return nil, vw.invalidTransitionError(mValue, "WriteArrayElement", []mode{mArray}) diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/writer.go b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/writer.go index 128b79bdfa..7644df1290 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/writer.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsonrw/writer.go @@ -55,6 +55,12 @@ type ValueWriter interface { WriteUndefined() error } +// ValueWriterFlusher is a superset of ValueWriter that exposes functionality to flush to the underlying buffer. +type ValueWriterFlusher interface { + ValueWriter + Flush() error +} + // BytesWriter is the interface used to write BSON bytes to a ValueWriter. // This interface is meant to be a superset of ValueWriter, so that types that // implement ValueWriter may also implement this interface. diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsontype/bsontype.go b/vendor/go.mongodb.org/mongo-driver/bson/bsontype/bsontype.go index e76403a67f..63a59ca08f 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/bsontype/bsontype.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/bsontype/bsontype.go @@ -31,6 +31,14 @@ const ( Decimal128 Type = 0x13 MinKey Type = 0xFF MaxKey Type = 0x7F + + BinaryGeneric byte = 0x00 + BinaryFunction byte = 0x01 + BinaryBinaryOld byte = 0x02 + BinaryUUIDOld byte = 0x03 + BinaryUUID byte = 0x04 + BinaryMD5 byte = 0x05 + BinaryUserDefined byte = 0x80 ) // Type represents a BSON type. diff --git a/vendor/go.mongodb.org/mongo-driver/bson/decoder.go b/vendor/go.mongodb.org/mongo-driver/bson/decoder.go index 550541e941..7f6b7694f9 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/decoder.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/decoder.go @@ -78,13 +78,19 @@ func (d *Decoder) Decode(val interface{}) error { } rval := reflect.ValueOf(val) - if rval.Kind() != reflect.Ptr { - return fmt.Errorf("argument to Decode must be a pointer to a type, but got %v", rval) - } - if rval.IsNil() { - return ErrDecodeToNil + switch rval.Kind() { + case reflect.Ptr: + if rval.IsNil() { + return ErrDecodeToNil + } + rval = rval.Elem() + case reflect.Map: + if rval.IsNil() { + return ErrDecodeToNil + } + default: + return fmt.Errorf("argument to Decode must be a pointer or a map, but got %v", rval) } - rval = rval.Elem() decoder, err := d.dc.LookupDecoder(rval.Type()) if err != nil { return err diff --git a/vendor/go.mongodb.org/mongo-driver/bson/doc.go b/vendor/go.mongodb.org/mongo-driver/bson/doc.go index b3f6c52ffb..2943f14eca 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/doc.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/doc.go @@ -4,8 +4,12 @@ // not use this file except in compliance with the License. You may obtain // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 -// Package bson is a library for reading, writing, and manipulating BSON. The -// library has two families of types for representing BSON. +// Package bson is a library for reading, writing, and manipulating BSON. BSON is a binary serialization format used to +// store documents and make remote procedure calls in MongoDB. The BSON specification is located at https://bsonspec.org. +// The BSON library handles marshalling and unmarshalling of values through a configurable codec system. For a description +// of the codec system and examples of registering custom codecs, see the bsoncodec package. +// +// Raw BSON // // The Raw family of types is used to validate and retrieve elements from a slice of bytes. This // type is most useful when you want do lookups on BSON bytes without unmarshaling it into another @@ -19,24 +23,98 @@ // i32, ok := val.Int32OK() // // do something with i32... // -// The D family of types is used to build concise representations of BSON using native Go types. -// These types do not support automatic lookup. +// Native Go Types +// +// The D and M types defined in this package can be used to build representations of BSON using native Go types. D is a +// slice and M is a map. For more information about the use cases for these types, see the documentation on the type +// definitions. // // Example: // bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}} +// bson.M{"foo": "bar", "hello": "world", "pi": 3.14159} // +// When decoding BSON to a D or M, the following type mappings apply when unmarshalling: // -// Marshaling and Unmarshaling are handled with the Marshal and Unmarshal family of functions. If -// you need to write or read BSON from a non-slice source, an Encoder or Decoder can be used with a -// bsonrw.ValueWriter or bsonrw.ValueReader. +// 1. BSON int32 unmarshals to an int32. +// 2. BSON int64 unmarshals to an int64. +// 3. BSON double unmarshals to a float64. +// 4. BSON string unmarshals to a string. +// 5. BSON boolean unmarshals to a bool. +// 6. BSON embedded document unmarshals to the parent type (i.e. D for a D, M for an M). +// 7. BSON array unmarshals to a bson.A. +// 8. BSON ObjectId unmarshals to a primitive.ObjectID. +// 9. BSON datetime unmarshals to a primitive.Datetime. +// 10. BSON binary unmarshals to a primitive.Binary. +// 11. BSON regular expression unmarshals to a primitive.Regex. +// 12. BSON JavaScript unmarshals to a primitive.JavaScript. +// 13. BSON code with scope unmarshals to a primitive.CodeWithScope. +// 14. BSON timestamp unmarshals to an primitive.Timestamp. +// 15. BSON 128-bit decimal unmarshals to an primitive.Decimal128. +// 16. BSON min key unmarshals to an primitive.MinKey. +// 17. BSON max key unmarshals to an primitive.MaxKey. +// 18. BSON undefined unmarshals to a primitive.Undefined. +// 19. BSON null unmarshals to a primitive.Null. +// 20. BSON DBPointer unmarshals to a primitive.DBPointer. +// 21. BSON symbol unmarshals to a primitive.Symbol. // -// Example: -// b, err := bson.Marshal(bson.D{{"foo", "bar"}}) -// if err != nil { return err } -// var fooer struct { -// Foo string -// } -// err = bson.Unmarshal(b, &fooer) -// if err != nil { return err } -// // do something with fooer... +// The above mappings also apply when marshalling a D or M to BSON. Some other useful marshalling mappings are: +// +// 1. time.Time marshals to a BSON datetime. +// 2. int8, int16, and int32 marshal to a BSON int32. +// 3. int marshals to a BSON int32 if the value is between math.MinInt32 and math.MaxInt32, inclusive, and a BSON int64 +// otherwise. +// 4. int64 marshals to BSON int64. +// 5. uint8 and uint16 marshal to a BSON int32. +// 6. uint, uint32, and uint64 marshal to a BSON int32 if the value is between math.MinInt32 and math.MaxInt32, +// inclusive, and BSON int64 otherwise. +// 7. BSON null values will unmarshal into the zero value of a field (e.g. unmarshalling a BSON null value into a string +// will yield the empty string.). +// +// Structs +// +// Structs can be marshalled/unmarshalled to/from BSON. When transforming structs to/from BSON, the following rules +// apply: +// +// 1. Only exported fields in structs will be marshalled or unmarshalled. +// +// 2. When marshalling a struct, each field will be lowercased to generate the key for the corresponding BSON element. +// For example, a struct field named "Foo" will generate key "foo". This can be overriden via a struct tag (e.g. +// `bson:"fooField"` to generate key "fooField" instead). +// +// 3. An embedded struct field is marshalled as a subdocument. The key will be the lowercased name of the field's type. +// +// 4. A pointer field is marshalled as the underlying type if the pointer is non-nil. If the pointer is nil, it is +// marshalled as a BSON null value. +// +// 5. When unmarshalling, a field of type interface{} will follow the D/M type mappings listed above. BSON documents +// unmarshalled into an interface{} field will be unmarshalled as a D. +// +// The following struct tags can be used to configure behavior: +// +// 1. omitempty: If the omitempty struct tag is specified on a field, the field will not be marshalled if it is set to +// the zero value. By default, a struct field is only considered empty if the field's type implements the Zeroer +// interface and the IsZero method returns true. Struct fields of types that do not implement Zeroer are always +// marshalled as embedded documents. This tag should be used for all slice and map values. +// +// 2. minsize: If the minsize struct tag is specified on a field of type int64, uint, uint32, or uint64 and the value of +// the field can fit in a signed int32, the field will be serialized as a BSON int32 rather than a BSON int64. For other +// types, this tag is ignored. +// +// 3. truncate: If the truncate struct tag is specified on a field with a non-float numeric type, BSON doubles unmarshalled +// into that field will be trucated at the decimal point. For example, if 3.14 is unmarshalled into a field of type int, +// it will be unmarshalled as 3. If this tag is not specified, the decoder will throw an error if the value cannot be +// decoded without losing precision. For float64 or non-numeric types, this tag is ignored. +// +// 4. inline: If the inline struct tag is specified for a struct or map field, the field will be "flattened" when +// marshalling and "un-flattened" when unmarshalling. This means that all of the fields in that struct/map will be +// pulled up one level and will become top-level fields rather than being fields in a nested document. For example, if a +// map field named "Map" with value map[string]interface{}{"foo": "bar"} is inlined, the resulting document will be +// {"foo": "bar"} instead of {"map": {"foo": "bar"}}. There can only be one inlined map field in a struct. If there are +// duplicated fields in the resulting document when an inlined field is marshalled, an error will be returned. This tag +// can be used with fields that are pointers to structs. If an inlined pointer field is nil, it will not be marshalled. +// For fields that are not maps or structs, this tag is ignored. +// +// Marshalling and Unmarshalling +// +// Manually marshalling and unmarshalling can be done with the Marshal and Unmarshal family of functions. package bson diff --git a/vendor/go.mongodb.org/mongo-driver/bson/marshal.go b/vendor/go.mongodb.org/mongo-driver/bson/marshal.go index 9a4e28d4b9..381822af53 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/marshal.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/marshal.go @@ -32,7 +32,8 @@ type ValueMarshaler interface { MarshalBSONValue() (bsontype.Type, []byte, error) } -// Marshal returns the BSON encoding of val. +// Marshal returns the BSON encoding of val as a BSON document. If val is not a type that can be transformed into a +// document, MarshalValue should be used instead. // // Marshal will use the default registry created by NewRegistry to recursively // marshal val into a []byte. Marshal will inspect struct tags and alter the @@ -41,34 +42,37 @@ func Marshal(val interface{}) ([]byte, error) { return MarshalWithRegistry(DefaultRegistry, val) } -// MarshalAppend will append the BSON encoding of val to dst. If dst is not -// large enough to hold the BSON encoding of val, dst will be grown. +// MarshalAppend will encode val as a BSON document and append the bytes to dst. If dst is not large enough to hold the +// bytes, it will be grown. If val is not a type that can be transformed into a document, MarshalValueAppend should be +// used instead. func MarshalAppend(dst []byte, val interface{}) ([]byte, error) { return MarshalAppendWithRegistry(DefaultRegistry, dst, val) } -// MarshalWithRegistry returns the BSON encoding of val using Registry r. +// MarshalWithRegistry returns the BSON encoding of val as a BSON document. If val is not a type that can be transformed +// into a document, MarshalValueWithRegistry should be used instead. func MarshalWithRegistry(r *bsoncodec.Registry, val interface{}) ([]byte, error) { dst := make([]byte, 0, 256) // TODO: make the default cap a constant return MarshalAppendWithRegistry(r, dst, val) } -// MarshalWithContext returns the BSON encoding of val using EncodeContext ec. +// MarshalWithContext returns the BSON encoding of val as a BSON document using EncodeContext ec. If val is not a type +// that can be transformed into a document, MarshalValueWithContext should be used instead. func MarshalWithContext(ec bsoncodec.EncodeContext, val interface{}) ([]byte, error) { dst := make([]byte, 0, 256) // TODO: make the default cap a constant return MarshalAppendWithContext(ec, dst, val) } -// MarshalAppendWithRegistry will append the BSON encoding of val to dst using -// Registry r. If dst is not large enough to hold the BSON encoding of val, dst -// will be grown. +// MarshalAppendWithRegistry will encode val as a BSON document using Registry r and append the bytes to dst. If dst is +// not large enough to hold the bytes, it will be grown. If val is not a type that can be transformed into a document, +// MarshalValueAppendWithRegistry should be used instead. func MarshalAppendWithRegistry(r *bsoncodec.Registry, dst []byte, val interface{}) ([]byte, error) { return MarshalAppendWithContext(bsoncodec.EncodeContext{Registry: r}, dst, val) } -// MarshalAppendWithContext will append the BSON encoding of val to dst using -// EncodeContext ec. If dst is not large enough to hold the BSON encoding of val, dst -// will be grown. +// MarshalAppendWithContext will encode val as a BSON document using Registry r and EncodeContext ec and append the +// bytes to dst. If dst is not large enough to hold the bytes, it will be grown. If val is not a type that can be +// transformed into a document, MarshalValueAppendWithContext should be used instead. func MarshalAppendWithContext(ec bsoncodec.EncodeContext, dst []byte, val interface{}) ([]byte, error) { sw := new(bsonrw.SliceWriter) *sw = dst @@ -95,6 +99,69 @@ func MarshalAppendWithContext(ec bsoncodec.EncodeContext, dst []byte, val interf return *sw, nil } +// MarshalValue returns the BSON encoding of val. +// +// MarshalValue will use bson.DefaultRegistry to transform val into a BSON value. If val is a struct, this function will +// inspect struct tags and alter the marshalling process accordingly. +func MarshalValue(val interface{}) (bsontype.Type, []byte, error) { + return MarshalValueWithRegistry(DefaultRegistry, val) +} + +// MarshalValueAppend will append the BSON encoding of val to dst. If dst is not large enough to hold the BSON encoding +// of val, dst will be grown. +func MarshalValueAppend(dst []byte, val interface{}) (bsontype.Type, []byte, error) { + return MarshalValueAppendWithRegistry(DefaultRegistry, dst, val) +} + +// MarshalValueWithRegistry returns the BSON encoding of val using Registry r. +func MarshalValueWithRegistry(r *bsoncodec.Registry, val interface{}) (bsontype.Type, []byte, error) { + dst := make([]byte, 0, defaultDstCap) + return MarshalValueAppendWithRegistry(r, dst, val) +} + +// MarshalValueWithContext returns the BSON encoding of val using EncodeContext ec. +func MarshalValueWithContext(ec bsoncodec.EncodeContext, val interface{}) (bsontype.Type, []byte, error) { + dst := make([]byte, 0, defaultDstCap) + return MarshalValueAppendWithContext(ec, dst, val) +} + +// MarshalValueAppendWithRegistry will append the BSON encoding of val to dst using Registry r. If dst is not large +// enough to hold the BSON encoding of val, dst will be grown. +func MarshalValueAppendWithRegistry(r *bsoncodec.Registry, dst []byte, val interface{}) (bsontype.Type, []byte, error) { + return MarshalValueAppendWithContext(bsoncodec.EncodeContext{Registry: r}, dst, val) +} + +// MarshalValueAppendWithContext will append the BSON encoding of val to dst using EncodeContext ec. If dst is not large +// enough to hold the BSON encoding of val, dst will be grown. +func MarshalValueAppendWithContext(ec bsoncodec.EncodeContext, dst []byte, val interface{}) (bsontype.Type, []byte, error) { + // get a ValueWriter configured to write to dst + sw := new(bsonrw.SliceWriter) + *sw = dst + vwFlusher := bvwPool.GetAtModeElement(sw) + + // get an Encoder and encode the value + enc := encPool.Get().(*Encoder) + defer encPool.Put(enc) + if err := enc.Reset(vwFlusher); err != nil { + return 0, nil, err + } + if err := enc.SetContext(ec); err != nil { + return 0, nil, err + } + if err := enc.Encode(val); err != nil { + return 0, nil, err + } + + // flush the bytes written because we cannot guarantee that a full document has been written + // after the flush, *sw will be in the format + // [value type, 0 (null byte to indicate end of empty element name), value bytes..] + if err := vwFlusher.Flush(); err != nil { + return 0, nil, err + } + buffer := *sw + return bsontype.Type(buffer[0]), buffer[2:], nil +} + // MarshalExtJSON returns the extended JSON encoding of val. func MarshalExtJSON(val interface{}, canonical, escapeHTML bool) ([]byte, error) { return MarshalExtJSONWithRegistry(DefaultRegistry, val, canonical, escapeHTML) diff --git a/vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go b/vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go index d7fdb22805..bd0c5d161a 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go @@ -10,11 +10,27 @@ package primitive import ( + "errors" "fmt" + "math/big" + "regexp" "strconv" "strings" ) +// These constants are the maximum and minimum values for the exponent field in a decimal128 value. +const ( + MaxDecimal128Exp = 6111 + MinDecimal128Exp = -6176 +) + +// These errors are returned when an invalid value is parsed as a big.Int. +var ( + ErrParseNaN = errors.New("cannot parse NaN as a *big.Int") + ErrParseInf = errors.New("cannot parse Infinity as a *big.Int") + ErrParseNegInf = errors.New("cannot parse -Infinity as a *big.Int") +) + // Decimal128 holds decimal128 BSON values. type Decimal128 struct { h, l uint64 @@ -25,7 +41,7 @@ func NewDecimal128(h, l uint64) Decimal128 { return Decimal128{h: h, l: l} } -// GetBytes returns the underlying bytes of the BSON decimal value as two uint16 values. The first +// GetBytes returns the underlying bytes of the BSON decimal value as two uint64 values. The first // contains the most first 8 bytes of the value and the second contains the latter. func (d Decimal128) GetBytes() (uint64, uint64) { return d.h, d.l @@ -33,52 +49,53 @@ func (d Decimal128) GetBytes() (uint64, uint64) { // String returns a string representation of the decimal value. func (d Decimal128) String() string { - var pos int // positive sign - var e int // exponent - var h, l uint64 // significand high/low + var posSign int // positive sign + var exp int // exponent + var high, low uint64 // significand high/low if d.h>>63&1 == 0 { - pos = 1 + posSign = 1 } switch d.h >> 58 & (1<<5 - 1) { case 0x1F: return "NaN" case 0x1E: - return "-Infinity"[pos:] + return "-Infinity"[posSign:] } - l = d.l + low = d.l if d.h>>61&3 == 3 { // Bits: 1*sign 2*ignored 14*exponent 111*significand. // Implicit 0b100 prefix in significand. - e = int(d.h>>47&(1<<14-1)) - 6176 - //h = 4<<47 | d.h&(1<<47-1) + exp = int(d.h >> 47 & (1<<14 - 1)) + //high = 4<<47 | d.h&(1<<47-1) // Spec says all of these values are out of range. - h, l = 0, 0 + high, low = 0, 0 } else { // Bits: 1*sign 14*exponent 113*significand - e = int(d.h>>49&(1<<14-1)) - 6176 - h = d.h & (1<<49 - 1) + exp = int(d.h >> 49 & (1<<14 - 1)) + high = d.h & (1<<49 - 1) } + exp += MinDecimal128Exp // Would be handled by the logic below, but that's trivial and common. - if h == 0 && l == 0 && e == 0 { - return "-0"[pos:] + if high == 0 && low == 0 && exp == 0 { + return "-0"[posSign:] } var repr [48]byte // Loop 5 times over 9 digits plus dot, negative sign, and leading zero. var last = len(repr) var i = len(repr) - var dot = len(repr) + e + var dot = len(repr) + exp var rem uint32 Loop: for d9 := 0; d9 < 5; d9++ { - h, l, rem = divmod(h, l, 1e9) + high, low, rem = divmod(high, low, 1e9) for d1 := 0; d1 < 9; d1++ { // Handle "-0.0", "0.00123400", "-1.00E-6", "1.050E+3", etc. - if i < len(repr) && (dot == i || l == 0 && h == 0 && rem > 0 && rem < 10 && (dot < i-6 || e > 0)) { - e += len(repr) - i + if i < len(repr) && (dot == i || low == 0 && high == 0 && rem > 0 && rem < 10 && (dot < i-6 || exp > 0)) { + exp += len(repr) - i i-- repr[i] = '.' last = i - 1 @@ -89,7 +106,7 @@ Loop: i-- repr[i] = c // Handle "0E+3", "1E+3", etc. - if l == 0 && h == 0 && rem == 0 && i == len(repr)-1 && (dot < i-5 || e > 0) { + if low == 0 && high == 0 && rem == 0 && i == len(repr)-1 && (dot < i-5 || exp > 0) { last = i break Loop } @@ -97,7 +114,7 @@ Loop: last = i } // Break early. Works without it, but why. - if dot > i && l == 0 && h == 0 && rem == 0 { + if dot > i && low == 0 && high == 0 && rem == 0 { break Loop } } @@ -105,13 +122,88 @@ Loop: repr[last-1] = '-' last-- - if e > 0 { - return string(repr[last+pos:]) + "E+" + strconv.Itoa(e) + if exp > 0 { + return string(repr[last+posSign:]) + "E+" + strconv.Itoa(exp) } - if e < 0 { - return string(repr[last+pos:]) + "E" + strconv.Itoa(e) + if exp < 0 { + return string(repr[last+posSign:]) + "E" + strconv.Itoa(exp) } - return string(repr[last+pos:]) + return string(repr[last+posSign:]) +} + +// BigInt returns significand as big.Int and exponent, bi * 10 ^ exp. +func (d Decimal128) BigInt() (bi *big.Int, exp int, err error) { + high, low := d.GetBytes() + var posSign bool // positive sign + + posSign = high>>63&1 == 0 + + switch high >> 58 & (1<<5 - 1) { + case 0x1F: + return nil, 0, ErrParseNaN + case 0x1E: + if posSign { + return nil, 0, ErrParseInf + } + return nil, 0, ErrParseNegInf + } + + if high>>61&3 == 3 { + // Bits: 1*sign 2*ignored 14*exponent 111*significand. + // Implicit 0b100 prefix in significand. + exp = int(high >> 47 & (1<<14 - 1)) + //high = 4<<47 | d.h&(1<<47-1) + // Spec says all of these values are out of range. + high, low = 0, 0 + } else { + // Bits: 1*sign 14*exponent 113*significand + exp = int(high >> 49 & (1<<14 - 1)) + high = high & (1<<49 - 1) + } + exp += MinDecimal128Exp + + // Would be handled by the logic below, but that's trivial and common. + if high == 0 && low == 0 && exp == 0 { + if posSign { + return new(big.Int), 0, nil + } + return new(big.Int), 0, nil + } + + bi = big.NewInt(0) + const host32bit = ^uint(0)>>32 == 0 + if host32bit { + bi.SetBits([]big.Word{big.Word(low), big.Word(low >> 32), big.Word(high), big.Word(high >> 32)}) + } else { + bi.SetBits([]big.Word{big.Word(low), big.Word(high)}) + } + + if !posSign { + return bi.Neg(bi), exp, nil + } + return +} + +// IsNaN returns whether d is NaN. +func (d Decimal128) IsNaN() bool { + return d.h>>58&(1<<5-1) == 0x1F +} + +// IsInf returns: +// +// +1 d == Infinity +// 0 other case +// -1 d == -Infinity +// +func (d Decimal128) IsInf() int { + if d.h>>58&(1<<5-1) != 0x1E { + return 0 + } + + if d.h>>63&1 == 0 { + return 1 + } + return -1 } func divmod(h, l uint64, div uint32) (qh, ql uint64, rem uint32) { @@ -139,19 +231,24 @@ func dErr(s string) (Decimal128, error) { return dNaN, fmt.Errorf("cannot parse %q as a decimal128", s) } -//ParseDecimal128 takes the given string and attempts to parse it into a valid +// match scientific notation number, example -10.15e-18 +var normalNumber = regexp.MustCompile(`^(?P<int>[-+]?\d*)?(?:\.(?P<dec>\d*))?(?:[Ee](?P<exp>[-+]?\d+))?$`) + +// ParseDecimal128 takes the given string and attempts to parse it into a valid // Decimal128 value. func ParseDecimal128(s string) (Decimal128, error) { - orig := s if s == "" { - return dErr(orig) - } - neg := s[0] == '-' - if neg || s[0] == '+' { - s = s[1:] + return dErr(s) } - if (len(s) == 3 || len(s) == 8) && (s[0] == 'N' || s[0] == 'n' || s[0] == 'I' || s[0] == 'i') { + matches := normalNumber.FindStringSubmatch(s) + if len(matches) == 0 { + orig := s + neg := s[0] == '-' + if neg || s[0] == '+' { + s = s[1:] + } + if s == "NaN" || s == "nan" || strings.EqualFold(s, "nan") { return dNaN, nil } @@ -164,144 +261,116 @@ func ParseDecimal128(s string) (Decimal128, error) { return dErr(orig) } - var h, l uint64 - var e int - - var add, ovr uint32 - var mul uint32 = 1 - var dot = -1 - var digits = 0 - var i = 0 - for i < len(s) { - c := s[i] - if mul == 1e9 { - h, l, ovr = muladd(h, l, mul, add) - mul, add = 1, 0 - if ovr > 0 || h&((1<<15-1)<<49) > 0 { - return dErr(orig) - } - } - if c >= '0' && c <= '9' { - i++ - if c > '0' || digits > 0 { - digits++ - } - if digits > 34 { - if c == '0' { - // Exact rounding. - e++ - continue - } - return dErr(orig) - } - mul *= 10 - add *= 10 - add += uint32(c - '0') - continue - } - if c == '.' { - i++ - if dot >= 0 || i == 1 && len(s) == 1 { - return dErr(orig) - } - if i == len(s) { - break - } - if s[i] < '0' || s[i] > '9' || e > 0 { - return dErr(orig) - } - dot = i - continue + intPart := matches[1] + decPart := matches[2] + expPart := matches[3] + + var err error + exp := 0 + if expPart != "" { + exp, err = strconv.Atoi(expPart) + if err != nil { + return dErr(s) } - break } - if i == 0 { - return dErr(orig) + if decPart != "" { + exp -= len(decPart) } - if mul > 1 { - h, l, ovr = muladd(h, l, mul, add) - if ovr > 0 || h&((1<<15-1)<<49) > 0 { - return dErr(orig) - } + + if len(strings.Trim(intPart+decPart, "-0")) > 35 { + return dErr(s) } - if dot >= 0 { - e += dot - i + + bi, ok := new(big.Int).SetString(intPart+decPart, 10) + if !ok { + return dErr(s) } - if i+1 < len(s) && (s[i] == 'E' || s[i] == 'e') { - i++ - eneg := s[i] == '-' - if eneg || s[i] == '+' { - i++ - if i == len(s) { - return dErr(orig) - } - } - n := 0 - for i < len(s) && n < 1e4 { - c := s[i] - i++ - if c < '0' || c > '9' { - return dErr(orig) - } - n *= 10 - n += int(c - '0') - } - if eneg { - n = -n + + d, ok := ParseDecimal128FromBigInt(bi, exp) + if !ok { + return dErr(s) + } + + if bi.Sign() == 0 && s[0] == '-' { + d.h |= 1 << 63 + } + + return d, nil +} + +var ( + ten = big.NewInt(10) + zero = new(big.Int) + + maxS, _ = new(big.Int).SetString("9999999999999999999999999999999999", 10) +) + +// ParseDecimal128FromBigInt attempts to parse the given significand and exponent into a valid Decimal128 value. +func ParseDecimal128FromBigInt(bi *big.Int, exp int) (Decimal128, bool) { + //copy + bi = new(big.Int).Set(bi) + + q := new(big.Int) + r := new(big.Int) + + for bigIntCmpAbs(bi, maxS) == 1 { + bi, _ = q.QuoRem(bi, ten, r) + if r.Cmp(zero) != 0 { + return Decimal128{}, false } - e += n - for e < -6176 { - // Subnormal. - var div uint32 = 1 - for div < 1e9 && e < -6176 { - div *= 10 - e++ - } - var rem uint32 - h, l, rem = divmod(h, l, div) - if rem > 0 { - return dErr(orig) - } + exp++ + if exp > MaxDecimal128Exp { + return Decimal128{}, false } - for e > 6111 { - // Clamped. - var mul uint32 = 1 - for mul < 1e9 && e > 6111 { - mul *= 10 - e-- - } - h, l, ovr = muladd(h, l, mul, 0) - if ovr > 0 || h&((1<<15-1)<<49) > 0 { - return dErr(orig) - } + } + + for exp < MinDecimal128Exp { + // Subnormal. + bi, _ = q.QuoRem(bi, ten, r) + if r.Cmp(zero) != 0 { + return Decimal128{}, false } - if e < -6176 || e > 6111 { - return dErr(orig) + exp++ + } + for exp > MaxDecimal128Exp { + // Clamped. + bi.Mul(bi, ten) + if bigIntCmpAbs(bi, maxS) == 1 { + return Decimal128{}, false } + exp-- } - if i < len(s) { - return dErr(orig) + b := bi.Bytes() + var h, l uint64 + for i := 0; i < len(b); i++ { + if i < len(b)-8 { + h = h<<8 | uint64(b[i]) + continue + } + l = l<<8 | uint64(b[i]) } - h |= uint64(e+6176) & uint64(1<<14-1) << 49 - if neg { + h |= uint64(exp-MinDecimal128Exp) & uint64(1<<14-1) << 49 + if bi.Sign() == -1 { h |= 1 << 63 } - return Decimal128{h, l}, nil -} -func muladd(h, l uint64, mul uint32, add uint32) (resh, resl uint64, overflow uint32) { - mul64 := uint64(mul) - a := mul64 * (l & (1<<32 - 1)) - b := a>>32 + mul64*(l>>32) - c := b>>32 + mul64*(h&(1<<32-1)) - d := c>>32 + mul64*(h>>32) + return Decimal128{h: h, l: l}, true +} - a = a&(1<<32-1) + uint64(add) - b = b&(1<<32-1) + a>>32 - c = c&(1<<32-1) + b>>32 - d = d&(1<<32-1) + c>>32 +// bigIntCmpAbs computes big.Int.Cmp(absoluteValue(x), absoluteValue(y)). +func bigIntCmpAbs(x, y *big.Int) int { + xAbs := bigIntAbsValue(x) + yAbs := bigIntAbsValue(y) + return xAbs.Cmp(yAbs) +} - return (d<<32 | c&(1<<32-1)), (b<<32 | a&(1<<32-1)), uint32(d >> 32) +// bigIntAbsValue returns a big.Int containing the absolute value of b. +// If b is already a non-negative number, it is returned without any changes or copies. +func bigIntAbsValue(b *big.Int) *big.Int { + if b.Sign() >= 0 { + return b // already positive + } + return new(big.Int).Abs(b) } diff --git a/vendor/go.mongodb.org/mongo-driver/bson/primitive/objectid.go b/vendor/go.mongodb.org/mongo-driver/bson/primitive/objectid.go index 0d00000040..41d1cf2886 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/primitive/objectid.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/primitive/objectid.go @@ -126,7 +126,7 @@ func (id *ObjectID) UnmarshalJSON(b []byte) error { } if len(str) != 24 { - return fmt.Errorf("cannot unmarshal into an ObjectID, the length must be 12 but it is %d", len(str)) + return fmt.Errorf("cannot unmarshal into an ObjectID, the length must be 24 but it is %d", len(str)) } _, err = hex.Decode(id[:], []byte(str)) diff --git a/vendor/go.mongodb.org/mongo-driver/bson/primitive/primitive.go b/vendor/go.mongodb.org/mongo-driver/bson/primitive/primitive.go index 20a597d0e8..f47f8df3c8 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/primitive/primitive.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/primitive/primitive.go @@ -21,7 +21,7 @@ type Binary struct { Data []byte } -// Equal compaes bp to bp2 and returns true is the are equal. +// Equal compares bp to bp2 and returns true is the are equal. func (bp Binary) Equal(bp2 Binary) bool { if bp.Subtype != bp2.Subtype { return false @@ -29,6 +29,11 @@ func (bp Binary) Equal(bp2 Binary) bool { return bytes.Equal(bp.Data, bp2.Data) } +// IsZero returns if bp is the empty Binary +func (bp Binary) IsZero() bool { + return bp.Subtype == 0 && len(bp.Data) == 0 +} + // Undefined represents the BSON undefined value type. type Undefined struct{} @@ -50,7 +55,7 @@ func NewDateTimeFromTime(t time.Time) DateTime { return DateTime(t.UnixNano() / 1000000) } -// Null repreesnts the BSON null value. +// Null represents the BSON null value. type Null struct{} // Regex represents a BSON regex value. @@ -63,9 +68,14 @@ func (rp Regex) String() string { return fmt.Sprintf(`{"pattern": "%s", "options": "%s"}`, rp.Pattern, rp.Options) } -// Equal compaes rp to rp2 and returns true is the are equal. +// Equal compares rp to rp2 and returns true is the are equal. func (rp Regex) Equal(rp2 Regex) bool { - return rp.Pattern == rp2.Pattern && rp.Options == rp.Options + return rp.Pattern == rp2.Pattern && rp.Options == rp2.Options +} + +// IsZero returns if rp is the empty Regex +func (rp Regex) IsZero() bool { + return rp.Pattern == "" && rp.Options == "" } // DBPointer represents a BSON dbpointer value. @@ -78,11 +88,16 @@ func (d DBPointer) String() string { return fmt.Sprintf(`{"db": "%s", "pointer": "%s"}`, d.DB, d.Pointer) } -// Equal compaes d to d2 and returns true is the are equal. +// Equal compares d to d2 and returns true is the are equal. func (d DBPointer) Equal(d2 DBPointer) bool { return d.DB == d2.DB && bytes.Equal(d.Pointer[:], d2.Pointer[:]) } +// IsZero returns if d is the empty DBPointer +func (d DBPointer) IsZero() bool { + return d.DB == "" && d.Pointer.IsZero() +} + // JavaScript represents a BSON JavaScript code value. type JavaScript string @@ -105,11 +120,16 @@ type Timestamp struct { I uint32 } -// Equal compaes tp to tp2 and returns true is the are equal. +// Equal compares tp to tp2 and returns true is the are equal. func (tp Timestamp) Equal(tp2 Timestamp) bool { return tp.T == tp2.T && tp.I == tp2.I } +// IsZero returns if tp is the zero Timestamp +func (tp Timestamp) IsZero() bool { + return tp.T == 0 && tp.I == 0 +} + // CompareTimestamp returns an integer comparing two Timestamps, where T is compared first, followed by I. // Returns 0 if tp = tp2, 1 if tp > tp2, -1 if tp < tp2. func CompareTimestamp(tp, tp2 Timestamp) int { @@ -136,16 +156,12 @@ type MinKey struct{} // MaxKey represents the BSON maxkey value. type MaxKey struct{} -// D represents a BSON Document. This type can be used to represent BSON in a concise and readable -// manner. It should generally be used when serializing to BSON. For deserializing, the Raw or -// Document types should be used. +// D is an ordered representation of a BSON document. This type should be used when the order of the elements matters, +// such as MongoDB command documents. If the order of the elements does not matter, an M should be used instead. // // Example usage: // -// primitive.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}} -// -// This type should be used in situations where order matters, such as MongoDB commands. If the -// order is not important, a map is more comfortable and concise. +// bson.D{{"foo", "bar"}, {"hello", "world"}, {"pi", 3.14159}} type D []E // Map creates a map from the elements of the D. @@ -163,24 +179,18 @@ type E struct { Value interface{} } -// M is an unordered, concise representation of a BSON Document. It should generally be used to -// serialize BSON when the order of the elements of a BSON document do not matter. If the element -// order matters, use a D instead. +// M is an unordered representation of a BSON document. This type should be used when the order of the elements does not +// matter. This type is handled as a regular map[string]interface{} when encoding and decoding. Elements will be +// serialized in an undefined, random order. If the order of the elements matters, a D should be used instead. // // Example usage: // -// primitive.M{"foo": "bar", "hello": "world", "pi": 3.14159} -// -// This type is handled in the encoders as a regular map[string]interface{}. The elements will be -// serialized in an undefined, random order, and the order will be different each time. +// bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}. type M map[string]interface{} -// An A represents a BSON array. This type can be used to represent a BSON array in a concise and -// readable manner. It should generally be used when serializing to BSON. For deserializing, the -// RawArray or Array types should be used. +// An A is an ordered representation of a BSON array. // // Example usage: // -// primitive.A{"bar", "world", 3.14159, primitive.D{{"qux", 12345}}} -// +// bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}} type A []interface{} diff --git a/vendor/go.mongodb.org/mongo-driver/bson/primitive_codecs.go b/vendor/go.mongodb.org/mongo-driver/bson/primitive_codecs.go index 1dae2fc6f8..f397fa2d58 100644 --- a/vendor/go.mongodb.org/mongo-driver/bson/primitive_codecs.go +++ b/vendor/go.mongodb.org/mongo-driver/bson/primitive_codecs.go @@ -28,10 +28,10 @@ func (pc PrimitiveCodecs) RegisterPrimitiveCodecs(rb *bsoncodec.RegistryBuilder) } rb. - RegisterEncoder(tRawValue, bsoncodec.ValueEncoderFunc(pc.RawValueEncodeValue)). - RegisterEncoder(tRaw, bsoncodec.ValueEncoderFunc(pc.RawEncodeValue)). - RegisterDecoder(tRawValue, bsoncodec.ValueDecoderFunc(pc.RawValueDecodeValue)). - RegisterDecoder(tRaw, bsoncodec.ValueDecoderFunc(pc.RawDecodeValue)) + RegisterTypeEncoder(tRawValue, bsoncodec.ValueEncoderFunc(pc.RawValueEncodeValue)). + RegisterTypeEncoder(tRaw, bsoncodec.ValueEncoderFunc(pc.RawEncodeValue)). + RegisterTypeDecoder(tRawValue, bsoncodec.ValueDecoderFunc(pc.RawValueDecodeValue)). + RegisterTypeDecoder(tRaw, bsoncodec.ValueDecoderFunc(pc.RawDecodeValue)) } // RawValueEncodeValue is the ValueEncoderFunc for RawValue. diff --git a/vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/bsoncore.go b/vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/bsoncore.go index e61194ef27..2a20d2e075 100644 --- a/vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/bsoncore.go +++ b/vendor/go.mongodb.org/mongo-driver/x/bsonx/bsoncore/bsoncore.go @@ -123,6 +123,9 @@ func ReadElement(src []byte) (Element, []byte, bool) { if elemLength > len(src) { return nil, src, false } + if elemLength < 0 { + return nil, src, false + } return src[:elemLength], src[elemLength:], true } @@ -723,13 +726,18 @@ func appendi32(dst []byte, i32 int32) []byte { // ReadLength reads an int32 length from src and returns the length and the remaining bytes. If // there aren't enough bytes to read a valid length, src is returned unomdified and the returned // bool will be false. -func ReadLength(src []byte) (int32, []byte, bool) { return readi32(src) } +func ReadLength(src []byte) (int32, []byte, bool) { + ln, src, ok := readi32(src) + if ln < 0 { + return ln, src, false + } + return ln, src, ok +} func readi32(src []byte) (int32, []byte, bool) { if len(src) < 4 { return 0, src, false } - return (int32(src[0]) | int32(src[1])<<8 | int32(src[2])<<16 | int32(src[3])<<24), src[4:], true } diff --git a/vendor/google.golang.org/appengine/.travis.yml b/vendor/google.golang.org/appengine/.travis.yml index 70ffe89d5e..6d03f4d36e 100644 --- a/vendor/google.golang.org/appengine/.travis.yml +++ b/vendor/google.golang.org/appengine/.travis.yml @@ -10,8 +10,6 @@ script: matrix: include: - - go: 1.8.x - env: GOAPP=true - go: 1.9.x env: GOAPP=true - go: 1.10.x diff --git a/vendor/google.golang.org/appengine/internal/api.go b/vendor/google.golang.org/appengine/internal/api.go index a6ec19e14c..721053c20a 100644 --- a/vendor/google.golang.org/appengine/internal/api.go +++ b/vendor/google.golang.org/appengine/internal/api.go @@ -58,8 +58,11 @@ var ( apiHTTPClient = &http.Client{ Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: limitDial, + Proxy: http.ProxyFromEnvironment, + Dial: limitDial, + MaxIdleConns: 1000, + MaxIdleConnsPerHost: 10000, + IdleConnTimeout: 90 * time.Second, }, } diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go index cde2c20d3e..cab95a4273 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/decode.go @@ -12,10 +12,11 @@ import ( "google.golang.org/protobuf/internal/encoding/messageset" "google.golang.org/protobuf/internal/encoding/text" "google.golang.org/protobuf/internal/errors" - "google.golang.org/protobuf/internal/fieldnum" "google.golang.org/protobuf/internal/flags" + "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/pragma" "google.golang.org/protobuf/internal/set" + "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" pref "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" @@ -53,6 +54,13 @@ type UnmarshalOptions struct { // Unmarshal reads the given []byte and populates the given proto.Message using options in // UnmarshalOptions object. func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error { + return o.unmarshal(b, m) +} + +// unmarshal is a centralized function that all unmarshal operations go through. +// For profiling purposes, avoid changing the name of this function or +// introducing other code paths for unmarshal that do not go through this. +func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error { proto.Reset(m) if o.Resolver == nil { @@ -100,7 +108,7 @@ func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error { return errors.New("no support for proto1 MessageSets") } - if messageDesc.FullName() == "google.protobuf.Any" { + if messageDesc.FullName() == genid.Any_message_fullname { return d.unmarshalAny(m, checkDelims) } @@ -339,10 +347,10 @@ func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) { case pref.StringKind: if s, ok := tok.String(); ok { - if utf8.ValidString(s) { - return pref.ValueOfString(s), nil + if strs.EnforceUTF8(fd) && !utf8.ValidString(s) { + return pref.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") } - return pref.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8") + return pref.ValueOfString(s), nil } case pref.BytesKind: @@ -530,14 +538,13 @@ Loop: return d.unexpectedTokenError(tok) } - name := tok.IdentName() - switch name { - case "key": + switch name := pref.Name(tok.IdentName()); name { + case genid.MapEntry_Key_field_name: if !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") } if key.IsValid() { - return d.newError(tok.Pos(), `map entry "key" cannot be repeated`) + return d.newError(tok.Pos(), "map entry %q cannot be repeated", name) } val, err := d.unmarshalScalar(fd.MapKey()) if err != nil { @@ -545,14 +552,14 @@ Loop: } key = val.MapKey() - case "value": + case genid.MapEntry_Value_field_name: if kind := fd.MapValue().Kind(); (kind != pref.MessageKind) && (kind != pref.GroupKind) { if !tok.HasSeparator() { return d.syntaxError(tok.Pos(), "missing field separator :") } } if pval.IsValid() { - return d.newError(tok.Pos(), `map entry "value" cannot be repeated`) + return d.newError(tok.Pos(), "map entry %q cannot be repeated", name) } pval, err = unmarshalMapValue() if err != nil { @@ -589,13 +596,9 @@ Loop: func (d decoder) unmarshalAny(m pref.Message, checkDelims bool) error { var typeURL string var bValue []byte - - // hasFields tracks which valid fields have been seen in the loop below in - // order to flag an error if there are duplicates or conflicts. It may - // contain the strings "type_url", "value" and "expanded". The literal - // "expanded" is used to indicate that the expanded form has been - // encountered already. - hasFields := map[string]bool{} + var seenTypeUrl bool + var seenValue bool + var isExpanded bool if checkDelims { tok, err := d.Read() @@ -634,12 +637,12 @@ Loop: return d.syntaxError(tok.Pos(), "missing field separator :") } - switch tok.IdentName() { - case "type_url": - if hasFields["type_url"] { - return d.newError(tok.Pos(), "duplicate Any type_url field") + switch name := pref.Name(tok.IdentName()); name { + case genid.Any_TypeUrl_field_name: + if seenTypeUrl { + return d.newError(tok.Pos(), "duplicate %v field", genid.Any_TypeUrl_field_fullname) } - if hasFields["expanded"] { + if isExpanded { return d.newError(tok.Pos(), "conflict with [%s] field", typeURL) } tok, err := d.Read() @@ -649,15 +652,15 @@ Loop: var ok bool typeURL, ok = tok.String() if !ok { - return d.newError(tok.Pos(), "invalid Any type_url: %v", tok.RawString()) + return d.newError(tok.Pos(), "invalid %v field value: %v", genid.Any_TypeUrl_field_fullname, tok.RawString()) } - hasFields["type_url"] = true + seenTypeUrl = true - case "value": - if hasFields["value"] { - return d.newError(tok.Pos(), "duplicate Any value field") + case genid.Any_Value_field_name: + if seenValue { + return d.newError(tok.Pos(), "duplicate %v field", genid.Any_Value_field_fullname) } - if hasFields["expanded"] { + if isExpanded { return d.newError(tok.Pos(), "conflict with [%s] field", typeURL) } tok, err := d.Read() @@ -666,22 +669,22 @@ Loop: } s, ok := tok.String() if !ok { - return d.newError(tok.Pos(), "invalid Any value: %v", tok.RawString()) + return d.newError(tok.Pos(), "invalid %v field value: %v", genid.Any_Value_field_fullname, tok.RawString()) } bValue = []byte(s) - hasFields["value"] = true + seenValue = true default: if !d.opts.DiscardUnknown { - return d.newError(tok.Pos(), "invalid field name %q in google.protobuf.Any message", tok.RawString()) + return d.newError(tok.Pos(), "invalid field name %q in %v message", tok.RawString(), genid.Any_message_fullname) } } case text.TypeName: - if hasFields["expanded"] { + if isExpanded { return d.newError(tok.Pos(), "cannot have more than one type") } - if hasFields["type_url"] { + if seenTypeUrl { return d.newError(tok.Pos(), "conflict with type_url field") } typeURL = tok.TypeName() @@ -690,21 +693,21 @@ Loop: if err != nil { return err } - hasFields["expanded"] = true + isExpanded = true default: if !d.opts.DiscardUnknown { - return d.newError(tok.Pos(), "invalid field name %q in google.protobuf.Any message", tok.RawString()) + return d.newError(tok.Pos(), "invalid field name %q in %v message", tok.RawString(), genid.Any_message_fullname) } } } fds := m.Descriptor().Fields() if len(typeURL) > 0 { - m.Set(fds.ByNumber(fieldnum.Any_TypeUrl), pref.ValueOfString(typeURL)) + m.Set(fds.ByNumber(genid.Any_TypeUrl_field_number), pref.ValueOfString(typeURL)) } if len(bValue) > 0 { - m.Set(fds.ByNumber(fieldnum.Any_Value), pref.ValueOfBytes(bValue)) + m.Set(fds.ByNumber(genid.Any_Value_field_number), pref.ValueOfBytes(bValue)) } return nil } diff --git a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go index e207c69249..0877d71c51 100644 --- a/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +++ b/vendor/google.golang.org/protobuf/encoding/prototext/encode.go @@ -14,10 +14,11 @@ import ( "google.golang.org/protobuf/internal/encoding/messageset" "google.golang.org/protobuf/internal/encoding/text" "google.golang.org/protobuf/internal/errors" - "google.golang.org/protobuf/internal/fieldnum" "google.golang.org/protobuf/internal/flags" + "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/mapsort" "google.golang.org/protobuf/internal/pragma" + "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" pref "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" @@ -55,6 +56,15 @@ type MarshalOptions struct { // Indent can only be composed of space or tab characters. Indent string + // EmitASCII specifies whether to format strings and bytes as ASCII only + // as opposed to using UTF-8 encoding when possible. + EmitASCII bool + + // allowInvalidUTF8 specifies whether to permit the encoding of strings + // with invalid UTF-8. This is unexported as it is intended to only + // be specified by the Format method. + allowInvalidUTF8 bool + // AllowPartial allows messages that have missing required fields to marshal // without returning an error. If AllowPartial is false (the default), // Marshal will return error if there are any missing required fields. @@ -81,6 +91,7 @@ func (o MarshalOptions) Format(m proto.Message) string { if m == nil || !m.ProtoReflect().IsValid() { return "<nil>" // invalid syntax, but okay since this is for debugging } + o.allowInvalidUTF8 = true o.AllowPartial = true o.EmitUnknown = true b, _ := o.Marshal(m) @@ -91,7 +102,13 @@ func (o MarshalOptions) Format(m proto.Message) string { // MarshalOptions object. Do not depend on the output being stable. It may // change over time across different versions of the program. func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { - const outputASCII = false + return o.marshal(m) +} + +// marshal is a centralized function that all marshal operations go through. +// For profiling purposes, avoid changing the name of this function or +// introducing other code paths for marshal that do not go through this. +func (o MarshalOptions) marshal(m proto.Message) ([]byte, error) { var delims = [2]byte{'{', '}'} if o.Multiline && o.Indent == "" { @@ -101,7 +118,7 @@ func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) { o.Resolver = protoregistry.GlobalTypes } - internalEnc, err := text.NewEncoder(o.Indent, delims, outputASCII) + internalEnc, err := text.NewEncoder(o.Indent, delims, o.EmitASCII) if err != nil { return nil, err } @@ -145,7 +162,7 @@ func (e encoder) marshalMessage(m pref.Message, inclDelims bool) error { } // Handle Any expansion. - if messageDesc.FullName() == "google.protobuf.Any" { + if messageDesc.FullName() == genid.Any_message_fullname { if e.marshalAny(m) { return nil } @@ -215,7 +232,7 @@ func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error case pref.StringKind: s := val.String() - if !utf8.ValidString(s) { + if !e.opts.allowInvalidUTF8 && strs.EnforceUTF8(fd) && !utf8.ValidString(s) { return errors.InvalidUTF8(string(fd.FullName())) } e.WriteString(s) @@ -278,13 +295,13 @@ func (e encoder) marshalMap(name string, mmap pref.Map, fd pref.FieldDescriptor) e.StartMessage() defer e.EndMessage() - e.WriteName("key") + e.WriteName(string(genid.MapEntry_Key_field_name)) err = e.marshalSingular(key.Value(), fd.MapKey()) if err != nil { return false } - e.WriteName("value") + e.WriteName(string(genid.MapEntry_Value_field_name)) err = e.marshalSingular(val, fd.MapValue()) if err != nil { return false @@ -382,7 +399,7 @@ func (e encoder) marshalUnknown(b []byte) { func (e encoder) marshalAny(any pref.Message) bool { // Construct the embedded message. fds := any.Descriptor().Fields() - fdType := fds.ByNumber(fieldnum.Any_TypeUrl) + fdType := fds.ByNumber(genid.Any_TypeUrl_field_number) typeURL := any.Get(fdType).String() mt, err := e.opts.Resolver.FindMessageByURL(typeURL) if err != nil { @@ -391,7 +408,7 @@ func (e encoder) marshalAny(any pref.Message) bool { m := mt.New().Interface() // Unmarshal bytes into embedded message. - fdValue := fds.ByNumber(fieldnum.Any_Value) + fdValue := fds.ByNumber(genid.Any_Value_field_number) value := any.Get(fdValue) err = proto.UnmarshalOptions{ AllowPartial: true, diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/any_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/any_gen.go deleted file mode 100644 index 74c5fef240..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/any_gen.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.Any. -const ( - Any_TypeUrl = 1 // optional string - Any_Value = 2 // optional bytes -) diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/api_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/api_gen.go deleted file mode 100644 index 9a6b5f29b5..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/api_gen.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.Api. -const ( - Api_Name = 1 // optional string - Api_Methods = 2 // repeated google.protobuf.Method - Api_Options = 3 // repeated google.protobuf.Option - Api_Version = 4 // optional string - Api_SourceContext = 5 // optional google.protobuf.SourceContext - Api_Mixins = 6 // repeated google.protobuf.Mixin - Api_Syntax = 7 // optional google.protobuf.Syntax -) - -// Field numbers for google.protobuf.Method. -const ( - Method_Name = 1 // optional string - Method_RequestTypeUrl = 2 // optional string - Method_RequestStreaming = 3 // optional bool - Method_ResponseTypeUrl = 4 // optional string - Method_ResponseStreaming = 5 // optional bool - Method_Options = 6 // repeated google.protobuf.Option - Method_Syntax = 7 // optional google.protobuf.Syntax -) - -// Field numbers for google.protobuf.Mixin. -const ( - Mixin_Name = 1 // optional string - Mixin_Root = 2 // optional string -) diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/descriptor_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/descriptor_gen.go deleted file mode 100644 index 6e37b59e92..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/descriptor_gen.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.FileDescriptorSet. -const ( - FileDescriptorSet_File = 1 // repeated google.protobuf.FileDescriptorProto -) - -// Field numbers for google.protobuf.FileDescriptorProto. -const ( - FileDescriptorProto_Name = 1 // optional string - FileDescriptorProto_Package = 2 // optional string - FileDescriptorProto_Dependency = 3 // repeated string - FileDescriptorProto_PublicDependency = 10 // repeated int32 - FileDescriptorProto_WeakDependency = 11 // repeated int32 - FileDescriptorProto_MessageType = 4 // repeated google.protobuf.DescriptorProto - FileDescriptorProto_EnumType = 5 // repeated google.protobuf.EnumDescriptorProto - FileDescriptorProto_Service = 6 // repeated google.protobuf.ServiceDescriptorProto - FileDescriptorProto_Extension = 7 // repeated google.protobuf.FieldDescriptorProto - FileDescriptorProto_Options = 8 // optional google.protobuf.FileOptions - FileDescriptorProto_SourceCodeInfo = 9 // optional google.protobuf.SourceCodeInfo - FileDescriptorProto_Syntax = 12 // optional string -) - -// Field numbers for google.protobuf.DescriptorProto. -const ( - DescriptorProto_Name = 1 // optional string - DescriptorProto_Field = 2 // repeated google.protobuf.FieldDescriptorProto - DescriptorProto_Extension = 6 // repeated google.protobuf.FieldDescriptorProto - DescriptorProto_NestedType = 3 // repeated google.protobuf.DescriptorProto - DescriptorProto_EnumType = 4 // repeated google.protobuf.EnumDescriptorProto - DescriptorProto_ExtensionRange = 5 // repeated google.protobuf.DescriptorProto.ExtensionRange - DescriptorProto_OneofDecl = 8 // repeated google.protobuf.OneofDescriptorProto - DescriptorProto_Options = 7 // optional google.protobuf.MessageOptions - DescriptorProto_ReservedRange = 9 // repeated google.protobuf.DescriptorProto.ReservedRange - DescriptorProto_ReservedName = 10 // repeated string -) - -// Field numbers for google.protobuf.DescriptorProto.ExtensionRange. -const ( - DescriptorProto_ExtensionRange_Start = 1 // optional int32 - DescriptorProto_ExtensionRange_End = 2 // optional int32 - DescriptorProto_ExtensionRange_Options = 3 // optional google.protobuf.ExtensionRangeOptions -) - -// Field numbers for google.protobuf.DescriptorProto.ReservedRange. -const ( - DescriptorProto_ReservedRange_Start = 1 // optional int32 - DescriptorProto_ReservedRange_End = 2 // optional int32 -) - -// Field numbers for google.protobuf.ExtensionRangeOptions. -const ( - ExtensionRangeOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption -) - -// Field numbers for google.protobuf.FieldDescriptorProto. -const ( - FieldDescriptorProto_Name = 1 // optional string - FieldDescriptorProto_Number = 3 // optional int32 - FieldDescriptorProto_Label = 4 // optional google.protobuf.FieldDescriptorProto.Label - FieldDescriptorProto_Type = 5 // optional google.protobuf.FieldDescriptorProto.Type - FieldDescriptorProto_TypeName = 6 // optional string - FieldDescriptorProto_Extendee = 2 // optional string - FieldDescriptorProto_DefaultValue = 7 // optional string - FieldDescriptorProto_OneofIndex = 9 // optional int32 - FieldDescriptorProto_JsonName = 10 // optional string - FieldDescriptorProto_Options = 8 // optional google.protobuf.FieldOptions - FieldDescriptorProto_Proto3Optional = 17 // optional bool -) - -// Field numbers for google.protobuf.OneofDescriptorProto. -const ( - OneofDescriptorProto_Name = 1 // optional string - OneofDescriptorProto_Options = 2 // optional google.protobuf.OneofOptions -) - -// Field numbers for google.protobuf.EnumDescriptorProto. -const ( - EnumDescriptorProto_Name = 1 // optional string - EnumDescriptorProto_Value = 2 // repeated google.protobuf.EnumValueDescriptorProto - EnumDescriptorProto_Options = 3 // optional google.protobuf.EnumOptions - EnumDescriptorProto_ReservedRange = 4 // repeated google.protobuf.EnumDescriptorProto.EnumReservedRange - EnumDescriptorProto_ReservedName = 5 // repeated string -) - -// Field numbers for google.protobuf.EnumDescriptorProto.EnumReservedRange. -const ( - EnumDescriptorProto_EnumReservedRange_Start = 1 // optional int32 - EnumDescriptorProto_EnumReservedRange_End = 2 // optional int32 -) - -// Field numbers for google.protobuf.EnumValueDescriptorProto. -const ( - EnumValueDescriptorProto_Name = 1 // optional string - EnumValueDescriptorProto_Number = 2 // optional int32 - EnumValueDescriptorProto_Options = 3 // optional google.protobuf.EnumValueOptions -) - -// Field numbers for google.protobuf.ServiceDescriptorProto. -const ( - ServiceDescriptorProto_Name = 1 // optional string - ServiceDescriptorProto_Method = 2 // repeated google.protobuf.MethodDescriptorProto - ServiceDescriptorProto_Options = 3 // optional google.protobuf.ServiceOptions -) - -// Field numbers for google.protobuf.MethodDescriptorProto. -const ( - MethodDescriptorProto_Name = 1 // optional string - MethodDescriptorProto_InputType = 2 // optional string - MethodDescriptorProto_OutputType = 3 // optional string - MethodDescriptorProto_Options = 4 // optional google.protobuf.MethodOptions - MethodDescriptorProto_ClientStreaming = 5 // optional bool - MethodDescriptorProto_ServerStreaming = 6 // optional bool -) - -// Field numbers for google.protobuf.FileOptions. -const ( - FileOptions_JavaPackage = 1 // optional string - FileOptions_JavaOuterClassname = 8 // optional string - FileOptions_JavaMultipleFiles = 10 // optional bool - FileOptions_JavaGenerateEqualsAndHash = 20 // optional bool - FileOptions_JavaStringCheckUtf8 = 27 // optional bool - FileOptions_OptimizeFor = 9 // optional google.protobuf.FileOptions.OptimizeMode - FileOptions_GoPackage = 11 // optional string - FileOptions_CcGenericServices = 16 // optional bool - FileOptions_JavaGenericServices = 17 // optional bool - FileOptions_PyGenericServices = 18 // optional bool - FileOptions_PhpGenericServices = 42 // optional bool - FileOptions_Deprecated = 23 // optional bool - FileOptions_CcEnableArenas = 31 // optional bool - FileOptions_ObjcClassPrefix = 36 // optional string - FileOptions_CsharpNamespace = 37 // optional string - FileOptions_SwiftPrefix = 39 // optional string - FileOptions_PhpClassPrefix = 40 // optional string - FileOptions_PhpNamespace = 41 // optional string - FileOptions_PhpMetadataNamespace = 44 // optional string - FileOptions_RubyPackage = 45 // optional string - FileOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption -) - -// Field numbers for google.protobuf.MessageOptions. -const ( - MessageOptions_MessageSetWireFormat = 1 // optional bool - MessageOptions_NoStandardDescriptorAccessor = 2 // optional bool - MessageOptions_Deprecated = 3 // optional bool - MessageOptions_MapEntry = 7 // optional bool - MessageOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption -) - -// Field numbers for google.protobuf.FieldOptions. -const ( - FieldOptions_Ctype = 1 // optional google.protobuf.FieldOptions.CType - FieldOptions_Packed = 2 // optional bool - FieldOptions_Jstype = 6 // optional google.protobuf.FieldOptions.JSType - FieldOptions_Lazy = 5 // optional bool - FieldOptions_Deprecated = 3 // optional bool - FieldOptions_Weak = 10 // optional bool - FieldOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption -) - -// Field numbers for google.protobuf.OneofOptions. -const ( - OneofOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption -) - -// Field numbers for google.protobuf.EnumOptions. -const ( - EnumOptions_AllowAlias = 2 // optional bool - EnumOptions_Deprecated = 3 // optional bool - EnumOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption -) - -// Field numbers for google.protobuf.EnumValueOptions. -const ( - EnumValueOptions_Deprecated = 1 // optional bool - EnumValueOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption -) - -// Field numbers for google.protobuf.ServiceOptions. -const ( - ServiceOptions_Deprecated = 33 // optional bool - ServiceOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption -) - -// Field numbers for google.protobuf.MethodOptions. -const ( - MethodOptions_Deprecated = 33 // optional bool - MethodOptions_IdempotencyLevel = 34 // optional google.protobuf.MethodOptions.IdempotencyLevel - MethodOptions_UninterpretedOption = 999 // repeated google.protobuf.UninterpretedOption -) - -// Field numbers for google.protobuf.UninterpretedOption. -const ( - UninterpretedOption_Name = 2 // repeated google.protobuf.UninterpretedOption.NamePart - UninterpretedOption_IdentifierValue = 3 // optional string - UninterpretedOption_PositiveIntValue = 4 // optional uint64 - UninterpretedOption_NegativeIntValue = 5 // optional int64 - UninterpretedOption_DoubleValue = 6 // optional double - UninterpretedOption_StringValue = 7 // optional bytes - UninterpretedOption_AggregateValue = 8 // optional string -) - -// Field numbers for google.protobuf.UninterpretedOption.NamePart. -const ( - UninterpretedOption_NamePart_NamePart = 1 // required string - UninterpretedOption_NamePart_IsExtension = 2 // required bool -) - -// Field numbers for google.protobuf.SourceCodeInfo. -const ( - SourceCodeInfo_Location = 1 // repeated google.protobuf.SourceCodeInfo.Location -) - -// Field numbers for google.protobuf.SourceCodeInfo.Location. -const ( - SourceCodeInfo_Location_Path = 1 // repeated int32 - SourceCodeInfo_Location_Span = 2 // repeated int32 - SourceCodeInfo_Location_LeadingComments = 3 // optional string - SourceCodeInfo_Location_TrailingComments = 4 // optional string - SourceCodeInfo_Location_LeadingDetachedComments = 6 // repeated string -) - -// Field numbers for google.protobuf.GeneratedCodeInfo. -const ( - GeneratedCodeInfo_Annotation = 1 // repeated google.protobuf.GeneratedCodeInfo.Annotation -) - -// Field numbers for google.protobuf.GeneratedCodeInfo.Annotation. -const ( - GeneratedCodeInfo_Annotation_Path = 1 // repeated int32 - GeneratedCodeInfo_Annotation_SourceFile = 2 // optional string - GeneratedCodeInfo_Annotation_Begin = 3 // optional int32 - GeneratedCodeInfo_Annotation_End = 4 // optional int32 -) diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/doc.go b/vendor/google.golang.org/protobuf/internal/fieldnum/doc.go deleted file mode 100644 index e597885998..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/doc.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package fieldnum contains constants for field numbers of fields in messages -// declared in descriptor.proto and any of the well-known types. -package fieldnum diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/duration_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/duration_gen.go deleted file mode 100644 index 8816c7358d..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/duration_gen.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.Duration. -const ( - Duration_Seconds = 1 // optional int64 - Duration_Nanos = 2 // optional int32 -) diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/empty_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/empty_gen.go deleted file mode 100644 index b5130a6dd1..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/empty_gen.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.Empty. -const () diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/field_mask_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/field_mask_gen.go deleted file mode 100644 index 7e3bfa27bb..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/field_mask_gen.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.FieldMask. -const ( - FieldMask_Paths = 1 // repeated string -) diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/source_context_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/source_context_gen.go deleted file mode 100644 index 241972b1f7..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/source_context_gen.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.SourceContext. -const ( - SourceContext_FileName = 1 // optional string -) diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/struct_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/struct_gen.go deleted file mode 100644 index c460aab44a..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/struct_gen.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.Struct. -const ( - Struct_Fields = 1 // repeated google.protobuf.Struct.FieldsEntry -) - -// Field numbers for google.protobuf.Struct.FieldsEntry. -const ( - Struct_FieldsEntry_Key = 1 // optional string - Struct_FieldsEntry_Value = 2 // optional google.protobuf.Value -) - -// Field numbers for google.protobuf.Value. -const ( - Value_NullValue = 1 // optional google.protobuf.NullValue - Value_NumberValue = 2 // optional double - Value_StringValue = 3 // optional string - Value_BoolValue = 4 // optional bool - Value_StructValue = 5 // optional google.protobuf.Struct - Value_ListValue = 6 // optional google.protobuf.ListValue -) - -// Field numbers for google.protobuf.ListValue. -const ( - ListValue_Values = 1 // repeated google.protobuf.Value -) diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/timestamp_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/timestamp_gen.go deleted file mode 100644 index b4346fba54..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/timestamp_gen.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.Timestamp. -const ( - Timestamp_Seconds = 1 // optional int64 - Timestamp_Nanos = 2 // optional int32 -) diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/type_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/type_gen.go deleted file mode 100644 index b392e95981..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/type_gen.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.Type. -const ( - Type_Name = 1 // optional string - Type_Fields = 2 // repeated google.protobuf.Field - Type_Oneofs = 3 // repeated string - Type_Options = 4 // repeated google.protobuf.Option - Type_SourceContext = 5 // optional google.protobuf.SourceContext - Type_Syntax = 6 // optional google.protobuf.Syntax -) - -// Field numbers for google.protobuf.Field. -const ( - Field_Kind = 1 // optional google.protobuf.Field.Kind - Field_Cardinality = 2 // optional google.protobuf.Field.Cardinality - Field_Number = 3 // optional int32 - Field_Name = 4 // optional string - Field_TypeUrl = 6 // optional string - Field_OneofIndex = 7 // optional int32 - Field_Packed = 8 // optional bool - Field_Options = 9 // repeated google.protobuf.Option - Field_JsonName = 10 // optional string - Field_DefaultValue = 11 // optional string -) - -// Field numbers for google.protobuf.Enum. -const ( - Enum_Name = 1 // optional string - Enum_Enumvalue = 2 // repeated google.protobuf.EnumValue - Enum_Options = 3 // repeated google.protobuf.Option - Enum_SourceContext = 4 // optional google.protobuf.SourceContext - Enum_Syntax = 5 // optional google.protobuf.Syntax -) - -// Field numbers for google.protobuf.EnumValue. -const ( - EnumValue_Name = 1 // optional string - EnumValue_Number = 2 // optional int32 - EnumValue_Options = 3 // repeated google.protobuf.Option -) - -// Field numbers for google.protobuf.Option. -const ( - Option_Name = 1 // optional string - Option_Value = 2 // optional google.protobuf.Any -) diff --git a/vendor/google.golang.org/protobuf/internal/fieldnum/wrappers_gen.go b/vendor/google.golang.org/protobuf/internal/fieldnum/wrappers_gen.go deleted file mode 100644 index 42f846a9f7..0000000000 --- a/vendor/google.golang.org/protobuf/internal/fieldnum/wrappers_gen.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Code generated by generate-protos. DO NOT EDIT. - -package fieldnum - -// Field numbers for google.protobuf.DoubleValue. -const ( - DoubleValue_Value = 1 // optional double -) - -// Field numbers for google.protobuf.FloatValue. -const ( - FloatValue_Value = 1 // optional float -) - -// Field numbers for google.protobuf.Int64Value. -const ( - Int64Value_Value = 1 // optional int64 -) - -// Field numbers for google.protobuf.UInt64Value. -const ( - UInt64Value_Value = 1 // optional uint64 -) - -// Field numbers for google.protobuf.Int32Value. -const ( - Int32Value_Value = 1 // optional int32 -) - -// Field numbers for google.protobuf.UInt32Value. -const ( - UInt32Value_Value = 1 // optional uint32 -) - -// Field numbers for google.protobuf.BoolValue. -const ( - BoolValue_Value = 1 // optional bool -) - -// Field numbers for google.protobuf.StringValue. -const ( - StringValue_Value = 1 // optional string -) - -// Field numbers for google.protobuf.BytesValue. -const ( - BytesValue_Value = 1 // optional bytes -) diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/build.go b/vendor/google.golang.org/protobuf/internal/filedesc/build.go index 462d384e9f..d02d770c98 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/build.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/build.go @@ -7,7 +7,7 @@ package filedesc import ( "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/fieldnum" + "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/reflect/protoreflect" pref "google.golang.org/protobuf/reflect/protoreflect" preg "google.golang.org/protobuf/reflect/protoregistry" @@ -126,24 +126,24 @@ func (db *Builder) unmarshalCounts(b []byte, isFile bool) { b = b[m:] if isFile { switch num { - case fieldnum.FileDescriptorProto_EnumType: + case genid.FileDescriptorProto_EnumType_field_number: db.NumEnums++ - case fieldnum.FileDescriptorProto_MessageType: + case genid.FileDescriptorProto_MessageType_field_number: db.unmarshalCounts(v, false) db.NumMessages++ - case fieldnum.FileDescriptorProto_Extension: + case genid.FileDescriptorProto_Extension_field_number: db.NumExtensions++ - case fieldnum.FileDescriptorProto_Service: + case genid.FileDescriptorProto_Service_field_number: db.NumServices++ } } else { switch num { - case fieldnum.DescriptorProto_EnumType: + case genid.DescriptorProto_EnumType_field_number: db.NumEnums++ - case fieldnum.DescriptorProto_NestedType: + case genid.DescriptorProto_NestedType_field_number: db.unmarshalCounts(v, false) db.NumMessages++ - case fieldnum.DescriptorProto_Extension: + case genid.DescriptorProto_Extension_field_number: db.NumExtensions++ } } diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index 13b7723c6c..9385126fba 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -13,6 +13,7 @@ import ( "google.golang.org/protobuf/internal/descfmt" "google.golang.org/protobuf/internal/descopts" "google.golang.org/protobuf/internal/encoding/defval" + "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/pragma" "google.golang.org/protobuf/internal/strs" pref "google.golang.org/protobuf/reflect/protoreflect" @@ -302,13 +303,13 @@ func (fd *Field) MapKey() pref.FieldDescriptor { if !fd.IsMap() { return nil } - return fd.Message().Fields().ByNumber(1) + return fd.Message().Fields().ByNumber(genid.MapEntry_Key_field_number) } func (fd *Field) MapValue() pref.FieldDescriptor { if !fd.IsMap() { return nil } - return fd.Message().Fields().ByNumber(2) + return fd.Message().Fields().ByNumber(genid.MapEntry_Value_field_number) } func (fd *Field) HasDefault() bool { return fd.L1.Default.has } func (fd *Field) Default() pref.Value { return fd.L1.Default.get(fd) } @@ -607,7 +608,7 @@ func (dv *defaultValue) get(fd pref.FieldDescriptor) pref.Value { // TODO: Avoid panic if we're running with the race detector // and instead spawn a goroutine that periodically resets // this value back to the original to induce a race. - panic("detected mutation on the default bytes") + panic(fmt.Sprintf("detected mutation on the default bytes for %v", fd.FullName())) } return dv.val } diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go index c0cddf86a4..66e1fee522 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go @@ -8,7 +8,7 @@ import ( "sync" "google.golang.org/protobuf/encoding/protowire" - "google.golang.org/protobuf/internal/fieldnum" + "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" pref "google.golang.org/protobuf/reflect/protoreflect" ) @@ -107,7 +107,7 @@ func (fd *File) unmarshalSeed(b []byte) { v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.FileDescriptorProto_Syntax: + case genid.FileDescriptorProto_Syntax_field_number: switch string(v) { case "proto2": fd.L1.Syntax = pref.Proto2 @@ -116,36 +116,36 @@ func (fd *File) unmarshalSeed(b []byte) { default: panic("invalid syntax") } - case fieldnum.FileDescriptorProto_Name: + case genid.FileDescriptorProto_Name_field_number: fd.L1.Path = sb.MakeString(v) - case fieldnum.FileDescriptorProto_Package: + case genid.FileDescriptorProto_Package_field_number: fd.L1.Package = pref.FullName(sb.MakeString(v)) - case fieldnum.FileDescriptorProto_EnumType: - if prevField != fieldnum.FileDescriptorProto_EnumType { + case genid.FileDescriptorProto_EnumType_field_number: + if prevField != genid.FileDescriptorProto_EnumType_field_number { if numEnums > 0 { panic("non-contiguous repeated field") } posEnums = len(b0) - len(b) - n - m } numEnums++ - case fieldnum.FileDescriptorProto_MessageType: - if prevField != fieldnum.FileDescriptorProto_MessageType { + case genid.FileDescriptorProto_MessageType_field_number: + if prevField != genid.FileDescriptorProto_MessageType_field_number { if numMessages > 0 { panic("non-contiguous repeated field") } posMessages = len(b0) - len(b) - n - m } numMessages++ - case fieldnum.FileDescriptorProto_Extension: - if prevField != fieldnum.FileDescriptorProto_Extension { + case genid.FileDescriptorProto_Extension_field_number: + if prevField != genid.FileDescriptorProto_Extension_field_number { if numExtensions > 0 { panic("non-contiguous repeated field") } posExtensions = len(b0) - len(b) - n - m } numExtensions++ - case fieldnum.FileDescriptorProto_Service: - if prevField != fieldnum.FileDescriptorProto_Service { + case genid.FileDescriptorProto_Service_field_number: + if prevField != genid.FileDescriptorProto_Service_field_number { if numServices > 0 { panic("non-contiguous repeated field") } @@ -233,9 +233,9 @@ func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Desc v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.EnumDescriptorProto_Name: + case genid.EnumDescriptorProto_Name_field_number: ed.L0.FullName = appendFullName(sb, pd.FullName(), v) - case fieldnum.EnumDescriptorProto_Value: + case genid.EnumDescriptorProto_Value_field_number: numValues++ } default: @@ -260,7 +260,7 @@ func (ed *Enum) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.Desc v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.EnumDescriptorProto_Value: + case genid.EnumDescriptorProto_Value_field_number: ed.L2.Values.List[i].unmarshalFull(v, sb, pf, ed, i) i++ } @@ -288,33 +288,33 @@ func (md *Message) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.D v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.DescriptorProto_Name: + case genid.DescriptorProto_Name_field_number: md.L0.FullName = appendFullName(sb, pd.FullName(), v) - case fieldnum.DescriptorProto_EnumType: - if prevField != fieldnum.DescriptorProto_EnumType { + case genid.DescriptorProto_EnumType_field_number: + if prevField != genid.DescriptorProto_EnumType_field_number { if numEnums > 0 { panic("non-contiguous repeated field") } posEnums = len(b0) - len(b) - n - m } numEnums++ - case fieldnum.DescriptorProto_NestedType: - if prevField != fieldnum.DescriptorProto_NestedType { + case genid.DescriptorProto_NestedType_field_number: + if prevField != genid.DescriptorProto_NestedType_field_number { if numMessages > 0 { panic("non-contiguous repeated field") } posMessages = len(b0) - len(b) - n - m } numMessages++ - case fieldnum.DescriptorProto_Extension: - if prevField != fieldnum.DescriptorProto_Extension { + case genid.DescriptorProto_Extension_field_number: + if prevField != genid.DescriptorProto_Extension_field_number { if numExtensions > 0 { panic("non-contiguous repeated field") } posExtensions = len(b0) - len(b) - n - m } numExtensions++ - case fieldnum.DescriptorProto_Options: + case genid.DescriptorProto_Options_field_number: md.unmarshalSeedOptions(v) } prevField = num @@ -375,9 +375,9 @@ func (md *Message) unmarshalSeedOptions(b []byte) { v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.MessageOptions_MapEntry: + case genid.MessageOptions_MapEntry_field_number: md.L1.IsMapEntry = protowire.DecodeBool(v) - case fieldnum.MessageOptions_MessageSetWireFormat: + case genid.MessageOptions_MessageSetWireFormat_field_number: md.L1.IsMessageSet = protowire.DecodeBool(v) } default: @@ -400,20 +400,20 @@ func (xd *Extension) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.FieldDescriptorProto_Number: + case genid.FieldDescriptorProto_Number_field_number: xd.L1.Number = pref.FieldNumber(v) - case fieldnum.FieldDescriptorProto_Label: + case genid.FieldDescriptorProto_Label_field_number: xd.L1.Cardinality = pref.Cardinality(v) - case fieldnum.FieldDescriptorProto_Type: + case genid.FieldDescriptorProto_Type_field_number: xd.L1.Kind = pref.Kind(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.FieldDescriptorProto_Name: + case genid.FieldDescriptorProto_Name_field_number: xd.L0.FullName = appendFullName(sb, pd.FullName(), v) - case fieldnum.FieldDescriptorProto_Extendee: + case genid.FieldDescriptorProto_Extendee_field_number: xd.L1.Extendee = PlaceholderMessage(makeFullName(sb, v)) } default: @@ -436,7 +436,7 @@ func (sd *Service) unmarshalSeed(b []byte, sb *strs.Builder, pf *File, pd pref.D v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.ServiceDescriptorProto_Name: + case genid.ServiceDescriptorProto_Name_field_number: sd.L0.FullName = appendFullName(sb, pd.FullName(), v) } default: diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go index bc215944a3..e672233e77 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go @@ -10,7 +10,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/descopts" - "google.golang.org/protobuf/internal/fieldnum" + "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" "google.golang.org/protobuf/proto" pref "google.golang.org/protobuf/reflect/protoreflect" @@ -143,35 +143,35 @@ func (fd *File) unmarshalFull(b []byte) { v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.FileDescriptorProto_PublicDependency: + case genid.FileDescriptorProto_PublicDependency_field_number: fd.L2.Imports[v].IsPublic = true - case fieldnum.FileDescriptorProto_WeakDependency: + case genid.FileDescriptorProto_WeakDependency_field_number: fd.L2.Imports[v].IsWeak = true } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.FileDescriptorProto_Dependency: + case genid.FileDescriptorProto_Dependency_field_number: path := sb.MakeString(v) imp, _ := fd.builder.FileRegistry.FindFileByPath(path) if imp == nil { imp = PlaceholderFile(path) } fd.L2.Imports = append(fd.L2.Imports, pref.FileImport{FileDescriptor: imp}) - case fieldnum.FileDescriptorProto_EnumType: + case genid.FileDescriptorProto_EnumType_field_number: fd.L1.Enums.List[enumIdx].unmarshalFull(v, sb) enumIdx++ - case fieldnum.FileDescriptorProto_MessageType: + case genid.FileDescriptorProto_MessageType_field_number: fd.L1.Messages.List[messageIdx].unmarshalFull(v, sb) messageIdx++ - case fieldnum.FileDescriptorProto_Extension: + case genid.FileDescriptorProto_Extension_field_number: fd.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb) extensionIdx++ - case fieldnum.FileDescriptorProto_Service: + case genid.FileDescriptorProto_Service_field_number: fd.L1.Services.List[serviceIdx].unmarshalFull(v, sb) serviceIdx++ - case fieldnum.FileDescriptorProto_Options: + case genid.FileDescriptorProto_Options_field_number: rawOptions = appendOptions(rawOptions, v) } default: @@ -196,13 +196,13 @@ func (ed *Enum) unmarshalFull(b []byte, sb *strs.Builder) { v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.EnumDescriptorProto_Value: + case genid.EnumDescriptorProto_Value_field_number: rawValues = append(rawValues, v) - case fieldnum.EnumDescriptorProto_ReservedName: + case genid.EnumDescriptorProto_ReservedName_field_number: ed.L2.ReservedNames.List = append(ed.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) - case fieldnum.EnumDescriptorProto_ReservedRange: + case genid.EnumDescriptorProto_ReservedRange_field_number: ed.L2.ReservedRanges.List = append(ed.L2.ReservedRanges.List, unmarshalEnumReservedRange(v)) - case fieldnum.EnumDescriptorProto_Options: + case genid.EnumDescriptorProto_Options_field_number: rawOptions = appendOptions(rawOptions, v) } default: @@ -228,9 +228,9 @@ func unmarshalEnumReservedRange(b []byte) (r [2]pref.EnumNumber) { v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.EnumDescriptorProto_EnumReservedRange_Start: + case genid.EnumDescriptorProto_EnumReservedRange_Start_field_number: r[0] = pref.EnumNumber(v) - case fieldnum.EnumDescriptorProto_EnumReservedRange_End: + case genid.EnumDescriptorProto_EnumReservedRange_End_field_number: r[1] = pref.EnumNumber(v) } default: @@ -255,17 +255,17 @@ func (vd *EnumValue) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.EnumValueDescriptorProto_Number: + case genid.EnumValueDescriptorProto_Number_field_number: vd.L1.Number = pref.EnumNumber(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.EnumValueDescriptorProto_Name: + case genid.EnumValueDescriptorProto_Name_field_number: // NOTE: Enum values are in the same scope as the enum parent. vd.L0.FullName = appendFullName(sb, pd.Parent().FullName(), v) - case fieldnum.EnumValueDescriptorProto_Options: + case genid.EnumValueDescriptorProto_Options_field_number: rawOptions = appendOptions(rawOptions, v) } default: @@ -289,29 +289,29 @@ func (md *Message) unmarshalFull(b []byte, sb *strs.Builder) { v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.DescriptorProto_Field: + case genid.DescriptorProto_Field_field_number: rawFields = append(rawFields, v) - case fieldnum.DescriptorProto_OneofDecl: + case genid.DescriptorProto_OneofDecl_field_number: rawOneofs = append(rawOneofs, v) - case fieldnum.DescriptorProto_ReservedName: + case genid.DescriptorProto_ReservedName_field_number: md.L2.ReservedNames.List = append(md.L2.ReservedNames.List, pref.Name(sb.MakeString(v))) - case fieldnum.DescriptorProto_ReservedRange: + case genid.DescriptorProto_ReservedRange_field_number: md.L2.ReservedRanges.List = append(md.L2.ReservedRanges.List, unmarshalMessageReservedRange(v)) - case fieldnum.DescriptorProto_ExtensionRange: + case genid.DescriptorProto_ExtensionRange_field_number: r, rawOptions := unmarshalMessageExtensionRange(v) opts := md.L0.ParentFile.builder.optionsUnmarshaler(&descopts.ExtensionRange, rawOptions) md.L2.ExtensionRanges.List = append(md.L2.ExtensionRanges.List, r) md.L2.ExtensionRangeOptions = append(md.L2.ExtensionRangeOptions, opts) - case fieldnum.DescriptorProto_EnumType: + case genid.DescriptorProto_EnumType_field_number: md.L1.Enums.List[enumIdx].unmarshalFull(v, sb) enumIdx++ - case fieldnum.DescriptorProto_NestedType: + case genid.DescriptorProto_NestedType_field_number: md.L1.Messages.List[messageIdx].unmarshalFull(v, sb) messageIdx++ - case fieldnum.DescriptorProto_Extension: + case genid.DescriptorProto_Extension_field_number: md.L1.Extensions.List[extensionIdx].unmarshalFull(v, sb) extensionIdx++ - case fieldnum.DescriptorProto_Options: + case genid.DescriptorProto_Options_field_number: md.unmarshalOptions(v) rawOptions = appendOptions(rawOptions, v) } @@ -347,9 +347,9 @@ func (md *Message) unmarshalOptions(b []byte) { v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.MessageOptions_MapEntry: + case genid.MessageOptions_MapEntry_field_number: md.L1.IsMapEntry = protowire.DecodeBool(v) - case fieldnum.MessageOptions_MessageSetWireFormat: + case genid.MessageOptions_MessageSetWireFormat_field_number: md.L1.IsMessageSet = protowire.DecodeBool(v) } default: @@ -368,9 +368,9 @@ func unmarshalMessageReservedRange(b []byte) (r [2]pref.FieldNumber) { v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.DescriptorProto_ReservedRange_Start: + case genid.DescriptorProto_ReservedRange_Start_field_number: r[0] = pref.FieldNumber(v) - case fieldnum.DescriptorProto_ReservedRange_End: + case genid.DescriptorProto_ReservedRange_End_field_number: r[1] = pref.FieldNumber(v) } default: @@ -390,16 +390,16 @@ func unmarshalMessageExtensionRange(b []byte) (r [2]pref.FieldNumber, rawOptions v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.DescriptorProto_ExtensionRange_Start: + case genid.DescriptorProto_ExtensionRange_Start_field_number: r[0] = pref.FieldNumber(v) - case fieldnum.DescriptorProto_ExtensionRange_End: + case genid.DescriptorProto_ExtensionRange_End_field_number: r[1] = pref.FieldNumber(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.DescriptorProto_ExtensionRange_Options: + case genid.DescriptorProto_ExtensionRange_Options_field_number: rawOptions = appendOptions(rawOptions, v) } default: @@ -425,13 +425,13 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.FieldDescriptorProto_Number: + case genid.FieldDescriptorProto_Number_field_number: fd.L1.Number = pref.FieldNumber(v) - case fieldnum.FieldDescriptorProto_Label: + case genid.FieldDescriptorProto_Label_field_number: fd.L1.Cardinality = pref.Cardinality(v) - case fieldnum.FieldDescriptorProto_Type: + case genid.FieldDescriptorProto_Type_field_number: fd.L1.Kind = pref.Kind(v) - case fieldnum.FieldDescriptorProto_OneofIndex: + case genid.FieldDescriptorProto_OneofIndex_field_number: // In Message.unmarshalFull, we allocate slices for both // the field and oneof descriptors before unmarshaling either // of them. This ensures pointers to slice elements are stable. @@ -441,22 +441,22 @@ func (fd *Field) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des panic("oneof type already set") } fd.L1.ContainingOneof = od - case fieldnum.FieldDescriptorProto_Proto3Optional: + case genid.FieldDescriptorProto_Proto3Optional_field_number: fd.L1.IsProto3Optional = protowire.DecodeBool(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.FieldDescriptorProto_Name: + case genid.FieldDescriptorProto_Name_field_number: fd.L0.FullName = appendFullName(sb, pd.FullName(), v) - case fieldnum.FieldDescriptorProto_JsonName: + case genid.FieldDescriptorProto_JsonName_field_number: fd.L1.JSONName.Init(sb.MakeString(v)) - case fieldnum.FieldDescriptorProto_DefaultValue: + case genid.FieldDescriptorProto_DefaultValue_field_number: fd.L1.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveMessages - case fieldnum.FieldDescriptorProto_TypeName: + case genid.FieldDescriptorProto_TypeName_field_number: rawTypeName = v - case fieldnum.FieldDescriptorProto_Options: + case genid.FieldDescriptorProto_Options_field_number: fd.unmarshalOptions(v) rawOptions = appendOptions(rawOptions, v) } @@ -488,10 +488,10 @@ func (fd *Field) unmarshalOptions(b []byte) { v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.FieldOptions_Packed: + case genid.FieldOptions_Packed_field_number: fd.L1.HasPacked = true fd.L1.IsPacked = protowire.DecodeBool(v) - case fieldnum.FieldOptions_Weak: + case genid.FieldOptions_Weak_field_number: fd.L1.IsWeak = protowire.DecodeBool(v) case FieldOptions_EnforceUTF8: fd.L1.HasEnforceUTF8 = true @@ -518,9 +518,9 @@ func (od *Oneof) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.Des v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.OneofDescriptorProto_Name: + case genid.OneofDescriptorProto_Name_field_number: od.L0.FullName = appendFullName(sb, pd.FullName(), v) - case fieldnum.OneofDescriptorProto_Options: + case genid.OneofDescriptorProto_Options_field_number: rawOptions = appendOptions(rawOptions, v) } default: @@ -543,20 +543,20 @@ func (xd *Extension) unmarshalFull(b []byte, sb *strs.Builder) { v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.FieldDescriptorProto_Proto3Optional: + case genid.FieldDescriptorProto_Proto3Optional_field_number: xd.L2.IsProto3Optional = protowire.DecodeBool(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.FieldDescriptorProto_JsonName: + case genid.FieldDescriptorProto_JsonName_field_number: xd.L2.JSONName.Init(sb.MakeString(v)) - case fieldnum.FieldDescriptorProto_DefaultValue: + case genid.FieldDescriptorProto_DefaultValue_field_number: xd.L2.Default.val = pref.ValueOfBytes(v) // temporarily store as bytes; later resolved in resolveExtensions - case fieldnum.FieldDescriptorProto_TypeName: + case genid.FieldDescriptorProto_TypeName_field_number: rawTypeName = v - case fieldnum.FieldDescriptorProto_Options: + case genid.FieldDescriptorProto_Options_field_number: xd.unmarshalOptions(v) rawOptions = appendOptions(rawOptions, v) } @@ -586,7 +586,7 @@ func (xd *Extension) unmarshalOptions(b []byte) { v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.FieldOptions_Packed: + case genid.FieldOptions_Packed_field_number: xd.L2.IsPacked = protowire.DecodeBool(v) } default: @@ -608,9 +608,9 @@ func (sd *Service) unmarshalFull(b []byte, sb *strs.Builder) { v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.ServiceDescriptorProto_Method: + case genid.ServiceDescriptorProto_Method_field_number: rawMethods = append(rawMethods, v) - case fieldnum.ServiceDescriptorProto_Options: + case genid.ServiceDescriptorProto_Options_field_number: rawOptions = appendOptions(rawOptions, v) } default: @@ -641,22 +641,22 @@ func (md *Method) unmarshalFull(b []byte, sb *strs.Builder, pf *File, pd pref.De v, m := protowire.ConsumeVarint(b) b = b[m:] switch num { - case fieldnum.MethodDescriptorProto_ClientStreaming: + case genid.MethodDescriptorProto_ClientStreaming_field_number: md.L1.IsStreamingClient = protowire.DecodeBool(v) - case fieldnum.MethodDescriptorProto_ServerStreaming: + case genid.MethodDescriptorProto_ServerStreaming_field_number: md.L1.IsStreamingServer = protowire.DecodeBool(v) } case protowire.BytesType: v, m := protowire.ConsumeBytes(b) b = b[m:] switch num { - case fieldnum.MethodDescriptorProto_Name: + case genid.MethodDescriptorProto_Name_field_number: md.L0.FullName = appendFullName(sb, pd.FullName(), v) - case fieldnum.MethodDescriptorProto_InputType: + case genid.MethodDescriptorProto_InputType_field_number: md.L1.Input = PlaceholderMessage(makeFullName(sb, v)) - case fieldnum.MethodDescriptorProto_OutputType: + case genid.MethodDescriptorProto_OutputType_field_number: md.L1.Output = PlaceholderMessage(makeFullName(sb, v)) - case fieldnum.MethodDescriptorProto_Options: + case genid.MethodDescriptorProto_Options_field_number: rawOptions = appendOptions(rawOptions, v) } default: diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go index 1b7089b643..c876cd34d7 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go @@ -6,7 +6,6 @@ package filedesc import ( "fmt" - "math" "sort" "sync" @@ -185,10 +184,7 @@ func (p *FieldRanges) CheckValid(isMessageSet bool) error { // Unlike the FieldNumber.IsValid method, it allows ranges that cover the // reserved number range. func isValidFieldNumber(n protoreflect.FieldNumber, isMessageSet bool) bool { - if isMessageSet { - return protowire.MinValidNumber <= n && n <= math.MaxInt32 - } - return protowire.MinValidNumber <= n && n <= protowire.MaxValidNumber + return protowire.MinValidNumber <= n && (n <= protowire.MaxValidNumber || isMessageSet) } // CheckOverlap reports an error if p and q overlap. diff --git a/vendor/google.golang.org/protobuf/internal/genid/any_gen.go b/vendor/google.golang.org/protobuf/internal/genid/any_gen.go new file mode 100644 index 0000000000..e6f7d47ab6 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/any_gen.go @@ -0,0 +1,34 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_any_proto = "google/protobuf/any.proto" + +// Names for google.protobuf.Any. +const ( + Any_message_name protoreflect.Name = "Any" + Any_message_fullname protoreflect.FullName = "google.protobuf.Any" +) + +// Field names for google.protobuf.Any. +const ( + Any_TypeUrl_field_name protoreflect.Name = "type_url" + Any_Value_field_name protoreflect.Name = "value" + + Any_TypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Any.type_url" + Any_Value_field_fullname protoreflect.FullName = "google.protobuf.Any.value" +) + +// Field numbers for google.protobuf.Any. +const ( + Any_TypeUrl_field_number protoreflect.FieldNumber = 1 + Any_Value_field_number protoreflect.FieldNumber = 2 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/api_gen.go b/vendor/google.golang.org/protobuf/internal/genid/api_gen.go new file mode 100644 index 0000000000..df8f918501 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/api_gen.go @@ -0,0 +1,106 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_api_proto = "google/protobuf/api.proto" + +// Names for google.protobuf.Api. +const ( + Api_message_name protoreflect.Name = "Api" + Api_message_fullname protoreflect.FullName = "google.protobuf.Api" +) + +// Field names for google.protobuf.Api. +const ( + Api_Name_field_name protoreflect.Name = "name" + Api_Methods_field_name protoreflect.Name = "methods" + Api_Options_field_name protoreflect.Name = "options" + Api_Version_field_name protoreflect.Name = "version" + Api_SourceContext_field_name protoreflect.Name = "source_context" + Api_Mixins_field_name protoreflect.Name = "mixins" + Api_Syntax_field_name protoreflect.Name = "syntax" + + Api_Name_field_fullname protoreflect.FullName = "google.protobuf.Api.name" + Api_Methods_field_fullname protoreflect.FullName = "google.protobuf.Api.methods" + Api_Options_field_fullname protoreflect.FullName = "google.protobuf.Api.options" + Api_Version_field_fullname protoreflect.FullName = "google.protobuf.Api.version" + Api_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Api.source_context" + Api_Mixins_field_fullname protoreflect.FullName = "google.protobuf.Api.mixins" + Api_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Api.syntax" +) + +// Field numbers for google.protobuf.Api. +const ( + Api_Name_field_number protoreflect.FieldNumber = 1 + Api_Methods_field_number protoreflect.FieldNumber = 2 + Api_Options_field_number protoreflect.FieldNumber = 3 + Api_Version_field_number protoreflect.FieldNumber = 4 + Api_SourceContext_field_number protoreflect.FieldNumber = 5 + Api_Mixins_field_number protoreflect.FieldNumber = 6 + Api_Syntax_field_number protoreflect.FieldNumber = 7 +) + +// Names for google.protobuf.Method. +const ( + Method_message_name protoreflect.Name = "Method" + Method_message_fullname protoreflect.FullName = "google.protobuf.Method" +) + +// Field names for google.protobuf.Method. +const ( + Method_Name_field_name protoreflect.Name = "name" + Method_RequestTypeUrl_field_name protoreflect.Name = "request_type_url" + Method_RequestStreaming_field_name protoreflect.Name = "request_streaming" + Method_ResponseTypeUrl_field_name protoreflect.Name = "response_type_url" + Method_ResponseStreaming_field_name protoreflect.Name = "response_streaming" + Method_Options_field_name protoreflect.Name = "options" + Method_Syntax_field_name protoreflect.Name = "syntax" + + Method_Name_field_fullname protoreflect.FullName = "google.protobuf.Method.name" + Method_RequestTypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Method.request_type_url" + Method_RequestStreaming_field_fullname protoreflect.FullName = "google.protobuf.Method.request_streaming" + Method_ResponseTypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Method.response_type_url" + Method_ResponseStreaming_field_fullname protoreflect.FullName = "google.protobuf.Method.response_streaming" + Method_Options_field_fullname protoreflect.FullName = "google.protobuf.Method.options" + Method_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Method.syntax" +) + +// Field numbers for google.protobuf.Method. +const ( + Method_Name_field_number protoreflect.FieldNumber = 1 + Method_RequestTypeUrl_field_number protoreflect.FieldNumber = 2 + Method_RequestStreaming_field_number protoreflect.FieldNumber = 3 + Method_ResponseTypeUrl_field_number protoreflect.FieldNumber = 4 + Method_ResponseStreaming_field_number protoreflect.FieldNumber = 5 + Method_Options_field_number protoreflect.FieldNumber = 6 + Method_Syntax_field_number protoreflect.FieldNumber = 7 +) + +// Names for google.protobuf.Mixin. +const ( + Mixin_message_name protoreflect.Name = "Mixin" + Mixin_message_fullname protoreflect.FullName = "google.protobuf.Mixin" +) + +// Field names for google.protobuf.Mixin. +const ( + Mixin_Name_field_name protoreflect.Name = "name" + Mixin_Root_field_name protoreflect.Name = "root" + + Mixin_Name_field_fullname protoreflect.FullName = "google.protobuf.Mixin.name" + Mixin_Root_field_fullname protoreflect.FullName = "google.protobuf.Mixin.root" +) + +// Field numbers for google.protobuf.Mixin. +const ( + Mixin_Name_field_number protoreflect.FieldNumber = 1 + Mixin_Root_field_number protoreflect.FieldNumber = 2 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go new file mode 100644 index 0000000000..e3cdf1c205 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go @@ -0,0 +1,829 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_descriptor_proto = "google/protobuf/descriptor.proto" + +// Names for google.protobuf.FileDescriptorSet. +const ( + FileDescriptorSet_message_name protoreflect.Name = "FileDescriptorSet" + FileDescriptorSet_message_fullname protoreflect.FullName = "google.protobuf.FileDescriptorSet" +) + +// Field names for google.protobuf.FileDescriptorSet. +const ( + FileDescriptorSet_File_field_name protoreflect.Name = "file" + + FileDescriptorSet_File_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorSet.file" +) + +// Field numbers for google.protobuf.FileDescriptorSet. +const ( + FileDescriptorSet_File_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.FileDescriptorProto. +const ( + FileDescriptorProto_message_name protoreflect.Name = "FileDescriptorProto" + FileDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto" +) + +// Field names for google.protobuf.FileDescriptorProto. +const ( + FileDescriptorProto_Name_field_name protoreflect.Name = "name" + FileDescriptorProto_Package_field_name protoreflect.Name = "package" + FileDescriptorProto_Dependency_field_name protoreflect.Name = "dependency" + FileDescriptorProto_PublicDependency_field_name protoreflect.Name = "public_dependency" + FileDescriptorProto_WeakDependency_field_name protoreflect.Name = "weak_dependency" + FileDescriptorProto_MessageType_field_name protoreflect.Name = "message_type" + FileDescriptorProto_EnumType_field_name protoreflect.Name = "enum_type" + FileDescriptorProto_Service_field_name protoreflect.Name = "service" + FileDescriptorProto_Extension_field_name protoreflect.Name = "extension" + FileDescriptorProto_Options_field_name protoreflect.Name = "options" + FileDescriptorProto_SourceCodeInfo_field_name protoreflect.Name = "source_code_info" + FileDescriptorProto_Syntax_field_name protoreflect.Name = "syntax" + + FileDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.name" + FileDescriptorProto_Package_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.package" + FileDescriptorProto_Dependency_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.dependency" + FileDescriptorProto_PublicDependency_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.public_dependency" + FileDescriptorProto_WeakDependency_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.weak_dependency" + FileDescriptorProto_MessageType_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.message_type" + FileDescriptorProto_EnumType_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.enum_type" + FileDescriptorProto_Service_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.service" + FileDescriptorProto_Extension_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.extension" + FileDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.options" + FileDescriptorProto_SourceCodeInfo_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.source_code_info" + FileDescriptorProto_Syntax_field_fullname protoreflect.FullName = "google.protobuf.FileDescriptorProto.syntax" +) + +// Field numbers for google.protobuf.FileDescriptorProto. +const ( + FileDescriptorProto_Name_field_number protoreflect.FieldNumber = 1 + FileDescriptorProto_Package_field_number protoreflect.FieldNumber = 2 + FileDescriptorProto_Dependency_field_number protoreflect.FieldNumber = 3 + FileDescriptorProto_PublicDependency_field_number protoreflect.FieldNumber = 10 + FileDescriptorProto_WeakDependency_field_number protoreflect.FieldNumber = 11 + FileDescriptorProto_MessageType_field_number protoreflect.FieldNumber = 4 + FileDescriptorProto_EnumType_field_number protoreflect.FieldNumber = 5 + FileDescriptorProto_Service_field_number protoreflect.FieldNumber = 6 + FileDescriptorProto_Extension_field_number protoreflect.FieldNumber = 7 + FileDescriptorProto_Options_field_number protoreflect.FieldNumber = 8 + FileDescriptorProto_SourceCodeInfo_field_number protoreflect.FieldNumber = 9 + FileDescriptorProto_Syntax_field_number protoreflect.FieldNumber = 12 +) + +// Names for google.protobuf.DescriptorProto. +const ( + DescriptorProto_message_name protoreflect.Name = "DescriptorProto" + DescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.DescriptorProto" +) + +// Field names for google.protobuf.DescriptorProto. +const ( + DescriptorProto_Name_field_name protoreflect.Name = "name" + DescriptorProto_Field_field_name protoreflect.Name = "field" + DescriptorProto_Extension_field_name protoreflect.Name = "extension" + DescriptorProto_NestedType_field_name protoreflect.Name = "nested_type" + DescriptorProto_EnumType_field_name protoreflect.Name = "enum_type" + DescriptorProto_ExtensionRange_field_name protoreflect.Name = "extension_range" + DescriptorProto_OneofDecl_field_name protoreflect.Name = "oneof_decl" + DescriptorProto_Options_field_name protoreflect.Name = "options" + DescriptorProto_ReservedRange_field_name protoreflect.Name = "reserved_range" + DescriptorProto_ReservedName_field_name protoreflect.Name = "reserved_name" + + DescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.name" + DescriptorProto_Field_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.field" + DescriptorProto_Extension_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.extension" + DescriptorProto_NestedType_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.nested_type" + DescriptorProto_EnumType_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.enum_type" + DescriptorProto_ExtensionRange_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.extension_range" + DescriptorProto_OneofDecl_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.oneof_decl" + DescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.options" + DescriptorProto_ReservedRange_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.reserved_range" + DescriptorProto_ReservedName_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.reserved_name" +) + +// Field numbers for google.protobuf.DescriptorProto. +const ( + DescriptorProto_Name_field_number protoreflect.FieldNumber = 1 + DescriptorProto_Field_field_number protoreflect.FieldNumber = 2 + DescriptorProto_Extension_field_number protoreflect.FieldNumber = 6 + DescriptorProto_NestedType_field_number protoreflect.FieldNumber = 3 + DescriptorProto_EnumType_field_number protoreflect.FieldNumber = 4 + DescriptorProto_ExtensionRange_field_number protoreflect.FieldNumber = 5 + DescriptorProto_OneofDecl_field_number protoreflect.FieldNumber = 8 + DescriptorProto_Options_field_number protoreflect.FieldNumber = 7 + DescriptorProto_ReservedRange_field_number protoreflect.FieldNumber = 9 + DescriptorProto_ReservedName_field_number protoreflect.FieldNumber = 10 +) + +// Names for google.protobuf.DescriptorProto.ExtensionRange. +const ( + DescriptorProto_ExtensionRange_message_name protoreflect.Name = "ExtensionRange" + DescriptorProto_ExtensionRange_message_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange" +) + +// Field names for google.protobuf.DescriptorProto.ExtensionRange. +const ( + DescriptorProto_ExtensionRange_Start_field_name protoreflect.Name = "start" + DescriptorProto_ExtensionRange_End_field_name protoreflect.Name = "end" + DescriptorProto_ExtensionRange_Options_field_name protoreflect.Name = "options" + + DescriptorProto_ExtensionRange_Start_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange.start" + DescriptorProto_ExtensionRange_End_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange.end" + DescriptorProto_ExtensionRange_Options_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ExtensionRange.options" +) + +// Field numbers for google.protobuf.DescriptorProto.ExtensionRange. +const ( + DescriptorProto_ExtensionRange_Start_field_number protoreflect.FieldNumber = 1 + DescriptorProto_ExtensionRange_End_field_number protoreflect.FieldNumber = 2 + DescriptorProto_ExtensionRange_Options_field_number protoreflect.FieldNumber = 3 +) + +// Names for google.protobuf.DescriptorProto.ReservedRange. +const ( + DescriptorProto_ReservedRange_message_name protoreflect.Name = "ReservedRange" + DescriptorProto_ReservedRange_message_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ReservedRange" +) + +// Field names for google.protobuf.DescriptorProto.ReservedRange. +const ( + DescriptorProto_ReservedRange_Start_field_name protoreflect.Name = "start" + DescriptorProto_ReservedRange_End_field_name protoreflect.Name = "end" + + DescriptorProto_ReservedRange_Start_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ReservedRange.start" + DescriptorProto_ReservedRange_End_field_fullname protoreflect.FullName = "google.protobuf.DescriptorProto.ReservedRange.end" +) + +// Field numbers for google.protobuf.DescriptorProto.ReservedRange. +const ( + DescriptorProto_ReservedRange_Start_field_number protoreflect.FieldNumber = 1 + DescriptorProto_ReservedRange_End_field_number protoreflect.FieldNumber = 2 +) + +// Names for google.protobuf.ExtensionRangeOptions. +const ( + ExtensionRangeOptions_message_name protoreflect.Name = "ExtensionRangeOptions" + ExtensionRangeOptions_message_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions" +) + +// Field names for google.protobuf.ExtensionRangeOptions. +const ( + ExtensionRangeOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + + ExtensionRangeOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ExtensionRangeOptions.uninterpreted_option" +) + +// Field numbers for google.protobuf.ExtensionRangeOptions. +const ( + ExtensionRangeOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 +) + +// Names for google.protobuf.FieldDescriptorProto. +const ( + FieldDescriptorProto_message_name protoreflect.Name = "FieldDescriptorProto" + FieldDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto" +) + +// Field names for google.protobuf.FieldDescriptorProto. +const ( + FieldDescriptorProto_Name_field_name protoreflect.Name = "name" + FieldDescriptorProto_Number_field_name protoreflect.Name = "number" + FieldDescriptorProto_Label_field_name protoreflect.Name = "label" + FieldDescriptorProto_Type_field_name protoreflect.Name = "type" + FieldDescriptorProto_TypeName_field_name protoreflect.Name = "type_name" + FieldDescriptorProto_Extendee_field_name protoreflect.Name = "extendee" + FieldDescriptorProto_DefaultValue_field_name protoreflect.Name = "default_value" + FieldDescriptorProto_OneofIndex_field_name protoreflect.Name = "oneof_index" + FieldDescriptorProto_JsonName_field_name protoreflect.Name = "json_name" + FieldDescriptorProto_Options_field_name protoreflect.Name = "options" + FieldDescriptorProto_Proto3Optional_field_name protoreflect.Name = "proto3_optional" + + FieldDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.name" + FieldDescriptorProto_Number_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.number" + FieldDescriptorProto_Label_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.label" + FieldDescriptorProto_Type_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.type" + FieldDescriptorProto_TypeName_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.type_name" + FieldDescriptorProto_Extendee_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.extendee" + FieldDescriptorProto_DefaultValue_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.default_value" + FieldDescriptorProto_OneofIndex_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.oneof_index" + FieldDescriptorProto_JsonName_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.json_name" + FieldDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.options" + FieldDescriptorProto_Proto3Optional_field_fullname protoreflect.FullName = "google.protobuf.FieldDescriptorProto.proto3_optional" +) + +// Field numbers for google.protobuf.FieldDescriptorProto. +const ( + FieldDescriptorProto_Name_field_number protoreflect.FieldNumber = 1 + FieldDescriptorProto_Number_field_number protoreflect.FieldNumber = 3 + FieldDescriptorProto_Label_field_number protoreflect.FieldNumber = 4 + FieldDescriptorProto_Type_field_number protoreflect.FieldNumber = 5 + FieldDescriptorProto_TypeName_field_number protoreflect.FieldNumber = 6 + FieldDescriptorProto_Extendee_field_number protoreflect.FieldNumber = 2 + FieldDescriptorProto_DefaultValue_field_number protoreflect.FieldNumber = 7 + FieldDescriptorProto_OneofIndex_field_number protoreflect.FieldNumber = 9 + FieldDescriptorProto_JsonName_field_number protoreflect.FieldNumber = 10 + FieldDescriptorProto_Options_field_number protoreflect.FieldNumber = 8 + FieldDescriptorProto_Proto3Optional_field_number protoreflect.FieldNumber = 17 +) + +// Full and short names for google.protobuf.FieldDescriptorProto.Type. +const ( + FieldDescriptorProto_Type_enum_fullname = "google.protobuf.FieldDescriptorProto.Type" + FieldDescriptorProto_Type_enum_name = "Type" +) + +// Full and short names for google.protobuf.FieldDescriptorProto.Label. +const ( + FieldDescriptorProto_Label_enum_fullname = "google.protobuf.FieldDescriptorProto.Label" + FieldDescriptorProto_Label_enum_name = "Label" +) + +// Names for google.protobuf.OneofDescriptorProto. +const ( + OneofDescriptorProto_message_name protoreflect.Name = "OneofDescriptorProto" + OneofDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.OneofDescriptorProto" +) + +// Field names for google.protobuf.OneofDescriptorProto. +const ( + OneofDescriptorProto_Name_field_name protoreflect.Name = "name" + OneofDescriptorProto_Options_field_name protoreflect.Name = "options" + + OneofDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.OneofDescriptorProto.name" + OneofDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.OneofDescriptorProto.options" +) + +// Field numbers for google.protobuf.OneofDescriptorProto. +const ( + OneofDescriptorProto_Name_field_number protoreflect.FieldNumber = 1 + OneofDescriptorProto_Options_field_number protoreflect.FieldNumber = 2 +) + +// Names for google.protobuf.EnumDescriptorProto. +const ( + EnumDescriptorProto_message_name protoreflect.Name = "EnumDescriptorProto" + EnumDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto" +) + +// Field names for google.protobuf.EnumDescriptorProto. +const ( + EnumDescriptorProto_Name_field_name protoreflect.Name = "name" + EnumDescriptorProto_Value_field_name protoreflect.Name = "value" + EnumDescriptorProto_Options_field_name protoreflect.Name = "options" + EnumDescriptorProto_ReservedRange_field_name protoreflect.Name = "reserved_range" + EnumDescriptorProto_ReservedName_field_name protoreflect.Name = "reserved_name" + + EnumDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.name" + EnumDescriptorProto_Value_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.value" + EnumDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.options" + EnumDescriptorProto_ReservedRange_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.reserved_range" + EnumDescriptorProto_ReservedName_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.reserved_name" +) + +// Field numbers for google.protobuf.EnumDescriptorProto. +const ( + EnumDescriptorProto_Name_field_number protoreflect.FieldNumber = 1 + EnumDescriptorProto_Value_field_number protoreflect.FieldNumber = 2 + EnumDescriptorProto_Options_field_number protoreflect.FieldNumber = 3 + EnumDescriptorProto_ReservedRange_field_number protoreflect.FieldNumber = 4 + EnumDescriptorProto_ReservedName_field_number protoreflect.FieldNumber = 5 +) + +// Names for google.protobuf.EnumDescriptorProto.EnumReservedRange. +const ( + EnumDescriptorProto_EnumReservedRange_message_name protoreflect.Name = "EnumReservedRange" + EnumDescriptorProto_EnumReservedRange_message_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.EnumReservedRange" +) + +// Field names for google.protobuf.EnumDescriptorProto.EnumReservedRange. +const ( + EnumDescriptorProto_EnumReservedRange_Start_field_name protoreflect.Name = "start" + EnumDescriptorProto_EnumReservedRange_End_field_name protoreflect.Name = "end" + + EnumDescriptorProto_EnumReservedRange_Start_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.EnumReservedRange.start" + EnumDescriptorProto_EnumReservedRange_End_field_fullname protoreflect.FullName = "google.protobuf.EnumDescriptorProto.EnumReservedRange.end" +) + +// Field numbers for google.protobuf.EnumDescriptorProto.EnumReservedRange. +const ( + EnumDescriptorProto_EnumReservedRange_Start_field_number protoreflect.FieldNumber = 1 + EnumDescriptorProto_EnumReservedRange_End_field_number protoreflect.FieldNumber = 2 +) + +// Names for google.protobuf.EnumValueDescriptorProto. +const ( + EnumValueDescriptorProto_message_name protoreflect.Name = "EnumValueDescriptorProto" + EnumValueDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto" +) + +// Field names for google.protobuf.EnumValueDescriptorProto. +const ( + EnumValueDescriptorProto_Name_field_name protoreflect.Name = "name" + EnumValueDescriptorProto_Number_field_name protoreflect.Name = "number" + EnumValueDescriptorProto_Options_field_name protoreflect.Name = "options" + + EnumValueDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto.name" + EnumValueDescriptorProto_Number_field_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto.number" + EnumValueDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.EnumValueDescriptorProto.options" +) + +// Field numbers for google.protobuf.EnumValueDescriptorProto. +const ( + EnumValueDescriptorProto_Name_field_number protoreflect.FieldNumber = 1 + EnumValueDescriptorProto_Number_field_number protoreflect.FieldNumber = 2 + EnumValueDescriptorProto_Options_field_number protoreflect.FieldNumber = 3 +) + +// Names for google.protobuf.ServiceDescriptorProto. +const ( + ServiceDescriptorProto_message_name protoreflect.Name = "ServiceDescriptorProto" + ServiceDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto" +) + +// Field names for google.protobuf.ServiceDescriptorProto. +const ( + ServiceDescriptorProto_Name_field_name protoreflect.Name = "name" + ServiceDescriptorProto_Method_field_name protoreflect.Name = "method" + ServiceDescriptorProto_Options_field_name protoreflect.Name = "options" + + ServiceDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto.name" + ServiceDescriptorProto_Method_field_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto.method" + ServiceDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.ServiceDescriptorProto.options" +) + +// Field numbers for google.protobuf.ServiceDescriptorProto. +const ( + ServiceDescriptorProto_Name_field_number protoreflect.FieldNumber = 1 + ServiceDescriptorProto_Method_field_number protoreflect.FieldNumber = 2 + ServiceDescriptorProto_Options_field_number protoreflect.FieldNumber = 3 +) + +// Names for google.protobuf.MethodDescriptorProto. +const ( + MethodDescriptorProto_message_name protoreflect.Name = "MethodDescriptorProto" + MethodDescriptorProto_message_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto" +) + +// Field names for google.protobuf.MethodDescriptorProto. +const ( + MethodDescriptorProto_Name_field_name protoreflect.Name = "name" + MethodDescriptorProto_InputType_field_name protoreflect.Name = "input_type" + MethodDescriptorProto_OutputType_field_name protoreflect.Name = "output_type" + MethodDescriptorProto_Options_field_name protoreflect.Name = "options" + MethodDescriptorProto_ClientStreaming_field_name protoreflect.Name = "client_streaming" + MethodDescriptorProto_ServerStreaming_field_name protoreflect.Name = "server_streaming" + + MethodDescriptorProto_Name_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.name" + MethodDescriptorProto_InputType_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.input_type" + MethodDescriptorProto_OutputType_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.output_type" + MethodDescriptorProto_Options_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.options" + MethodDescriptorProto_ClientStreaming_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.client_streaming" + MethodDescriptorProto_ServerStreaming_field_fullname protoreflect.FullName = "google.protobuf.MethodDescriptorProto.server_streaming" +) + +// Field numbers for google.protobuf.MethodDescriptorProto. +const ( + MethodDescriptorProto_Name_field_number protoreflect.FieldNumber = 1 + MethodDescriptorProto_InputType_field_number protoreflect.FieldNumber = 2 + MethodDescriptorProto_OutputType_field_number protoreflect.FieldNumber = 3 + MethodDescriptorProto_Options_field_number protoreflect.FieldNumber = 4 + MethodDescriptorProto_ClientStreaming_field_number protoreflect.FieldNumber = 5 + MethodDescriptorProto_ServerStreaming_field_number protoreflect.FieldNumber = 6 +) + +// Names for google.protobuf.FileOptions. +const ( + FileOptions_message_name protoreflect.Name = "FileOptions" + FileOptions_message_fullname protoreflect.FullName = "google.protobuf.FileOptions" +) + +// Field names for google.protobuf.FileOptions. +const ( + FileOptions_JavaPackage_field_name protoreflect.Name = "java_package" + FileOptions_JavaOuterClassname_field_name protoreflect.Name = "java_outer_classname" + FileOptions_JavaMultipleFiles_field_name protoreflect.Name = "java_multiple_files" + FileOptions_JavaGenerateEqualsAndHash_field_name protoreflect.Name = "java_generate_equals_and_hash" + FileOptions_JavaStringCheckUtf8_field_name protoreflect.Name = "java_string_check_utf8" + FileOptions_OptimizeFor_field_name protoreflect.Name = "optimize_for" + FileOptions_GoPackage_field_name protoreflect.Name = "go_package" + FileOptions_CcGenericServices_field_name protoreflect.Name = "cc_generic_services" + FileOptions_JavaGenericServices_field_name protoreflect.Name = "java_generic_services" + FileOptions_PyGenericServices_field_name protoreflect.Name = "py_generic_services" + FileOptions_PhpGenericServices_field_name protoreflect.Name = "php_generic_services" + FileOptions_Deprecated_field_name protoreflect.Name = "deprecated" + FileOptions_CcEnableArenas_field_name protoreflect.Name = "cc_enable_arenas" + FileOptions_ObjcClassPrefix_field_name protoreflect.Name = "objc_class_prefix" + FileOptions_CsharpNamespace_field_name protoreflect.Name = "csharp_namespace" + FileOptions_SwiftPrefix_field_name protoreflect.Name = "swift_prefix" + FileOptions_PhpClassPrefix_field_name protoreflect.Name = "php_class_prefix" + FileOptions_PhpNamespace_field_name protoreflect.Name = "php_namespace" + FileOptions_PhpMetadataNamespace_field_name protoreflect.Name = "php_metadata_namespace" + FileOptions_RubyPackage_field_name protoreflect.Name = "ruby_package" + FileOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + + FileOptions_JavaPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_package" + FileOptions_JavaOuterClassname_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_outer_classname" + FileOptions_JavaMultipleFiles_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_multiple_files" + FileOptions_JavaGenerateEqualsAndHash_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_generate_equals_and_hash" + FileOptions_JavaStringCheckUtf8_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_string_check_utf8" + FileOptions_OptimizeFor_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.optimize_for" + FileOptions_GoPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.go_package" + FileOptions_CcGenericServices_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.cc_generic_services" + FileOptions_JavaGenericServices_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.java_generic_services" + FileOptions_PyGenericServices_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.py_generic_services" + FileOptions_PhpGenericServices_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_generic_services" + FileOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.deprecated" + FileOptions_CcEnableArenas_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.cc_enable_arenas" + FileOptions_ObjcClassPrefix_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.objc_class_prefix" + FileOptions_CsharpNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.csharp_namespace" + FileOptions_SwiftPrefix_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.swift_prefix" + FileOptions_PhpClassPrefix_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_class_prefix" + FileOptions_PhpNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_namespace" + FileOptions_PhpMetadataNamespace_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.php_metadata_namespace" + FileOptions_RubyPackage_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.ruby_package" + FileOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FileOptions.uninterpreted_option" +) + +// Field numbers for google.protobuf.FileOptions. +const ( + FileOptions_JavaPackage_field_number protoreflect.FieldNumber = 1 + FileOptions_JavaOuterClassname_field_number protoreflect.FieldNumber = 8 + FileOptions_JavaMultipleFiles_field_number protoreflect.FieldNumber = 10 + FileOptions_JavaGenerateEqualsAndHash_field_number protoreflect.FieldNumber = 20 + FileOptions_JavaStringCheckUtf8_field_number protoreflect.FieldNumber = 27 + FileOptions_OptimizeFor_field_number protoreflect.FieldNumber = 9 + FileOptions_GoPackage_field_number protoreflect.FieldNumber = 11 + FileOptions_CcGenericServices_field_number protoreflect.FieldNumber = 16 + FileOptions_JavaGenericServices_field_number protoreflect.FieldNumber = 17 + FileOptions_PyGenericServices_field_number protoreflect.FieldNumber = 18 + FileOptions_PhpGenericServices_field_number protoreflect.FieldNumber = 42 + FileOptions_Deprecated_field_number protoreflect.FieldNumber = 23 + FileOptions_CcEnableArenas_field_number protoreflect.FieldNumber = 31 + FileOptions_ObjcClassPrefix_field_number protoreflect.FieldNumber = 36 + FileOptions_CsharpNamespace_field_number protoreflect.FieldNumber = 37 + FileOptions_SwiftPrefix_field_number protoreflect.FieldNumber = 39 + FileOptions_PhpClassPrefix_field_number protoreflect.FieldNumber = 40 + FileOptions_PhpNamespace_field_number protoreflect.FieldNumber = 41 + FileOptions_PhpMetadataNamespace_field_number protoreflect.FieldNumber = 44 + FileOptions_RubyPackage_field_number protoreflect.FieldNumber = 45 + FileOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 +) + +// Full and short names for google.protobuf.FileOptions.OptimizeMode. +const ( + FileOptions_OptimizeMode_enum_fullname = "google.protobuf.FileOptions.OptimizeMode" + FileOptions_OptimizeMode_enum_name = "OptimizeMode" +) + +// Names for google.protobuf.MessageOptions. +const ( + MessageOptions_message_name protoreflect.Name = "MessageOptions" + MessageOptions_message_fullname protoreflect.FullName = "google.protobuf.MessageOptions" +) + +// Field names for google.protobuf.MessageOptions. +const ( + MessageOptions_MessageSetWireFormat_field_name protoreflect.Name = "message_set_wire_format" + MessageOptions_NoStandardDescriptorAccessor_field_name protoreflect.Name = "no_standard_descriptor_accessor" + MessageOptions_Deprecated_field_name protoreflect.Name = "deprecated" + MessageOptions_MapEntry_field_name protoreflect.Name = "map_entry" + MessageOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + + MessageOptions_MessageSetWireFormat_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.message_set_wire_format" + MessageOptions_NoStandardDescriptorAccessor_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.no_standard_descriptor_accessor" + MessageOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.deprecated" + MessageOptions_MapEntry_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.map_entry" + MessageOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MessageOptions.uninterpreted_option" +) + +// Field numbers for google.protobuf.MessageOptions. +const ( + MessageOptions_MessageSetWireFormat_field_number protoreflect.FieldNumber = 1 + MessageOptions_NoStandardDescriptorAccessor_field_number protoreflect.FieldNumber = 2 + MessageOptions_Deprecated_field_number protoreflect.FieldNumber = 3 + MessageOptions_MapEntry_field_number protoreflect.FieldNumber = 7 + MessageOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 +) + +// Names for google.protobuf.FieldOptions. +const ( + FieldOptions_message_name protoreflect.Name = "FieldOptions" + FieldOptions_message_fullname protoreflect.FullName = "google.protobuf.FieldOptions" +) + +// Field names for google.protobuf.FieldOptions. +const ( + FieldOptions_Ctype_field_name protoreflect.Name = "ctype" + FieldOptions_Packed_field_name protoreflect.Name = "packed" + FieldOptions_Jstype_field_name protoreflect.Name = "jstype" + FieldOptions_Lazy_field_name protoreflect.Name = "lazy" + FieldOptions_Deprecated_field_name protoreflect.Name = "deprecated" + FieldOptions_Weak_field_name protoreflect.Name = "weak" + FieldOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + + FieldOptions_Ctype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.ctype" + FieldOptions_Packed_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.packed" + FieldOptions_Jstype_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.jstype" + FieldOptions_Lazy_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.lazy" + FieldOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.deprecated" + FieldOptions_Weak_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.weak" + FieldOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.FieldOptions.uninterpreted_option" +) + +// Field numbers for google.protobuf.FieldOptions. +const ( + FieldOptions_Ctype_field_number protoreflect.FieldNumber = 1 + FieldOptions_Packed_field_number protoreflect.FieldNumber = 2 + FieldOptions_Jstype_field_number protoreflect.FieldNumber = 6 + FieldOptions_Lazy_field_number protoreflect.FieldNumber = 5 + FieldOptions_Deprecated_field_number protoreflect.FieldNumber = 3 + FieldOptions_Weak_field_number protoreflect.FieldNumber = 10 + FieldOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 +) + +// Full and short names for google.protobuf.FieldOptions.CType. +const ( + FieldOptions_CType_enum_fullname = "google.protobuf.FieldOptions.CType" + FieldOptions_CType_enum_name = "CType" +) + +// Full and short names for google.protobuf.FieldOptions.JSType. +const ( + FieldOptions_JSType_enum_fullname = "google.protobuf.FieldOptions.JSType" + FieldOptions_JSType_enum_name = "JSType" +) + +// Names for google.protobuf.OneofOptions. +const ( + OneofOptions_message_name protoreflect.Name = "OneofOptions" + OneofOptions_message_fullname protoreflect.FullName = "google.protobuf.OneofOptions" +) + +// Field names for google.protobuf.OneofOptions. +const ( + OneofOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + + OneofOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.OneofOptions.uninterpreted_option" +) + +// Field numbers for google.protobuf.OneofOptions. +const ( + OneofOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 +) + +// Names for google.protobuf.EnumOptions. +const ( + EnumOptions_message_name protoreflect.Name = "EnumOptions" + EnumOptions_message_fullname protoreflect.FullName = "google.protobuf.EnumOptions" +) + +// Field names for google.protobuf.EnumOptions. +const ( + EnumOptions_AllowAlias_field_name protoreflect.Name = "allow_alias" + EnumOptions_Deprecated_field_name protoreflect.Name = "deprecated" + EnumOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + + EnumOptions_AllowAlias_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.allow_alias" + EnumOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.deprecated" + EnumOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumOptions.uninterpreted_option" +) + +// Field numbers for google.protobuf.EnumOptions. +const ( + EnumOptions_AllowAlias_field_number protoreflect.FieldNumber = 2 + EnumOptions_Deprecated_field_number protoreflect.FieldNumber = 3 + EnumOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 +) + +// Names for google.protobuf.EnumValueOptions. +const ( + EnumValueOptions_message_name protoreflect.Name = "EnumValueOptions" + EnumValueOptions_message_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions" +) + +// Field names for google.protobuf.EnumValueOptions. +const ( + EnumValueOptions_Deprecated_field_name protoreflect.Name = "deprecated" + EnumValueOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + + EnumValueOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.deprecated" + EnumValueOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.EnumValueOptions.uninterpreted_option" +) + +// Field numbers for google.protobuf.EnumValueOptions. +const ( + EnumValueOptions_Deprecated_field_number protoreflect.FieldNumber = 1 + EnumValueOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 +) + +// Names for google.protobuf.ServiceOptions. +const ( + ServiceOptions_message_name protoreflect.Name = "ServiceOptions" + ServiceOptions_message_fullname protoreflect.FullName = "google.protobuf.ServiceOptions" +) + +// Field names for google.protobuf.ServiceOptions. +const ( + ServiceOptions_Deprecated_field_name protoreflect.Name = "deprecated" + ServiceOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + + ServiceOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.deprecated" + ServiceOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.ServiceOptions.uninterpreted_option" +) + +// Field numbers for google.protobuf.ServiceOptions. +const ( + ServiceOptions_Deprecated_field_number protoreflect.FieldNumber = 33 + ServiceOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 +) + +// Names for google.protobuf.MethodOptions. +const ( + MethodOptions_message_name protoreflect.Name = "MethodOptions" + MethodOptions_message_fullname protoreflect.FullName = "google.protobuf.MethodOptions" +) + +// Field names for google.protobuf.MethodOptions. +const ( + MethodOptions_Deprecated_field_name protoreflect.Name = "deprecated" + MethodOptions_IdempotencyLevel_field_name protoreflect.Name = "idempotency_level" + MethodOptions_UninterpretedOption_field_name protoreflect.Name = "uninterpreted_option" + + MethodOptions_Deprecated_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.deprecated" + MethodOptions_IdempotencyLevel_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.idempotency_level" + MethodOptions_UninterpretedOption_field_fullname protoreflect.FullName = "google.protobuf.MethodOptions.uninterpreted_option" +) + +// Field numbers for google.protobuf.MethodOptions. +const ( + MethodOptions_Deprecated_field_number protoreflect.FieldNumber = 33 + MethodOptions_IdempotencyLevel_field_number protoreflect.FieldNumber = 34 + MethodOptions_UninterpretedOption_field_number protoreflect.FieldNumber = 999 +) + +// Full and short names for google.protobuf.MethodOptions.IdempotencyLevel. +const ( + MethodOptions_IdempotencyLevel_enum_fullname = "google.protobuf.MethodOptions.IdempotencyLevel" + MethodOptions_IdempotencyLevel_enum_name = "IdempotencyLevel" +) + +// Names for google.protobuf.UninterpretedOption. +const ( + UninterpretedOption_message_name protoreflect.Name = "UninterpretedOption" + UninterpretedOption_message_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption" +) + +// Field names for google.protobuf.UninterpretedOption. +const ( + UninterpretedOption_Name_field_name protoreflect.Name = "name" + UninterpretedOption_IdentifierValue_field_name protoreflect.Name = "identifier_value" + UninterpretedOption_PositiveIntValue_field_name protoreflect.Name = "positive_int_value" + UninterpretedOption_NegativeIntValue_field_name protoreflect.Name = "negative_int_value" + UninterpretedOption_DoubleValue_field_name protoreflect.Name = "double_value" + UninterpretedOption_StringValue_field_name protoreflect.Name = "string_value" + UninterpretedOption_AggregateValue_field_name protoreflect.Name = "aggregate_value" + + UninterpretedOption_Name_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.name" + UninterpretedOption_IdentifierValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.identifier_value" + UninterpretedOption_PositiveIntValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.positive_int_value" + UninterpretedOption_NegativeIntValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.negative_int_value" + UninterpretedOption_DoubleValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.double_value" + UninterpretedOption_StringValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.string_value" + UninterpretedOption_AggregateValue_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.aggregate_value" +) + +// Field numbers for google.protobuf.UninterpretedOption. +const ( + UninterpretedOption_Name_field_number protoreflect.FieldNumber = 2 + UninterpretedOption_IdentifierValue_field_number protoreflect.FieldNumber = 3 + UninterpretedOption_PositiveIntValue_field_number protoreflect.FieldNumber = 4 + UninterpretedOption_NegativeIntValue_field_number protoreflect.FieldNumber = 5 + UninterpretedOption_DoubleValue_field_number protoreflect.FieldNumber = 6 + UninterpretedOption_StringValue_field_number protoreflect.FieldNumber = 7 + UninterpretedOption_AggregateValue_field_number protoreflect.FieldNumber = 8 +) + +// Names for google.protobuf.UninterpretedOption.NamePart. +const ( + UninterpretedOption_NamePart_message_name protoreflect.Name = "NamePart" + UninterpretedOption_NamePart_message_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.NamePart" +) + +// Field names for google.protobuf.UninterpretedOption.NamePart. +const ( + UninterpretedOption_NamePart_NamePart_field_name protoreflect.Name = "name_part" + UninterpretedOption_NamePart_IsExtension_field_name protoreflect.Name = "is_extension" + + UninterpretedOption_NamePart_NamePart_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.NamePart.name_part" + UninterpretedOption_NamePart_IsExtension_field_fullname protoreflect.FullName = "google.protobuf.UninterpretedOption.NamePart.is_extension" +) + +// Field numbers for google.protobuf.UninterpretedOption.NamePart. +const ( + UninterpretedOption_NamePart_NamePart_field_number protoreflect.FieldNumber = 1 + UninterpretedOption_NamePart_IsExtension_field_number protoreflect.FieldNumber = 2 +) + +// Names for google.protobuf.SourceCodeInfo. +const ( + SourceCodeInfo_message_name protoreflect.Name = "SourceCodeInfo" + SourceCodeInfo_message_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo" +) + +// Field names for google.protobuf.SourceCodeInfo. +const ( + SourceCodeInfo_Location_field_name protoreflect.Name = "location" + + SourceCodeInfo_Location_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.location" +) + +// Field numbers for google.protobuf.SourceCodeInfo. +const ( + SourceCodeInfo_Location_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.SourceCodeInfo.Location. +const ( + SourceCodeInfo_Location_message_name protoreflect.Name = "Location" + SourceCodeInfo_Location_message_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location" +) + +// Field names for google.protobuf.SourceCodeInfo.Location. +const ( + SourceCodeInfo_Location_Path_field_name protoreflect.Name = "path" + SourceCodeInfo_Location_Span_field_name protoreflect.Name = "span" + SourceCodeInfo_Location_LeadingComments_field_name protoreflect.Name = "leading_comments" + SourceCodeInfo_Location_TrailingComments_field_name protoreflect.Name = "trailing_comments" + SourceCodeInfo_Location_LeadingDetachedComments_field_name protoreflect.Name = "leading_detached_comments" + + SourceCodeInfo_Location_Path_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.path" + SourceCodeInfo_Location_Span_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.span" + SourceCodeInfo_Location_LeadingComments_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.leading_comments" + SourceCodeInfo_Location_TrailingComments_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.trailing_comments" + SourceCodeInfo_Location_LeadingDetachedComments_field_fullname protoreflect.FullName = "google.protobuf.SourceCodeInfo.Location.leading_detached_comments" +) + +// Field numbers for google.protobuf.SourceCodeInfo.Location. +const ( + SourceCodeInfo_Location_Path_field_number protoreflect.FieldNumber = 1 + SourceCodeInfo_Location_Span_field_number protoreflect.FieldNumber = 2 + SourceCodeInfo_Location_LeadingComments_field_number protoreflect.FieldNumber = 3 + SourceCodeInfo_Location_TrailingComments_field_number protoreflect.FieldNumber = 4 + SourceCodeInfo_Location_LeadingDetachedComments_field_number protoreflect.FieldNumber = 6 +) + +// Names for google.protobuf.GeneratedCodeInfo. +const ( + GeneratedCodeInfo_message_name protoreflect.Name = "GeneratedCodeInfo" + GeneratedCodeInfo_message_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo" +) + +// Field names for google.protobuf.GeneratedCodeInfo. +const ( + GeneratedCodeInfo_Annotation_field_name protoreflect.Name = "annotation" + + GeneratedCodeInfo_Annotation_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.annotation" +) + +// Field numbers for google.protobuf.GeneratedCodeInfo. +const ( + GeneratedCodeInfo_Annotation_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.GeneratedCodeInfo.Annotation. +const ( + GeneratedCodeInfo_Annotation_message_name protoreflect.Name = "Annotation" + GeneratedCodeInfo_Annotation_message_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation" +) + +// Field names for google.protobuf.GeneratedCodeInfo.Annotation. +const ( + GeneratedCodeInfo_Annotation_Path_field_name protoreflect.Name = "path" + GeneratedCodeInfo_Annotation_SourceFile_field_name protoreflect.Name = "source_file" + GeneratedCodeInfo_Annotation_Begin_field_name protoreflect.Name = "begin" + GeneratedCodeInfo_Annotation_End_field_name protoreflect.Name = "end" + + GeneratedCodeInfo_Annotation_Path_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.path" + GeneratedCodeInfo_Annotation_SourceFile_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.source_file" + GeneratedCodeInfo_Annotation_Begin_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.begin" + GeneratedCodeInfo_Annotation_End_field_fullname protoreflect.FullName = "google.protobuf.GeneratedCodeInfo.Annotation.end" +) + +// Field numbers for google.protobuf.GeneratedCodeInfo.Annotation. +const ( + GeneratedCodeInfo_Annotation_Path_field_number protoreflect.FieldNumber = 1 + GeneratedCodeInfo_Annotation_SourceFile_field_number protoreflect.FieldNumber = 2 + GeneratedCodeInfo_Annotation_Begin_field_number protoreflect.FieldNumber = 3 + GeneratedCodeInfo_Annotation_End_field_number protoreflect.FieldNumber = 4 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/doc.go b/vendor/google.golang.org/protobuf/internal/genid/doc.go new file mode 100644 index 0000000000..45ccd01211 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/doc.go @@ -0,0 +1,11 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package genid contains constants for declarations in descriptor.proto +// and the well-known types. +package genid + +import protoreflect "google.golang.org/protobuf/reflect/protoreflect" + +const GoogleProtobuf_package protoreflect.FullName = "google.protobuf" diff --git a/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go b/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go new file mode 100644 index 0000000000..b070ef4fd6 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go @@ -0,0 +1,34 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_duration_proto = "google/protobuf/duration.proto" + +// Names for google.protobuf.Duration. +const ( + Duration_message_name protoreflect.Name = "Duration" + Duration_message_fullname protoreflect.FullName = "google.protobuf.Duration" +) + +// Field names for google.protobuf.Duration. +const ( + Duration_Seconds_field_name protoreflect.Name = "seconds" + Duration_Nanos_field_name protoreflect.Name = "nanos" + + Duration_Seconds_field_fullname protoreflect.FullName = "google.protobuf.Duration.seconds" + Duration_Nanos_field_fullname protoreflect.FullName = "google.protobuf.Duration.nanos" +) + +// Field numbers for google.protobuf.Duration. +const ( + Duration_Seconds_field_number protoreflect.FieldNumber = 1 + Duration_Nanos_field_number protoreflect.FieldNumber = 2 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go b/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go new file mode 100644 index 0000000000..762abb34a4 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go @@ -0,0 +1,19 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_empty_proto = "google/protobuf/empty.proto" + +// Names for google.protobuf.Empty. +const ( + Empty_message_name protoreflect.Name = "Empty" + Empty_message_fullname protoreflect.FullName = "google.protobuf.Empty" +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go b/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go new file mode 100644 index 0000000000..70bed453fe --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go @@ -0,0 +1,31 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_field_mask_proto = "google/protobuf/field_mask.proto" + +// Names for google.protobuf.FieldMask. +const ( + FieldMask_message_name protoreflect.Name = "FieldMask" + FieldMask_message_fullname protoreflect.FullName = "google.protobuf.FieldMask" +) + +// Field names for google.protobuf.FieldMask. +const ( + FieldMask_Paths_field_name protoreflect.Name = "paths" + + FieldMask_Paths_field_fullname protoreflect.FullName = "google.protobuf.FieldMask.paths" +) + +// Field numbers for google.protobuf.FieldMask. +const ( + FieldMask_Paths_field_number protoreflect.FieldNumber = 1 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/goname.go b/vendor/google.golang.org/protobuf/internal/genid/goname.go new file mode 100644 index 0000000000..693d2e9e1f --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/goname.go @@ -0,0 +1,25 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package genid + +// Go names of implementation-specific struct fields in generated messages. +const ( + State_goname = "state" + + SizeCache_goname = "sizeCache" + SizeCacheA_goname = "XXX_sizecache" + + WeakFields_goname = "weakFields" + WeakFieldsA_goname = "XXX_weak" + + UnknownFields_goname = "unknownFields" + UnknownFieldsA_goname = "XXX_unrecognized" + + ExtensionFields_goname = "extensionFields" + ExtensionFieldsA_goname = "XXX_InternalExtensions" + ExtensionFieldsB_goname = "XXX_extensions" + + WeakFieldPrefix_goname = "XXX_weak_" +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/map_entry.go b/vendor/google.golang.org/protobuf/internal/genid/map_entry.go new file mode 100644 index 0000000000..8f9ea02ff2 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/map_entry.go @@ -0,0 +1,16 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package genid + +import protoreflect "google.golang.org/protobuf/reflect/protoreflect" + +// Generic field names and numbers for synthetic map entry messages. +const ( + MapEntry_Key_field_name protoreflect.Name = "key" + MapEntry_Value_field_name protoreflect.Name = "value" + + MapEntry_Key_field_number protoreflect.FieldNumber = 1 + MapEntry_Value_field_number protoreflect.FieldNumber = 2 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go b/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go new file mode 100644 index 0000000000..3e99ae16c8 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go @@ -0,0 +1,31 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_source_context_proto = "google/protobuf/source_context.proto" + +// Names for google.protobuf.SourceContext. +const ( + SourceContext_message_name protoreflect.Name = "SourceContext" + SourceContext_message_fullname protoreflect.FullName = "google.protobuf.SourceContext" +) + +// Field names for google.protobuf.SourceContext. +const ( + SourceContext_FileName_field_name protoreflect.Name = "file_name" + + SourceContext_FileName_field_fullname protoreflect.FullName = "google.protobuf.SourceContext.file_name" +) + +// Field numbers for google.protobuf.SourceContext. +const ( + SourceContext_FileName_field_number protoreflect.FieldNumber = 1 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go b/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go new file mode 100644 index 0000000000..1a38944b26 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go @@ -0,0 +1,116 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_struct_proto = "google/protobuf/struct.proto" + +// Full and short names for google.protobuf.NullValue. +const ( + NullValue_enum_fullname = "google.protobuf.NullValue" + NullValue_enum_name = "NullValue" +) + +// Names for google.protobuf.Struct. +const ( + Struct_message_name protoreflect.Name = "Struct" + Struct_message_fullname protoreflect.FullName = "google.protobuf.Struct" +) + +// Field names for google.protobuf.Struct. +const ( + Struct_Fields_field_name protoreflect.Name = "fields" + + Struct_Fields_field_fullname protoreflect.FullName = "google.protobuf.Struct.fields" +) + +// Field numbers for google.protobuf.Struct. +const ( + Struct_Fields_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.Struct.FieldsEntry. +const ( + Struct_FieldsEntry_message_name protoreflect.Name = "FieldsEntry" + Struct_FieldsEntry_message_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry" +) + +// Field names for google.protobuf.Struct.FieldsEntry. +const ( + Struct_FieldsEntry_Key_field_name protoreflect.Name = "key" + Struct_FieldsEntry_Value_field_name protoreflect.Name = "value" + + Struct_FieldsEntry_Key_field_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry.key" + Struct_FieldsEntry_Value_field_fullname protoreflect.FullName = "google.protobuf.Struct.FieldsEntry.value" +) + +// Field numbers for google.protobuf.Struct.FieldsEntry. +const ( + Struct_FieldsEntry_Key_field_number protoreflect.FieldNumber = 1 + Struct_FieldsEntry_Value_field_number protoreflect.FieldNumber = 2 +) + +// Names for google.protobuf.Value. +const ( + Value_message_name protoreflect.Name = "Value" + Value_message_fullname protoreflect.FullName = "google.protobuf.Value" +) + +// Field names for google.protobuf.Value. +const ( + Value_NullValue_field_name protoreflect.Name = "null_value" + Value_NumberValue_field_name protoreflect.Name = "number_value" + Value_StringValue_field_name protoreflect.Name = "string_value" + Value_BoolValue_field_name protoreflect.Name = "bool_value" + Value_StructValue_field_name protoreflect.Name = "struct_value" + Value_ListValue_field_name protoreflect.Name = "list_value" + + Value_NullValue_field_fullname protoreflect.FullName = "google.protobuf.Value.null_value" + Value_NumberValue_field_fullname protoreflect.FullName = "google.protobuf.Value.number_value" + Value_StringValue_field_fullname protoreflect.FullName = "google.protobuf.Value.string_value" + Value_BoolValue_field_fullname protoreflect.FullName = "google.protobuf.Value.bool_value" + Value_StructValue_field_fullname protoreflect.FullName = "google.protobuf.Value.struct_value" + Value_ListValue_field_fullname protoreflect.FullName = "google.protobuf.Value.list_value" +) + +// Field numbers for google.protobuf.Value. +const ( + Value_NullValue_field_number protoreflect.FieldNumber = 1 + Value_NumberValue_field_number protoreflect.FieldNumber = 2 + Value_StringValue_field_number protoreflect.FieldNumber = 3 + Value_BoolValue_field_number protoreflect.FieldNumber = 4 + Value_StructValue_field_number protoreflect.FieldNumber = 5 + Value_ListValue_field_number protoreflect.FieldNumber = 6 +) + +// Oneof names for google.protobuf.Value. +const ( + Value_Kind_oneof_name protoreflect.Name = "kind" + + Value_Kind_oneof_fullname protoreflect.FullName = "google.protobuf.Value.kind" +) + +// Names for google.protobuf.ListValue. +const ( + ListValue_message_name protoreflect.Name = "ListValue" + ListValue_message_fullname protoreflect.FullName = "google.protobuf.ListValue" +) + +// Field names for google.protobuf.ListValue. +const ( + ListValue_Values_field_name protoreflect.Name = "values" + + ListValue_Values_field_fullname protoreflect.FullName = "google.protobuf.ListValue.values" +) + +// Field numbers for google.protobuf.ListValue. +const ( + ListValue_Values_field_number protoreflect.FieldNumber = 1 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go b/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go new file mode 100644 index 0000000000..f5cd5634c2 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go @@ -0,0 +1,34 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_timestamp_proto = "google/protobuf/timestamp.proto" + +// Names for google.protobuf.Timestamp. +const ( + Timestamp_message_name protoreflect.Name = "Timestamp" + Timestamp_message_fullname protoreflect.FullName = "google.protobuf.Timestamp" +) + +// Field names for google.protobuf.Timestamp. +const ( + Timestamp_Seconds_field_name protoreflect.Name = "seconds" + Timestamp_Nanos_field_name protoreflect.Name = "nanos" + + Timestamp_Seconds_field_fullname protoreflect.FullName = "google.protobuf.Timestamp.seconds" + Timestamp_Nanos_field_fullname protoreflect.FullName = "google.protobuf.Timestamp.nanos" +) + +// Field numbers for google.protobuf.Timestamp. +const ( + Timestamp_Seconds_field_number protoreflect.FieldNumber = 1 + Timestamp_Nanos_field_number protoreflect.FieldNumber = 2 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/type_gen.go b/vendor/google.golang.org/protobuf/internal/genid/type_gen.go new file mode 100644 index 0000000000..3bc710138a --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/type_gen.go @@ -0,0 +1,184 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_type_proto = "google/protobuf/type.proto" + +// Full and short names for google.protobuf.Syntax. +const ( + Syntax_enum_fullname = "google.protobuf.Syntax" + Syntax_enum_name = "Syntax" +) + +// Names for google.protobuf.Type. +const ( + Type_message_name protoreflect.Name = "Type" + Type_message_fullname protoreflect.FullName = "google.protobuf.Type" +) + +// Field names for google.protobuf.Type. +const ( + Type_Name_field_name protoreflect.Name = "name" + Type_Fields_field_name protoreflect.Name = "fields" + Type_Oneofs_field_name protoreflect.Name = "oneofs" + Type_Options_field_name protoreflect.Name = "options" + Type_SourceContext_field_name protoreflect.Name = "source_context" + Type_Syntax_field_name protoreflect.Name = "syntax" + + Type_Name_field_fullname protoreflect.FullName = "google.protobuf.Type.name" + Type_Fields_field_fullname protoreflect.FullName = "google.protobuf.Type.fields" + Type_Oneofs_field_fullname protoreflect.FullName = "google.protobuf.Type.oneofs" + Type_Options_field_fullname protoreflect.FullName = "google.protobuf.Type.options" + Type_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Type.source_context" + Type_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Type.syntax" +) + +// Field numbers for google.protobuf.Type. +const ( + Type_Name_field_number protoreflect.FieldNumber = 1 + Type_Fields_field_number protoreflect.FieldNumber = 2 + Type_Oneofs_field_number protoreflect.FieldNumber = 3 + Type_Options_field_number protoreflect.FieldNumber = 4 + Type_SourceContext_field_number protoreflect.FieldNumber = 5 + Type_Syntax_field_number protoreflect.FieldNumber = 6 +) + +// Names for google.protobuf.Field. +const ( + Field_message_name protoreflect.Name = "Field" + Field_message_fullname protoreflect.FullName = "google.protobuf.Field" +) + +// Field names for google.protobuf.Field. +const ( + Field_Kind_field_name protoreflect.Name = "kind" + Field_Cardinality_field_name protoreflect.Name = "cardinality" + Field_Number_field_name protoreflect.Name = "number" + Field_Name_field_name protoreflect.Name = "name" + Field_TypeUrl_field_name protoreflect.Name = "type_url" + Field_OneofIndex_field_name protoreflect.Name = "oneof_index" + Field_Packed_field_name protoreflect.Name = "packed" + Field_Options_field_name protoreflect.Name = "options" + Field_JsonName_field_name protoreflect.Name = "json_name" + Field_DefaultValue_field_name protoreflect.Name = "default_value" + + Field_Kind_field_fullname protoreflect.FullName = "google.protobuf.Field.kind" + Field_Cardinality_field_fullname protoreflect.FullName = "google.protobuf.Field.cardinality" + Field_Number_field_fullname protoreflect.FullName = "google.protobuf.Field.number" + Field_Name_field_fullname protoreflect.FullName = "google.protobuf.Field.name" + Field_TypeUrl_field_fullname protoreflect.FullName = "google.protobuf.Field.type_url" + Field_OneofIndex_field_fullname protoreflect.FullName = "google.protobuf.Field.oneof_index" + Field_Packed_field_fullname protoreflect.FullName = "google.protobuf.Field.packed" + Field_Options_field_fullname protoreflect.FullName = "google.protobuf.Field.options" + Field_JsonName_field_fullname protoreflect.FullName = "google.protobuf.Field.json_name" + Field_DefaultValue_field_fullname protoreflect.FullName = "google.protobuf.Field.default_value" +) + +// Field numbers for google.protobuf.Field. +const ( + Field_Kind_field_number protoreflect.FieldNumber = 1 + Field_Cardinality_field_number protoreflect.FieldNumber = 2 + Field_Number_field_number protoreflect.FieldNumber = 3 + Field_Name_field_number protoreflect.FieldNumber = 4 + Field_TypeUrl_field_number protoreflect.FieldNumber = 6 + Field_OneofIndex_field_number protoreflect.FieldNumber = 7 + Field_Packed_field_number protoreflect.FieldNumber = 8 + Field_Options_field_number protoreflect.FieldNumber = 9 + Field_JsonName_field_number protoreflect.FieldNumber = 10 + Field_DefaultValue_field_number protoreflect.FieldNumber = 11 +) + +// Full and short names for google.protobuf.Field.Kind. +const ( + Field_Kind_enum_fullname = "google.protobuf.Field.Kind" + Field_Kind_enum_name = "Kind" +) + +// Full and short names for google.protobuf.Field.Cardinality. +const ( + Field_Cardinality_enum_fullname = "google.protobuf.Field.Cardinality" + Field_Cardinality_enum_name = "Cardinality" +) + +// Names for google.protobuf.Enum. +const ( + Enum_message_name protoreflect.Name = "Enum" + Enum_message_fullname protoreflect.FullName = "google.protobuf.Enum" +) + +// Field names for google.protobuf.Enum. +const ( + Enum_Name_field_name protoreflect.Name = "name" + Enum_Enumvalue_field_name protoreflect.Name = "enumvalue" + Enum_Options_field_name protoreflect.Name = "options" + Enum_SourceContext_field_name protoreflect.Name = "source_context" + Enum_Syntax_field_name protoreflect.Name = "syntax" + + Enum_Name_field_fullname protoreflect.FullName = "google.protobuf.Enum.name" + Enum_Enumvalue_field_fullname protoreflect.FullName = "google.protobuf.Enum.enumvalue" + Enum_Options_field_fullname protoreflect.FullName = "google.protobuf.Enum.options" + Enum_SourceContext_field_fullname protoreflect.FullName = "google.protobuf.Enum.source_context" + Enum_Syntax_field_fullname protoreflect.FullName = "google.protobuf.Enum.syntax" +) + +// Field numbers for google.protobuf.Enum. +const ( + Enum_Name_field_number protoreflect.FieldNumber = 1 + Enum_Enumvalue_field_number protoreflect.FieldNumber = 2 + Enum_Options_field_number protoreflect.FieldNumber = 3 + Enum_SourceContext_field_number protoreflect.FieldNumber = 4 + Enum_Syntax_field_number protoreflect.FieldNumber = 5 +) + +// Names for google.protobuf.EnumValue. +const ( + EnumValue_message_name protoreflect.Name = "EnumValue" + EnumValue_message_fullname protoreflect.FullName = "google.protobuf.EnumValue" +) + +// Field names for google.protobuf.EnumValue. +const ( + EnumValue_Name_field_name protoreflect.Name = "name" + EnumValue_Number_field_name protoreflect.Name = "number" + EnumValue_Options_field_name protoreflect.Name = "options" + + EnumValue_Name_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.name" + EnumValue_Number_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.number" + EnumValue_Options_field_fullname protoreflect.FullName = "google.protobuf.EnumValue.options" +) + +// Field numbers for google.protobuf.EnumValue. +const ( + EnumValue_Name_field_number protoreflect.FieldNumber = 1 + EnumValue_Number_field_number protoreflect.FieldNumber = 2 + EnumValue_Options_field_number protoreflect.FieldNumber = 3 +) + +// Names for google.protobuf.Option. +const ( + Option_message_name protoreflect.Name = "Option" + Option_message_fullname protoreflect.FullName = "google.protobuf.Option" +) + +// Field names for google.protobuf.Option. +const ( + Option_Name_field_name protoreflect.Name = "name" + Option_Value_field_name protoreflect.Name = "value" + + Option_Name_field_fullname protoreflect.FullName = "google.protobuf.Option.name" + Option_Value_field_fullname protoreflect.FullName = "google.protobuf.Option.value" +) + +// Field numbers for google.protobuf.Option. +const ( + Option_Name_field_number protoreflect.FieldNumber = 1 + Option_Value_field_number protoreflect.FieldNumber = 2 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/wrappers.go b/vendor/google.golang.org/protobuf/internal/genid/wrappers.go new file mode 100644 index 0000000000..429384b85b --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/wrappers.go @@ -0,0 +1,13 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package genid + +import protoreflect "google.golang.org/protobuf/reflect/protoreflect" + +// Generic field name and number for messages in wrappers.proto. +const ( + WrapperValue_Value_field_name protoreflect.Name = "value" + WrapperValue_Value_field_number protoreflect.FieldNumber = 1 +) diff --git a/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go b/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go new file mode 100644 index 0000000000..72527d2ab0 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go @@ -0,0 +1,175 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-protos. DO NOT EDIT. + +package genid + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" +) + +const File_google_protobuf_wrappers_proto = "google/protobuf/wrappers.proto" + +// Names for google.protobuf.DoubleValue. +const ( + DoubleValue_message_name protoreflect.Name = "DoubleValue" + DoubleValue_message_fullname protoreflect.FullName = "google.protobuf.DoubleValue" +) + +// Field names for google.protobuf.DoubleValue. +const ( + DoubleValue_Value_field_name protoreflect.Name = "value" + + DoubleValue_Value_field_fullname protoreflect.FullName = "google.protobuf.DoubleValue.value" +) + +// Field numbers for google.protobuf.DoubleValue. +const ( + DoubleValue_Value_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.FloatValue. +const ( + FloatValue_message_name protoreflect.Name = "FloatValue" + FloatValue_message_fullname protoreflect.FullName = "google.protobuf.FloatValue" +) + +// Field names for google.protobuf.FloatValue. +const ( + FloatValue_Value_field_name protoreflect.Name = "value" + + FloatValue_Value_field_fullname protoreflect.FullName = "google.protobuf.FloatValue.value" +) + +// Field numbers for google.protobuf.FloatValue. +const ( + FloatValue_Value_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.Int64Value. +const ( + Int64Value_message_name protoreflect.Name = "Int64Value" + Int64Value_message_fullname protoreflect.FullName = "google.protobuf.Int64Value" +) + +// Field names for google.protobuf.Int64Value. +const ( + Int64Value_Value_field_name protoreflect.Name = "value" + + Int64Value_Value_field_fullname protoreflect.FullName = "google.protobuf.Int64Value.value" +) + +// Field numbers for google.protobuf.Int64Value. +const ( + Int64Value_Value_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.UInt64Value. +const ( + UInt64Value_message_name protoreflect.Name = "UInt64Value" + UInt64Value_message_fullname protoreflect.FullName = "google.protobuf.UInt64Value" +) + +// Field names for google.protobuf.UInt64Value. +const ( + UInt64Value_Value_field_name protoreflect.Name = "value" + + UInt64Value_Value_field_fullname protoreflect.FullName = "google.protobuf.UInt64Value.value" +) + +// Field numbers for google.protobuf.UInt64Value. +const ( + UInt64Value_Value_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.Int32Value. +const ( + Int32Value_message_name protoreflect.Name = "Int32Value" + Int32Value_message_fullname protoreflect.FullName = "google.protobuf.Int32Value" +) + +// Field names for google.protobuf.Int32Value. +const ( + Int32Value_Value_field_name protoreflect.Name = "value" + + Int32Value_Value_field_fullname protoreflect.FullName = "google.protobuf.Int32Value.value" +) + +// Field numbers for google.protobuf.Int32Value. +const ( + Int32Value_Value_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.UInt32Value. +const ( + UInt32Value_message_name protoreflect.Name = "UInt32Value" + UInt32Value_message_fullname protoreflect.FullName = "google.protobuf.UInt32Value" +) + +// Field names for google.protobuf.UInt32Value. +const ( + UInt32Value_Value_field_name protoreflect.Name = "value" + + UInt32Value_Value_field_fullname protoreflect.FullName = "google.protobuf.UInt32Value.value" +) + +// Field numbers for google.protobuf.UInt32Value. +const ( + UInt32Value_Value_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.BoolValue. +const ( + BoolValue_message_name protoreflect.Name = "BoolValue" + BoolValue_message_fullname protoreflect.FullName = "google.protobuf.BoolValue" +) + +// Field names for google.protobuf.BoolValue. +const ( + BoolValue_Value_field_name protoreflect.Name = "value" + + BoolValue_Value_field_fullname protoreflect.FullName = "google.protobuf.BoolValue.value" +) + +// Field numbers for google.protobuf.BoolValue. +const ( + BoolValue_Value_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.StringValue. +const ( + StringValue_message_name protoreflect.Name = "StringValue" + StringValue_message_fullname protoreflect.FullName = "google.protobuf.StringValue" +) + +// Field names for google.protobuf.StringValue. +const ( + StringValue_Value_field_name protoreflect.Name = "value" + + StringValue_Value_field_fullname protoreflect.FullName = "google.protobuf.StringValue.value" +) + +// Field numbers for google.protobuf.StringValue. +const ( + StringValue_Value_field_number protoreflect.FieldNumber = 1 +) + +// Names for google.protobuf.BytesValue. +const ( + BytesValue_message_name protoreflect.Name = "BytesValue" + BytesValue_message_fullname protoreflect.FullName = "google.protobuf.BytesValue" +) + +// Field names for google.protobuf.BytesValue. +const ( + BytesValue_Value_field_name protoreflect.Name = "value" + + BytesValue_Value_field_fullname protoreflect.FullName = "google.protobuf.BytesValue.value" +) + +// Field numbers for google.protobuf.BytesValue. +const ( + BytesValue_Value_field_number protoreflect.FieldNumber = 1 +) diff --git a/vendor/google.golang.org/protobuf/internal/genname/name.go b/vendor/google.golang.org/protobuf/internal/genname/name.go deleted file mode 100644 index f45509fbdf..0000000000 --- a/vendor/google.golang.org/protobuf/internal/genname/name.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2019 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package genname contains constants for generated names. -package genname - -const ( - State = "state" - - SizeCache = "sizeCache" - SizeCacheA = "XXX_sizecache" - - WeakFields = "weakFields" - WeakFieldsA = "XXX_weak" - - UnknownFields = "unknownFields" - UnknownFieldsA = "XXX_unrecognized" - - ExtensionFields = "extensionFields" - ExtensionFieldsA = "XXX_InternalExtensions" - ExtensionFieldsB = "XXX_extensions" - - WeakFieldPrefix = "XXX_weak_" -) diff --git a/vendor/google.golang.org/protobuf/internal/impl/api_export.go b/vendor/google.golang.org/protobuf/internal/impl/api_export.go index 4d22c96042..b5974528db 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/api_export.go +++ b/vendor/google.golang.org/protobuf/internal/impl/api_export.go @@ -10,6 +10,7 @@ import ( "strconv" "google.golang.org/protobuf/encoding/prototext" + "google.golang.org/protobuf/internal/errors" "google.golang.org/protobuf/proto" pref "google.golang.org/protobuf/reflect/protoreflect" piface "google.golang.org/protobuf/runtime/protoiface" @@ -19,6 +20,12 @@ import ( // functions that we do not want to appear in godoc. type Export struct{} +// NewError formats a string according to the format specifier and arguments and +// returns an error that has a "proto" prefix. +func (Export) NewError(f string, x ...interface{}) error { + return errors.New(f, x...) +} + // enum is any enum type generated by protoc-gen-go // and must be a named int32 type. type enum = interface{} diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go index 35a67c25bf..44885a761f 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_map.go @@ -10,6 +10,7 @@ import ( "sort" "google.golang.org/protobuf/encoding/protowire" + "google.golang.org/protobuf/internal/genid" pref "google.golang.org/protobuf/reflect/protoreflect" ) @@ -134,7 +135,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo b = b[n:] err := errUnknown switch num { - case 1: + case genid.MapEntry_Key_field_number: var v pref.Value var o unmarshalOutput v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) @@ -143,7 +144,7 @@ func consumeMap(b []byte, mapv reflect.Value, wtyp protowire.Type, mapi *mapInfo } key = v n = o.n - case 2: + case genid.MapEntry_Value_field_number: var v pref.Value var o unmarshalOutput v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts) diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go index 29ed59b445..0e176d565d 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go @@ -31,11 +31,6 @@ type coderMessageInfo struct { needsInitCheck bool isMessageSet bool numRequiredFields uint8 - - // Include space for a number of coderFieldInfos to improve cache locality. - // The number of entries is chosen through a combination of guesswork and - // empirical testing. - coderFieldBuf [32]coderFieldInfo } type coderFieldInfo struct { @@ -58,7 +53,7 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { mi.coderFields = make(map[protowire.Number]*coderFieldInfo) fields := mi.Desc.Fields() - preallocFields := mi.coderFieldBuf[:] + preallocFields := make([]coderFieldInfo, fields.Len()) for i := 0; i < fields.Len(); i++ { fd := fields.Get(i) @@ -87,13 +82,7 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { fieldOffset = offsetOf(fs, mi.Exporter) childMessage, funcs = fieldCoder(fd, ft) } - var cf *coderFieldInfo - if len(preallocFields) > 0 { - cf = &preallocFields[0] - preallocFields = preallocFields[1:] - } else { - cf = new(coderFieldInfo) - } + cf := &preallocFields[i] *cf = coderFieldInfo{ num: fd.Number(), offset: fieldOffset, diff --git a/vendor/google.golang.org/protobuf/internal/impl/message.go b/vendor/google.golang.org/protobuf/internal/impl/message.go index 7dd994bd95..c026a98180 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message.go @@ -12,7 +12,7 @@ import ( "sync" "sync/atomic" - "google.golang.org/protobuf/internal/genname" + "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/reflect/protoreflect" pref "google.golang.org/protobuf/reflect/protoreflect" ) @@ -148,19 +148,19 @@ func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo { fieldLoop: for i := 0; i < t.NumField(); i++ { switch f := t.Field(i); f.Name { - case genname.SizeCache, genname.SizeCacheA: + case genid.SizeCache_goname, genid.SizeCacheA_goname: if f.Type == sizecacheType { si.sizecacheOffset = offsetOf(f, mi.Exporter) } - case genname.WeakFields, genname.WeakFieldsA: + case genid.WeakFields_goname, genid.WeakFieldsA_goname: if f.Type == weakFieldsType { si.weakOffset = offsetOf(f, mi.Exporter) } - case genname.UnknownFields, genname.UnknownFieldsA: + case genid.UnknownFields_goname, genid.UnknownFieldsA_goname: if f.Type == unknownFieldsType { si.unknownOffset = offsetOf(f, mi.Exporter) } - case genname.ExtensionFields, genname.ExtensionFieldsA, genname.ExtensionFieldsB: + case genid.ExtensionFields_goname, genid.ExtensionFieldsA_goname, genid.ExtensionFieldsB_goname: if f.Type == extensionFieldsType { si.extensionOffset = offsetOf(f, mi.Exporter) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go index 3eb2b1390f..0f4b8db760 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go @@ -338,24 +338,27 @@ func (mi *MessageInfo) checkField(fd pref.FieldDescriptor) (*fieldInfo, pref.Ext } if fi != nil { if fi.fieldDesc != fd { - panic("mismatching field descriptor") + if got, want := fd.FullName(), fi.fieldDesc.FullName(); got != want { + panic(fmt.Sprintf("mismatching field: got %v, want %v", got, want)) + } + panic(fmt.Sprintf("mismatching field: %v", fd.FullName())) } return fi, nil } if fd.IsExtension() { - if fd.ContainingMessage().FullName() != mi.Desc.FullName() { + if got, want := fd.ContainingMessage().FullName(), mi.Desc.FullName(); got != want { // TODO: Should this be exact containing message descriptor match? - panic("mismatching containing message") + panic(fmt.Sprintf("extension %v has mismatching containing message: got %v, want %v", fd.FullName(), got, want)) } if !mi.Desc.ExtensionRanges().Has(fd.Number()) { - panic("invalid extension field") + panic(fmt.Sprintf("extension %v extends %v outside the extension range", fd.FullName(), mi.Desc.FullName())) } xtd, ok := fd.(pref.ExtensionTypeDescriptor) if !ok { - panic("extension descriptor does not implement ExtensionTypeDescriptor") + panic(fmt.Sprintf("extension %v does not implement protoreflect.ExtensionTypeDescriptor", fd.FullName())) } return nil, xtd.Type() } - panic("invalid field descriptor") + panic(fmt.Sprintf("field %v is invalid", fd.FullName())) } diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go index ea6f75548a..23124a86e4 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go @@ -31,13 +31,13 @@ type fieldInfo struct { func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x exporter, ot reflect.Type) fieldInfo { ft := fs.Type if ft.Kind() != reflect.Interface { - panic(fmt.Sprintf("invalid type: got %v, want interface kind", ft)) + panic(fmt.Sprintf("field %v has invalid type: got %v, want interface kind", fd.FullName(), ft)) } if ot.Kind() != reflect.Struct { - panic(fmt.Sprintf("invalid type: got %v, want struct kind", ot)) + panic(fmt.Sprintf("field %v has invalid type: got %v, want struct kind", fd.FullName(), ot)) } if !reflect.PtrTo(ot).Implements(ft) { - panic(fmt.Sprintf("invalid type: %v does not implement %v", ot, ft)) + panic(fmt.Sprintf("field %v has invalid type: %v does not implement %v", fd.FullName(), ot, ft)) } conv := NewConverter(ot.Field(0).Type, fd) isMessage := fd.Message() != nil @@ -90,7 +90,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export }, mutable: func(p pointer) pref.Value { if !isMessage { - panic("invalid Mutable on field with non-composite type") + panic(fmt.Sprintf("field %v with invalid Mutable call on field with non-composite type", fd.FullName())) } rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if rv.IsNil() || rv.Elem().Type().Elem() != ot || rv.Elem().IsNil() { @@ -114,7 +114,7 @@ func fieldInfoForOneof(fd pref.FieldDescriptor, fs reflect.StructField, x export func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type if ft.Kind() != reflect.Map { - panic(fmt.Sprintf("invalid type: got %v, want map kind", ft)) + panic(fmt.Sprintf("field %v has invalid type: got %v, want map kind", fd.FullName(), ft)) } conv := NewConverter(ft, fd) @@ -147,7 +147,7 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() pv := conv.GoValueOf(v) if pv.IsNil() { - panic(fmt.Sprintf("invalid value: setting map field to read-only value")) + panic(fmt.Sprintf("map field %v cannot be set with read-only value", fd.FullName())) } rv.Set(pv) }, @@ -167,7 +167,7 @@ func fieldInfoForMap(fd pref.FieldDescriptor, fs reflect.StructField, x exporter func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporter) fieldInfo { ft := fs.Type if ft.Kind() != reflect.Slice { - panic(fmt.Sprintf("invalid type: got %v, want slice kind", ft)) + panic(fmt.Sprintf("field %v has invalid type: got %v, want slice kind", fd.FullName(), ft)) } conv := NewConverter(reflect.PtrTo(ft), fd) @@ -200,7 +200,7 @@ func fieldInfoForList(fd pref.FieldDescriptor, fs reflect.StructField, x exporte rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() pv := conv.GoValueOf(v) if pv.IsNil() { - panic(fmt.Sprintf("invalid value: setting repeated field to read-only value")) + panic(fmt.Sprintf("list field %v cannot be set with read-only value", fd.FullName())) } rv.Set(pv.Elem()) }, @@ -225,7 +225,7 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor isBytes := ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 if nullable { if ft.Kind() != reflect.Ptr && ft.Kind() != reflect.Slice { - panic(fmt.Sprintf("invalid type: got %v, want pointer", ft)) + panic(fmt.Sprintf("field %v has invalid type: got %v, want pointer", fd.FullName(), ft)) } if ft.Kind() == reflect.Ptr { ft = ft.Elem() @@ -257,7 +257,7 @@ func fieldInfoForScalar(fd pref.FieldDescriptor, fs reflect.StructField, x expor case reflect.String, reflect.Slice: return rv.Len() > 0 default: - panic(fmt.Sprintf("invalid type: %v", rv.Type())) // should never happen + panic(fmt.Sprintf("field %v has invalid type: %v", fd.FullName(), rv.Type())) // should never happen } }, clear: func(p pointer) { @@ -314,7 +314,7 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn messageName := fd.Message().FullName() messageType, _ = preg.GlobalTypes.FindMessageByName(messageName) if messageType == nil { - panic(fmt.Sprintf("weak message %v is not linked in", messageName)) + panic(fmt.Sprintf("weak message %v for field %v is not linked in", messageName, fd.FullName())) } }) } @@ -347,7 +347,10 @@ func fieldInfoForWeakMessage(fd pref.FieldDescriptor, weakOffset offset) fieldIn lazyInit() m := v.Message() if m.Descriptor() != messageType.Descriptor() { - panic("mismatching message descriptor") + if got, want := m.Descriptor().FullName(), messageType.Descriptor().FullName(); got != want { + panic(fmt.Sprintf("field %v has mismatching message descriptor: got %v, want %v", fd.FullName(), got, want)) + } + panic(fmt.Sprintf("field %v has mismatching message descriptor: %v", fd.FullName(), m.Descriptor().FullName())) } p.Apply(weakOffset).WeakFields().set(num, m.Interface()) }, @@ -402,7 +405,7 @@ func fieldInfoForMessage(fd pref.FieldDescriptor, fs reflect.StructField, x expo rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(conv.GoValueOf(v)) if rv.IsNil() { - panic("invalid nil pointer") + panic(fmt.Sprintf("field %v has invalid nil pointer", fd.FullName())) } }, mutable: func(p pointer) pref.Value { diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go index 7d65f5ca28..741d6e5b6b 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go @@ -114,7 +114,7 @@ func (m *messageState) WhichOneof(od protoreflect.OneofDescriptor) protoreflect. if oi := m.messageInfo().oneofs[od.Name()]; oi != nil && oi.oneofDesc == od { return od.Fields().ByNumber(oi.which(m.pointer())) } - panic("invalid oneof descriptor") + panic("invalid oneof descriptor " + string(od.FullName()) + " for message " + string(m.Descriptor().FullName())) } func (m *messageState) GetUnknown() protoreflect.RawFields { m.messageInfo().init() @@ -234,7 +234,7 @@ func (m *messageReflectWrapper) WhichOneof(od protoreflect.OneofDescriptor) prot if oi := m.messageInfo().oneofs[od.Name()]; oi != nil && oi.oneofDesc == od { return od.Fields().ByNumber(oi.which(m.pointer())) } - panic("invalid oneof descriptor") + panic("invalid oneof descriptor " + string(od.FullName()) + " for message " + string(m.Descriptor().FullName())) } func (m *messageReflectWrapper) GetUnknown() protoreflect.RawFields { m.messageInfo().init() diff --git a/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go index 274164336f..088aa85d48 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +++ b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go @@ -148,7 +148,11 @@ func (ms *messageState) pointer() pointer { return pointer{p: unsafe.Pointer(ms)} } func (ms *messageState) messageInfo() *MessageInfo { - return ms.LoadMessageInfo() + mi := ms.LoadMessageInfo() + if mi == nil { + panic("invalid nil message info; this suggests memory corruption due to a race or shallow copy on the message struct") + } + return mi } func (ms *messageState) LoadMessageInfo() *MessageInfo { return (*MessageInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&ms.atomicMessageInfo)))) diff --git a/vendor/google.golang.org/protobuf/internal/impl/validate.go b/vendor/google.golang.org/protobuf/internal/impl/validate.go index 57de9cc85b..08cfb6054b 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/validate.go +++ b/vendor/google.golang.org/protobuf/internal/impl/validate.go @@ -14,6 +14,7 @@ import ( "google.golang.org/protobuf/encoding/protowire" "google.golang.org/protobuf/internal/encoding/messageset" "google.golang.org/protobuf/internal/flags" + "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/strs" pref "google.golang.org/protobuf/reflect/protoreflect" preg "google.golang.org/protobuf/reflect/protoregistry" @@ -282,9 +283,9 @@ State: switch { case st.typ == validationTypeMap: switch num { - case 1: + case genid.MapEntry_Key_field_number: vi.typ = st.keyType - case 2: + case genid.MapEntry_Value_field_number: vi.typ = st.valType vi.mi = st.mi vi.requiredBit = 1 diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 774719e4ff..72cf770b42 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -52,7 +52,7 @@ import ( // 10. Send out the CL for review and submit it. const ( Major = 1 - Minor = 22 + Minor = 25 Patch = 0 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/proto/decode.go b/vendor/google.golang.org/protobuf/proto/decode.go index 128214760c..42fc5195e8 100644 --- a/vendor/google.golang.org/protobuf/proto/decode.go +++ b/vendor/google.golang.org/protobuf/proto/decode.go @@ -9,6 +9,7 @@ import ( "google.golang.org/protobuf/internal/encoding/messageset" "google.golang.org/protobuf/internal/errors" "google.golang.org/protobuf/internal/flags" + "google.golang.org/protobuf/internal/genid" "google.golang.org/protobuf/internal/pragma" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" @@ -63,12 +64,15 @@ func (o UnmarshalOptions) UnmarshalState(in protoiface.UnmarshalInput) (protoifa return o.unmarshal(in.Buf, in.Message) } +// unmarshal is a centralized function that all unmarshal operations go through. +// For profiling purposes, avoid changing the name of this function or +// introducing other code paths for unmarshal that do not go through this. func (o UnmarshalOptions) unmarshal(b []byte, m protoreflect.Message) (out protoiface.UnmarshalOutput, err error) { if o.Resolver == nil { o.Resolver = protoregistry.GlobalTypes } if !o.Merge { - Reset(m.Interface()) // TODO + Reset(m.Interface()) } allowPartial := o.AllowPartial o.Merge = true @@ -105,7 +109,7 @@ func (o UnmarshalOptions) unmarshalMessage(b []byte, m protoreflect.Message) err func (o UnmarshalOptions) unmarshalMessageSlow(b []byte, m protoreflect.Message) error { md := m.Descriptor() if messageset.IsMessageSet(md) { - return unmarshalMessageSet(b, m, o) + return o.unmarshalMessageSet(b, m) } fields := md.Fields() for len(b) > 0 { @@ -217,13 +221,13 @@ func (o UnmarshalOptions) unmarshalMap(b []byte, wtyp protowire.Type, mapv proto b = b[n:] err = errUnknown switch num { - case 1: + case genid.MapEntry_Key_field_number: key, n, err = o.unmarshalScalar(b, wtyp, keyField) if err != nil { break } haveKey = true - case 2: + case genid.MapEntry_Value_field_number: var v protoreflect.Value v, n, err = o.unmarshalScalar(b, wtyp, valField) if err != nil { diff --git a/vendor/google.golang.org/protobuf/proto/encode.go b/vendor/google.golang.org/protobuf/proto/encode.go index 456bfda478..7b47a1180e 100644 --- a/vendor/google.golang.org/protobuf/proto/encode.go +++ b/vendor/google.golang.org/protobuf/proto/encode.go @@ -134,6 +134,9 @@ func (o MarshalOptions) MarshalState(in protoiface.MarshalInput) (protoiface.Mar return o.marshal(in.Buf, in.Message) } +// marshal is a centralized function that all marshal operations go through. +// For profiling purposes, avoid changing the name of this function or +// introducing other code paths for marshal that do not go through this. func (o MarshalOptions) marshal(b []byte, m protoreflect.Message) (out protoiface.MarshalOutput, err error) { allowPartial := o.AllowPartial o.AllowPartial = true @@ -206,7 +209,7 @@ func growcap(oldcap, wantcap int) (newcap int) { func (o MarshalOptions) marshalMessageSlow(b []byte, m protoreflect.Message) ([]byte, error) { if messageset.IsMessageSet(m.Descriptor()) { - return marshalMessageSet(b, m, o) + return o.marshalMessageSet(b, m) } // There are many choices for what order we visit fields in. The default one here // is chosen for reasonable efficiency and simplicity given the protoreflect API. diff --git a/vendor/google.golang.org/protobuf/proto/merge.go b/vendor/google.golang.org/protobuf/proto/merge.go index 27ab1a686e..d761ab331d 100644 --- a/vendor/google.golang.org/protobuf/proto/merge.go +++ b/vendor/google.golang.org/protobuf/proto/merge.go @@ -5,6 +5,8 @@ package proto import ( + "fmt" + "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/runtime/protoiface" ) @@ -26,6 +28,9 @@ func Merge(dst, src Message) { dstMsg, srcMsg := dst.ProtoReflect(), src.ProtoReflect() if dstMsg.Descriptor() != srcMsg.Descriptor() { + if got, want := dstMsg.Descriptor().FullName(), srcMsg.Descriptor().FullName(); got != want { + panic(fmt.Sprintf("descriptor mismatch: %v != %v", got, want)) + } panic("descriptor mismatch") } mergeOptions{}.mergeMessage(dstMsg, srcMsg) @@ -72,7 +77,7 @@ func (o mergeOptions) mergeMessage(dst, src protoreflect.Message) { } if !dst.IsValid() { - panic("cannot merge into invalid destination message") + panic(fmt.Sprintf("cannot merge into invalid %v message", dst.Descriptor().FullName())) } src.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { diff --git a/vendor/google.golang.org/protobuf/proto/messageset.go b/vendor/google.golang.org/protobuf/proto/messageset.go index b6b3de5911..1d692c3a8b 100644 --- a/vendor/google.golang.org/protobuf/proto/messageset.go +++ b/vendor/google.golang.org/protobuf/proto/messageset.go @@ -13,24 +13,24 @@ import ( "google.golang.org/protobuf/reflect/protoregistry" ) -func sizeMessageSet(m protoreflect.Message) (size int) { +func (o MarshalOptions) sizeMessageSet(m protoreflect.Message) (size int) { m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { size += messageset.SizeField(fd.Number()) size += protowire.SizeTag(messageset.FieldMessage) - size += protowire.SizeBytes(sizeMessage(v.Message())) + size += protowire.SizeBytes(o.size(v.Message())) return true }) size += messageset.SizeUnknown(m.GetUnknown()) return size } -func marshalMessageSet(b []byte, m protoreflect.Message, o MarshalOptions) ([]byte, error) { +func (o MarshalOptions) marshalMessageSet(b []byte, m protoreflect.Message) ([]byte, error) { if !flags.ProtoLegacy { return b, errors.New("no support for message_set_wire_format") } var err error o.rangeFields(m, func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - b, err = marshalMessageSetField(b, fd, v, o) + b, err = o.marshalMessageSetField(b, fd, v) return err == nil }) if err != nil { @@ -39,7 +39,7 @@ func marshalMessageSet(b []byte, m protoreflect.Message, o MarshalOptions) ([]by return messageset.AppendUnknown(b, m.GetUnknown()) } -func marshalMessageSetField(b []byte, fd protoreflect.FieldDescriptor, value protoreflect.Value, o MarshalOptions) ([]byte, error) { +func (o MarshalOptions) marshalMessageSetField(b []byte, fd protoreflect.FieldDescriptor, value protoreflect.Value) ([]byte, error) { b = messageset.AppendFieldStart(b, fd.Number()) b = protowire.AppendTag(b, messageset.FieldMessage, protowire.BytesType) b = protowire.AppendVarint(b, uint64(o.Size(value.Message().Interface()))) @@ -51,12 +51,12 @@ func marshalMessageSetField(b []byte, fd protoreflect.FieldDescriptor, value pro return b, nil } -func unmarshalMessageSet(b []byte, m protoreflect.Message, o UnmarshalOptions) error { +func (o UnmarshalOptions) unmarshalMessageSet(b []byte, m protoreflect.Message) error { if !flags.ProtoLegacy { return errors.New("no support for message_set_wire_format") } return messageset.Unmarshal(b, false, func(num protowire.Number, v []byte) error { - err := unmarshalMessageSetField(m, num, v, o) + err := o.unmarshalMessageSetField(m, num, v) if err == errUnknown { unknown := m.GetUnknown() unknown = protowire.AppendTag(unknown, num, protowire.BytesType) @@ -68,7 +68,7 @@ func unmarshalMessageSet(b []byte, m protoreflect.Message, o UnmarshalOptions) e }) } -func unmarshalMessageSetField(m protoreflect.Message, num protowire.Number, v []byte, o UnmarshalOptions) error { +func (o UnmarshalOptions) unmarshalMessageSetField(m protoreflect.Message, num protowire.Number, v []byte) error { md := m.Descriptor() if !md.ExtensionRanges().Has(num) { return errUnknown diff --git a/vendor/google.golang.org/protobuf/proto/reset.go b/vendor/google.golang.org/protobuf/proto/reset.go index 22048bc1fa..3d7f894362 100644 --- a/vendor/google.golang.org/protobuf/proto/reset.go +++ b/vendor/google.golang.org/protobuf/proto/reset.go @@ -4,7 +4,11 @@ package proto -import "google.golang.org/protobuf/reflect/protoreflect" +import ( + "fmt" + + "google.golang.org/protobuf/reflect/protoreflect" +) // Reset clears every field in the message. // The resulting message shares no observable memory with its previous state @@ -19,7 +23,7 @@ func Reset(m Message) { func resetMessage(m protoreflect.Message) { if !m.IsValid() { - panic("cannot reset invalid message") + panic(fmt.Sprintf("cannot reset invalid %v message", m.Descriptor().FullName())) } // Clear all known fields. diff --git a/vendor/google.golang.org/protobuf/proto/size.go b/vendor/google.golang.org/protobuf/proto/size.go index 11ba841464..554b9c6c09 100644 --- a/vendor/google.golang.org/protobuf/proto/size.go +++ b/vendor/google.golang.org/protobuf/proto/size.go @@ -23,10 +23,13 @@ func (o MarshalOptions) Size(m Message) int { return 0 } - return sizeMessage(m.ProtoReflect()) + return o.size(m.ProtoReflect()) } -func sizeMessage(m protoreflect.Message) (size int) { +// size is a centralized function that all size operations go through. +// For profiling purposes, avoid changing the name of this function or +// introducing other code paths for size that do not go through this. +func (o MarshalOptions) size(m protoreflect.Message) (size int) { methods := protoMethods(m) if methods != nil && methods.Size != nil { out := methods.Size(protoiface.SizeInput{ @@ -42,52 +45,52 @@ func sizeMessage(m protoreflect.Message) (size int) { }) return len(out.Buf) } - return sizeMessageSlow(m) + return o.sizeMessageSlow(m) } -func sizeMessageSlow(m protoreflect.Message) (size int) { +func (o MarshalOptions) sizeMessageSlow(m protoreflect.Message) (size int) { if messageset.IsMessageSet(m.Descriptor()) { - return sizeMessageSet(m) + return o.sizeMessageSet(m) } m.Range(func(fd protoreflect.FieldDescriptor, v protoreflect.Value) bool { - size += sizeField(fd, v) + size += o.sizeField(fd, v) return true }) size += len(m.GetUnknown()) return size } -func sizeField(fd protoreflect.FieldDescriptor, value protoreflect.Value) (size int) { +func (o MarshalOptions) sizeField(fd protoreflect.FieldDescriptor, value protoreflect.Value) (size int) { num := fd.Number() switch { case fd.IsList(): - return sizeList(num, fd, value.List()) + return o.sizeList(num, fd, value.List()) case fd.IsMap(): - return sizeMap(num, fd, value.Map()) + return o.sizeMap(num, fd, value.Map()) default: - return protowire.SizeTag(num) + sizeSingular(num, fd.Kind(), value) + return protowire.SizeTag(num) + o.sizeSingular(num, fd.Kind(), value) } } -func sizeList(num protowire.Number, fd protoreflect.FieldDescriptor, list protoreflect.List) (size int) { +func (o MarshalOptions) sizeList(num protowire.Number, fd protoreflect.FieldDescriptor, list protoreflect.List) (size int) { if fd.IsPacked() && list.Len() > 0 { content := 0 for i, llen := 0, list.Len(); i < llen; i++ { - content += sizeSingular(num, fd.Kind(), list.Get(i)) + content += o.sizeSingular(num, fd.Kind(), list.Get(i)) } return protowire.SizeTag(num) + protowire.SizeBytes(content) } for i, llen := 0, list.Len(); i < llen; i++ { - size += protowire.SizeTag(num) + sizeSingular(num, fd.Kind(), list.Get(i)) + size += protowire.SizeTag(num) + o.sizeSingular(num, fd.Kind(), list.Get(i)) } return size } -func sizeMap(num protowire.Number, fd protoreflect.FieldDescriptor, mapv protoreflect.Map) (size int) { +func (o MarshalOptions) sizeMap(num protowire.Number, fd protoreflect.FieldDescriptor, mapv protoreflect.Map) (size int) { mapv.Range(func(key protoreflect.MapKey, value protoreflect.Value) bool { size += protowire.SizeTag(num) - size += protowire.SizeBytes(sizeField(fd.MapKey(), key.Value()) + sizeField(fd.MapValue(), value)) + size += protowire.SizeBytes(o.sizeField(fd.MapKey(), key.Value()) + o.sizeField(fd.MapValue(), value)) return true }) return size diff --git a/vendor/google.golang.org/protobuf/proto/size_gen.go b/vendor/google.golang.org/protobuf/proto/size_gen.go index 1118460f69..3cf61a824a 100644 --- a/vendor/google.golang.org/protobuf/proto/size_gen.go +++ b/vendor/google.golang.org/protobuf/proto/size_gen.go @@ -11,7 +11,7 @@ import ( "google.golang.org/protobuf/reflect/protoreflect" ) -func sizeSingular(num protowire.Number, kind protoreflect.Kind, v protoreflect.Value) int { +func (o MarshalOptions) sizeSingular(num protowire.Number, kind protoreflect.Kind, v protoreflect.Value) int { switch kind { case protoreflect.BoolKind: return protowire.SizeVarint(protowire.EncodeBool(v.Bool())) @@ -46,9 +46,9 @@ func sizeSingular(num protowire.Number, kind protoreflect.Kind, v protoreflect.V case protoreflect.BytesKind: return protowire.SizeBytes(len(v.Bytes())) case protoreflect.MessageKind: - return protowire.SizeBytes(sizeMessage(v.Message())) + return protowire.SizeBytes(o.size(v.Message())) case protoreflect.GroupKind: - return protowire.SizeGroup(num, sizeMessage(v.Message())) + return protowire.SizeGroup(num, o.size(v.Message())) default: return 0 } diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go index b669a4e761..dd85915bd4 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go @@ -128,7 +128,6 @@ package protoreflect import ( "fmt" - "regexp" "strings" "google.golang.org/protobuf/encoding/protowire" @@ -408,19 +407,14 @@ type EnumRanges interface { doNotImplement } -var ( - regexName = regexp.MustCompile(`^[_a-zA-Z][_a-zA-Z0-9]*$`) - regexFullName = regexp.MustCompile(`^[_a-zA-Z][_a-zA-Z0-9]*(\.[_a-zA-Z][_a-zA-Z0-9]*)*$`) -) - // Name is the short name for a proto declaration. This is not the name // as used in Go source code, which might not be identical to the proto name. type Name string // e.g., "Kind" -// IsValid reports whether n is a syntactically valid name. +// IsValid reports whether s is a syntactically valid name. // An empty name is invalid. -func (n Name) IsValid() bool { - return regexName.MatchString(string(n)) +func (s Name) IsValid() bool { + return consumeIdent(string(s)) == len(s) } // Names represent a list of names. @@ -443,10 +437,42 @@ type Names interface { // This should not have any leading or trailing dots. type FullName string // e.g., "google.protobuf.Field.Kind" -// IsValid reports whether n is a syntactically valid full name. +// IsValid reports whether s is a syntactically valid full name. // An empty full name is invalid. -func (n FullName) IsValid() bool { - return regexFullName.MatchString(string(n)) +func (s FullName) IsValid() bool { + i := consumeIdent(string(s)) + if i < 0 { + return false + } + for len(s) > i { + if s[i] != '.' { + return false + } + i++ + n := consumeIdent(string(s[i:])) + if n < 0 { + return false + } + i += n + } + return true +} + +func consumeIdent(s string) (i int) { + if len(s) == 0 || !isLetter(s[i]) { + return -1 + } + i++ + for len(s) > i && isLetterDigit(s[i]) { + i++ + } + return i +} +func isLetter(c byte) bool { + return c == '_' || ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') +} +func isLetterDigit(c byte) bool { + return isLetter(c) || ('0' <= c && c <= '9') } // Name returns the short name, which is the last identifier segment. diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go index d695a4d662..5a34147241 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go @@ -7,7 +7,6 @@ package protoreflect import ( "fmt" "math" - "reflect" ) // Value is a union where only one Go type may be set at a time. @@ -86,8 +85,10 @@ func ValueOf(v interface{}) Value { return ValueOfEnum(v) case Message, List, Map: return valueOfIface(v) + case ProtoMessage: + panic(fmt.Sprintf("invalid proto.Message(%T) type, expected a protoreflect.Message type", v)) default: - panic(fmt.Sprintf("invalid type: %v", reflect.TypeOf(v))) + panic(fmt.Sprintf("invalid type: %T", v)) } } @@ -197,13 +198,55 @@ func (v Value) Interface() interface{} { } } +func (v Value) typeName() string { + switch v.typ { + case nilType: + return "nil" + case boolType: + return "bool" + case int32Type: + return "int32" + case int64Type: + return "int64" + case uint32Type: + return "uint32" + case uint64Type: + return "uint64" + case float32Type: + return "float32" + case float64Type: + return "float64" + case stringType: + return "string" + case bytesType: + return "bytes" + case enumType: + return "enum" + default: + switch v := v.getIface().(type) { + case Message: + return "message" + case List: + return "list" + case Map: + return "map" + default: + return fmt.Sprintf("<unknown: %T>", v) + } + } +} + +func (v Value) panicMessage(what string) string { + return fmt.Sprintf("type mismatch: cannot convert %v to %s", v.typeName(), what) +} + // Bool returns v as a bool and panics if the type is not a bool. func (v Value) Bool() bool { switch v.typ { case boolType: return v.num > 0 default: - panic("proto: value type mismatch") + panic(v.panicMessage("bool")) } } @@ -213,7 +256,7 @@ func (v Value) Int() int64 { case int32Type, int64Type: return int64(v.num) default: - panic("proto: value type mismatch") + panic(v.panicMessage("int")) } } @@ -223,7 +266,7 @@ func (v Value) Uint() uint64 { case uint32Type, uint64Type: return uint64(v.num) default: - panic("proto: value type mismatch") + panic(v.panicMessage("uint")) } } @@ -233,7 +276,7 @@ func (v Value) Float() float64 { case float32Type, float64Type: return math.Float64frombits(uint64(v.num)) default: - panic("proto: value type mismatch") + panic(v.panicMessage("float")) } } @@ -254,7 +297,7 @@ func (v Value) Bytes() []byte { case bytesType: return v.getBytes() default: - panic("proto: value type mismatch") + panic(v.panicMessage("bytes")) } } @@ -264,37 +307,37 @@ func (v Value) Enum() EnumNumber { case enumType: return EnumNumber(v.num) default: - panic("proto: value type mismatch") + panic(v.panicMessage("enum")) } } // Message returns v as a Message and panics if the type is not a Message. func (v Value) Message() Message { - switch v := v.getIface().(type) { + switch vi := v.getIface().(type) { case Message: - return v + return vi default: - panic("proto: value type mismatch") + panic(v.panicMessage("message")) } } // List returns v as a List and panics if the type is not a List. func (v Value) List() List { - switch v := v.getIface().(type) { + switch vi := v.getIface().(type) { case List: - return v + return vi default: - panic("proto: value type mismatch") + panic(v.panicMessage("list")) } } // Map returns v as a Map and panics if the type is not a Map. func (v Value) Map() Map { - switch v := v.getIface().(type) { + switch vi := v.getIface().(type) { case Map: - return v + return vi default: - panic("proto: value type mismatch") + panic(v.panicMessage("map")) } } @@ -303,8 +346,9 @@ func (v Value) MapKey() MapKey { switch v.typ { case boolType, int32Type, int64Type, uint32Type, uint64Type, stringType: return MapKey(v) + default: + panic(v.panicMessage("map key")) } - panic("proto: invalid map key type") } // MapKey is used to index maps, where the Go type of the MapKey must match diff --git a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go index 43f16c6164..5e5f967164 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +++ b/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go @@ -96,6 +96,38 @@ func (r *Files) RegisterFile(file protoreflect.FileDescriptor) error { } path := file.Path() if prev := r.filesByPath[path]; prev != nil { + // TODO: Remove this after some soak-in period after moving these types. + var prevPath string + const prevModule = "google.golang.org/genproto" + const prevVersion = "cb27e3aa (May 26th, 2020)" + switch path { + case "google/protobuf/field_mask.proto": + prevPath = prevModule + "/protobuf/field_mask" + case "google/protobuf/api.proto": + prevPath = prevModule + "/protobuf/api" + case "google/protobuf/type.proto": + prevPath = prevModule + "/protobuf/ptype" + case "google/protobuf/source_context.proto": + prevPath = prevModule + "/protobuf/source_context" + } + if r == GlobalFiles && prevPath != "" { + pkgName := strings.TrimSuffix(strings.TrimPrefix(path, "google/protobuf/"), ".proto") + pkgName = strings.Replace(pkgName, "_", "", -1) + "pb" + currPath := "google.golang.org/protobuf/types/known/" + pkgName + panic(fmt.Sprintf(""+ + "duplicate registration of %q\n"+ + "\n"+ + "The generated definition for this file has moved:\n"+ + "\tfrom: %q\n"+ + "\tto: %q\n"+ + "A dependency on the %q module must\n"+ + "be at version %v or higher.\n"+ + "\n"+ + "Upgrade the dependency by running:\n"+ + "\tgo get -u %v\n", + path, prevPath, currPath, prevModule, prevVersion, prevPath)) + } + err := errors.New("file %q is already registered", file.Path()) err = amendErrorWithCaller(err, prev, file) if r == GlobalFiles && ignoreConflict(file, err) { diff --git a/vendor/gopkg.in/yaml.v3/.travis.yml b/vendor/gopkg.in/yaml.v3/.travis.yml new file mode 100644 index 0000000000..a130fe883c --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/.travis.yml @@ -0,0 +1,17 @@ +language: go + +go: + - "1.4.x" + - "1.5.x" + - "1.6.x" + - "1.7.x" + - "1.8.x" + - "1.9.x" + - "1.10.x" + - "1.11.x" + - "1.12.x" + - "1.13.x" + - "1.14.x" + - "tip" + +go_import_path: gopkg.in/yaml.v3 diff --git a/vendor/gopkg.in/yaml.v3/LICENSE b/vendor/gopkg.in/yaml.v3/LICENSE new file mode 100644 index 0000000000..2683e4bb1f --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/LICENSE @@ -0,0 +1,50 @@ + +This project is covered by two different licenses: MIT and Apache. + +#### MIT License #### + +The following files were ported to Go from C files of libyaml, and thus +are still covered by their original MIT license, with the additional +copyright staring in 2011 when the project was ported over: + + apic.go emitterc.go parserc.go readerc.go scannerc.go + writerc.go yamlh.go yamlprivateh.go + +Copyright (c) 2006-2010 Kirill Simonov +Copyright (c) 2006-2011 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +### Apache License ### + +All the remaining project files are covered by the Apache license: + +Copyright (c) 2011-2019 Canonical Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/gopkg.in/yaml.v3/NOTICE b/vendor/gopkg.in/yaml.v3/NOTICE new file mode 100644 index 0000000000..866d74a7ad --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/NOTICE @@ -0,0 +1,13 @@ +Copyright 2011-2016 Canonical Ltd. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/gopkg.in/yaml.v3/README.md b/vendor/gopkg.in/yaml.v3/README.md new file mode 100644 index 0000000000..08eb1babdd --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/README.md @@ -0,0 +1,150 @@ +# YAML support for the Go language + +Introduction +------------ + +The yaml package enables Go programs to comfortably encode and decode YAML +values. It was developed within [Canonical](https://www.canonical.com) as +part of the [juju](https://juju.ubuntu.com) project, and is based on a +pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML) +C library to parse and generate YAML data quickly and reliably. + +Compatibility +------------- + +The yaml package supports most of YAML 1.2, but preserves some behavior +from 1.1 for backwards compatibility. + +Specifically, as of v3 of the yaml package: + + - YAML 1.1 bools (_yes/no, on/off_) are supported as long as they are being + decoded into a typed bool value. Otherwise they behave as a string. Booleans + in YAML 1.2 are _true/false_ only. + - Octals encode and decode as _0777_ per YAML 1.1, rather than _0o777_ + as specified in YAML 1.2, because most parsers still use the old format. + Octals in the _0o777_ format are supported though, so new files work. + - Does not support base-60 floats. These are gone from YAML 1.2, and were + actually never supported by this package as it's clearly a poor choice. + +and offers backwards +compatibility with YAML 1.1 in some cases. +1.2, including support for +anchors, tags, map merging, etc. Multi-document unmarshalling is not yet +implemented, and base-60 floats from YAML 1.1 are purposefully not +supported since they're a poor design and are gone in YAML 1.2. + +Installation and usage +---------------------- + +The import path for the package is *gopkg.in/yaml.v3*. + +To install it, run: + + go get gopkg.in/yaml.v3 + +API documentation +----------------- + +If opened in a browser, the import path itself leads to the API documentation: + + - [https://gopkg.in/yaml.v3](https://gopkg.in/yaml.v3) + +API stability +------------- + +The package API for yaml v3 will remain stable as described in [gopkg.in](https://gopkg.in). + + +License +------- + +The yaml package is licensed under the MIT and Apache License 2.0 licenses. +Please see the LICENSE file for details. + + +Example +------- + +```Go +package main + +import ( + "fmt" + "log" + + "gopkg.in/yaml.v3" +) + +var data = ` +a: Easy! +b: + c: 2 + d: [3, 4] +` + +// Note: struct fields must be public in order for unmarshal to +// correctly populate the data. +type T struct { + A string + B struct { + RenamedC int `yaml:"c"` + D []int `yaml:",flow"` + } +} + +func main() { + t := T{} + + err := yaml.Unmarshal([]byte(data), &t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t:\n%v\n\n", t) + + d, err := yaml.Marshal(&t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t dump:\n%s\n\n", string(d)) + + m := make(map[interface{}]interface{}) + + err = yaml.Unmarshal([]byte(data), &m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m:\n%v\n\n", m) + + d, err = yaml.Marshal(&m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m dump:\n%s\n\n", string(d)) +} +``` + +This example will generate the following output: + +``` +--- t: +{Easy! {2 [3 4]}} + +--- t dump: +a: Easy! +b: + c: 2 + d: [3, 4] + + +--- m: +map[a:Easy! b:map[c:2 d:[3 4]]] + +--- m dump: +a: Easy! +b: + c: 2 + d: + - 3 + - 4 +``` + diff --git a/vendor/gopkg.in/yaml.v3/apic.go b/vendor/gopkg.in/yaml.v3/apic.go new file mode 100644 index 0000000000..ae7d049f18 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/apic.go @@ -0,0 +1,747 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "io" +) + +func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { + //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) + + // Check if we can move the queue at the beginning of the buffer. + if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { + if parser.tokens_head != len(parser.tokens) { + copy(parser.tokens, parser.tokens[parser.tokens_head:]) + } + parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] + parser.tokens_head = 0 + } + parser.tokens = append(parser.tokens, *token) + if pos < 0 { + return + } + copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) + parser.tokens[parser.tokens_head+pos] = *token +} + +// Create a new parser object. +func yaml_parser_initialize(parser *yaml_parser_t) bool { + *parser = yaml_parser_t{ + raw_buffer: make([]byte, 0, input_raw_buffer_size), + buffer: make([]byte, 0, input_buffer_size), + } + return true +} + +// Destroy a parser object. +func yaml_parser_delete(parser *yaml_parser_t) { + *parser = yaml_parser_t{} +} + +// String read handler. +func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + if parser.input_pos == len(parser.input) { + return 0, io.EOF + } + n = copy(buffer, parser.input[parser.input_pos:]) + parser.input_pos += n + return n, nil +} + +// Reader read handler. +func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + return parser.input_reader.Read(buffer) +} + +// Set a string input. +func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_string_read_handler + parser.input = input + parser.input_pos = 0 +} + +// Set a file input. +func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_reader_read_handler + parser.input_reader = r +} + +// Set the source encoding. +func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { + if parser.encoding != yaml_ANY_ENCODING { + panic("must set the encoding only once") + } + parser.encoding = encoding +} + +// Create a new emitter object. +func yaml_emitter_initialize(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{ + buffer: make([]byte, output_buffer_size), + raw_buffer: make([]byte, 0, output_raw_buffer_size), + states: make([]yaml_emitter_state_t, 0, initial_stack_size), + events: make([]yaml_event_t, 0, initial_queue_size), + best_width: -1, + } +} + +// Destroy an emitter object. +func yaml_emitter_delete(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{} +} + +// String write handler. +func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + *emitter.output_buffer = append(*emitter.output_buffer, buffer...) + return nil +} + +// yaml_writer_write_handler uses emitter.output_writer to write the +// emitted text. +func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + _, err := emitter.output_writer.Write(buffer) + return err +} + +// Set a string output. +func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_string_write_handler + emitter.output_buffer = output_buffer +} + +// Set a file output. +func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_writer_write_handler + emitter.output_writer = w +} + +// Set the output encoding. +func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { + if emitter.encoding != yaml_ANY_ENCODING { + panic("must set the output encoding only once") + } + emitter.encoding = encoding +} + +// Set the canonical output style. +func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { + emitter.canonical = canonical +} + +// Set the indentation increment. +func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { + if indent < 2 || indent > 9 { + indent = 2 + } + emitter.best_indent = indent +} + +// Set the preferred line width. +func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { + if width < 0 { + width = -1 + } + emitter.best_width = width +} + +// Set if unescaped non-ASCII characters are allowed. +func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { + emitter.unicode = unicode +} + +// Set the preferred line break character. +func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { + emitter.line_break = line_break +} + +///* +// * Destroy a token object. +// */ +// +//YAML_DECLARE(void) +//yaml_token_delete(yaml_token_t *token) +//{ +// assert(token); // Non-NULL token object expected. +// +// switch (token.type) +// { +// case YAML_TAG_DIRECTIVE_TOKEN: +// yaml_free(token.data.tag_directive.handle); +// yaml_free(token.data.tag_directive.prefix); +// break; +// +// case YAML_ALIAS_TOKEN: +// yaml_free(token.data.alias.value); +// break; +// +// case YAML_ANCHOR_TOKEN: +// yaml_free(token.data.anchor.value); +// break; +// +// case YAML_TAG_TOKEN: +// yaml_free(token.data.tag.handle); +// yaml_free(token.data.tag.suffix); +// break; +// +// case YAML_SCALAR_TOKEN: +// yaml_free(token.data.scalar.value); +// break; +// +// default: +// break; +// } +// +// memset(token, 0, sizeof(yaml_token_t)); +//} +// +///* +// * Check if a string is a valid UTF-8 sequence. +// * +// * Check 'reader.c' for more details on UTF-8 encoding. +// */ +// +//static int +//yaml_check_utf8(yaml_char_t *start, size_t length) +//{ +// yaml_char_t *end = start+length; +// yaml_char_t *pointer = start; +// +// while (pointer < end) { +// unsigned char octet; +// unsigned int width; +// unsigned int value; +// size_t k; +// +// octet = pointer[0]; +// width = (octet & 0x80) == 0x00 ? 1 : +// (octet & 0xE0) == 0xC0 ? 2 : +// (octet & 0xF0) == 0xE0 ? 3 : +// (octet & 0xF8) == 0xF0 ? 4 : 0; +// value = (octet & 0x80) == 0x00 ? octet & 0x7F : +// (octet & 0xE0) == 0xC0 ? octet & 0x1F : +// (octet & 0xF0) == 0xE0 ? octet & 0x0F : +// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; +// if (!width) return 0; +// if (pointer+width > end) return 0; +// for (k = 1; k < width; k ++) { +// octet = pointer[k]; +// if ((octet & 0xC0) != 0x80) return 0; +// value = (value << 6) + (octet & 0x3F); +// } +// if (!((width == 1) || +// (width == 2 && value >= 0x80) || +// (width == 3 && value >= 0x800) || +// (width == 4 && value >= 0x10000))) return 0; +// +// pointer += width; +// } +// +// return 1; +//} +// + +// Create STREAM-START. +func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) { + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + encoding: encoding, + } +} + +// Create STREAM-END. +func yaml_stream_end_event_initialize(event *yaml_event_t) { + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + } +} + +// Create DOCUMENT-START. +func yaml_document_start_event_initialize( + event *yaml_event_t, + version_directive *yaml_version_directive_t, + tag_directives []yaml_tag_directive_t, + implicit bool, +) { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: implicit, + } +} + +// Create DOCUMENT-END. +func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + implicit: implicit, + } +} + +// Create ALIAS. +func yaml_alias_event_initialize(event *yaml_event_t, anchor []byte) bool { + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + anchor: anchor, + } + return true +} + +// Create SCALAR. +func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + anchor: anchor, + tag: tag, + value: value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-START. +func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-END. +func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + } + return true +} + +// Create MAPPING-START. +func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) { + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } +} + +// Create MAPPING-END. +func yaml_mapping_end_event_initialize(event *yaml_event_t) { + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + } +} + +// Destroy an event object. +func yaml_event_delete(event *yaml_event_t) { + *event = yaml_event_t{} +} + +///* +// * Create a document object. +// */ +// +//YAML_DECLARE(int) +//yaml_document_initialize(document *yaml_document_t, +// version_directive *yaml_version_directive_t, +// tag_directives_start *yaml_tag_directive_t, +// tag_directives_end *yaml_tag_directive_t, +// start_implicit int, end_implicit int) +//{ +// struct { +// error yaml_error_type_t +// } context +// struct { +// start *yaml_node_t +// end *yaml_node_t +// top *yaml_node_t +// } nodes = { NULL, NULL, NULL } +// version_directive_copy *yaml_version_directive_t = NULL +// struct { +// start *yaml_tag_directive_t +// end *yaml_tag_directive_t +// top *yaml_tag_directive_t +// } tag_directives_copy = { NULL, NULL, NULL } +// value yaml_tag_directive_t = { NULL, NULL } +// mark yaml_mark_t = { 0, 0, 0 } +// +// assert(document) // Non-NULL document object is expected. +// assert((tag_directives_start && tag_directives_end) || +// (tag_directives_start == tag_directives_end)) +// // Valid tag directives are expected. +// +// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error +// +// if (version_directive) { +// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) +// if (!version_directive_copy) goto error +// version_directive_copy.major = version_directive.major +// version_directive_copy.minor = version_directive.minor +// } +// +// if (tag_directives_start != tag_directives_end) { +// tag_directive *yaml_tag_directive_t +// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) +// goto error +// for (tag_directive = tag_directives_start +// tag_directive != tag_directives_end; tag_directive ++) { +// assert(tag_directive.handle) +// assert(tag_directive.prefix) +// if (!yaml_check_utf8(tag_directive.handle, +// strlen((char *)tag_directive.handle))) +// goto error +// if (!yaml_check_utf8(tag_directive.prefix, +// strlen((char *)tag_directive.prefix))) +// goto error +// value.handle = yaml_strdup(tag_directive.handle) +// value.prefix = yaml_strdup(tag_directive.prefix) +// if (!value.handle || !value.prefix) goto error +// if (!PUSH(&context, tag_directives_copy, value)) +// goto error +// value.handle = NULL +// value.prefix = NULL +// } +// } +// +// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, +// tag_directives_copy.start, tag_directives_copy.top, +// start_implicit, end_implicit, mark, mark) +// +// return 1 +// +//error: +// STACK_DEL(&context, nodes) +// yaml_free(version_directive_copy) +// while (!STACK_EMPTY(&context, tag_directives_copy)) { +// value yaml_tag_directive_t = POP(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// } +// STACK_DEL(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// +// return 0 +//} +// +///* +// * Destroy a document object. +// */ +// +//YAML_DECLARE(void) +//yaml_document_delete(document *yaml_document_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// tag_directive *yaml_tag_directive_t +// +// context.error = YAML_NO_ERROR // Eliminate a compiler warning. +// +// assert(document) // Non-NULL document object is expected. +// +// while (!STACK_EMPTY(&context, document.nodes)) { +// node yaml_node_t = POP(&context, document.nodes) +// yaml_free(node.tag) +// switch (node.type) { +// case YAML_SCALAR_NODE: +// yaml_free(node.data.scalar.value) +// break +// case YAML_SEQUENCE_NODE: +// STACK_DEL(&context, node.data.sequence.items) +// break +// case YAML_MAPPING_NODE: +// STACK_DEL(&context, node.data.mapping.pairs) +// break +// default: +// assert(0) // Should not happen. +// } +// } +// STACK_DEL(&context, document.nodes) +// +// yaml_free(document.version_directive) +// for (tag_directive = document.tag_directives.start +// tag_directive != document.tag_directives.end +// tag_directive++) { +// yaml_free(tag_directive.handle) +// yaml_free(tag_directive.prefix) +// } +// yaml_free(document.tag_directives.start) +// +// memset(document, 0, sizeof(yaml_document_t)) +//} +// +///** +// * Get a document node. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_node(document *yaml_document_t, index int) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (index > 0 && document.nodes.start + index <= document.nodes.top) { +// return document.nodes.start + index - 1 +// } +// return NULL +//} +// +///** +// * Get the root object. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_root_node(document *yaml_document_t) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (document.nodes.top != document.nodes.start) { +// return document.nodes.start +// } +// return NULL +//} +// +///* +// * Add a scalar node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_scalar(document *yaml_document_t, +// tag *yaml_char_t, value *yaml_char_t, length int, +// style yaml_scalar_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// value_copy *yaml_char_t = NULL +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// assert(value) // Non-NULL value is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (length < 0) { +// length = strlen((char *)value) +// } +// +// if (!yaml_check_utf8(value, length)) goto error +// value_copy = yaml_malloc(length+1) +// if (!value_copy) goto error +// memcpy(value_copy, value, length) +// value_copy[length] = '\0' +// +// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// yaml_free(tag_copy) +// yaml_free(value_copy) +// +// return 0 +//} +// +///* +// * Add a sequence node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_sequence(document *yaml_document_t, +// tag *yaml_char_t, style yaml_sequence_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_item_t +// end *yaml_node_item_t +// top *yaml_node_item_t +// } items = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error +// +// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, items) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Add a mapping node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_mapping(document *yaml_document_t, +// tag *yaml_char_t, style yaml_mapping_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_pair_t +// end *yaml_node_pair_t +// top *yaml_node_pair_t +// } pairs = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error +// +// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, pairs) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Append an item to a sequence node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_sequence_item(document *yaml_document_t, +// sequence int, item int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// assert(document) // Non-NULL document is required. +// assert(sequence > 0 +// && document.nodes.start + sequence <= document.nodes.top) +// // Valid sequence id is required. +// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) +// // A sequence node is required. +// assert(item > 0 && document.nodes.start + item <= document.nodes.top) +// // Valid item id is required. +// +// if (!PUSH(&context, +// document.nodes.start[sequence-1].data.sequence.items, item)) +// return 0 +// +// return 1 +//} +// +///* +// * Append a pair of a key and a value to a mapping node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_mapping_pair(document *yaml_document_t, +// mapping int, key int, value int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// pair yaml_node_pair_t +// +// assert(document) // Non-NULL document is required. +// assert(mapping > 0 +// && document.nodes.start + mapping <= document.nodes.top) +// // Valid mapping id is required. +// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) +// // A mapping node is required. +// assert(key > 0 && document.nodes.start + key <= document.nodes.top) +// // Valid key id is required. +// assert(value > 0 && document.nodes.start + value <= document.nodes.top) +// // Valid value id is required. +// +// pair.key = key +// pair.value = value +// +// if (!PUSH(&context, +// document.nodes.start[mapping-1].data.mapping.pairs, pair)) +// return 0 +// +// return 1 +//} +// +// diff --git a/vendor/gopkg.in/yaml.v3/decode.go b/vendor/gopkg.in/yaml.v3/decode.go new file mode 100644 index 0000000000..21c0dacfdf --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/decode.go @@ -0,0 +1,948 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "encoding" + "encoding/base64" + "fmt" + "io" + "math" + "reflect" + "strconv" + "time" +) + +// ---------------------------------------------------------------------------- +// Parser, produces a node tree out of a libyaml event stream. + +type parser struct { + parser yaml_parser_t + event yaml_event_t + doc *Node + anchors map[string]*Node + doneInit bool + textless bool +} + +func newParser(b []byte) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + if len(b) == 0 { + b = []byte{'\n'} + } + yaml_parser_set_input_string(&p.parser, b) + return &p +} + +func newParserFromReader(r io.Reader) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + yaml_parser_set_input_reader(&p.parser, r) + return &p +} + +func (p *parser) init() { + if p.doneInit { + return + } + p.anchors = make(map[string]*Node) + p.expect(yaml_STREAM_START_EVENT) + p.doneInit = true +} + +func (p *parser) destroy() { + if p.event.typ != yaml_NO_EVENT { + yaml_event_delete(&p.event) + } + yaml_parser_delete(&p.parser) +} + +// expect consumes an event from the event stream and +// checks that it's of the expected type. +func (p *parser) expect(e yaml_event_type_t) { + if p.event.typ == yaml_NO_EVENT { + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } + } + if p.event.typ == yaml_STREAM_END_EVENT { + failf("attempted to go past the end of stream; corrupted value?") + } + if p.event.typ != e { + p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ) + p.fail() + } + yaml_event_delete(&p.event) + p.event.typ = yaml_NO_EVENT +} + +// peek peeks at the next event in the event stream, +// puts the results into p.event and returns the event type. +func (p *parser) peek() yaml_event_type_t { + if p.event.typ != yaml_NO_EVENT { + return p.event.typ + } + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } + return p.event.typ +} + +func (p *parser) fail() { + var where string + var line int + if p.parser.context_mark.line != 0 { + line = p.parser.context_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } else if p.parser.problem_mark.line != 0 { + line = p.parser.problem_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } + if line != 0 { + where = "line " + strconv.Itoa(line) + ": " + } + var msg string + if len(p.parser.problem) > 0 { + msg = p.parser.problem + } else { + msg = "unknown problem parsing YAML content" + } + failf("%s%s", where, msg) +} + +func (p *parser) anchor(n *Node, anchor []byte) { + if anchor != nil { + n.Anchor = string(anchor) + p.anchors[n.Anchor] = n + } +} + +func (p *parser) parse() *Node { + p.init() + switch p.peek() { + case yaml_SCALAR_EVENT: + return p.scalar() + case yaml_ALIAS_EVENT: + return p.alias() + case yaml_MAPPING_START_EVENT: + return p.mapping() + case yaml_SEQUENCE_START_EVENT: + return p.sequence() + case yaml_DOCUMENT_START_EVENT: + return p.document() + case yaml_STREAM_END_EVENT: + // Happens when attempting to decode an empty buffer. + return nil + case yaml_TAIL_COMMENT_EVENT: + panic("internal error: unexpected tail comment event (please report)") + default: + panic("internal error: attempted to parse unknown event (please report): " + p.event.typ.String()) + } +} + +func (p *parser) node(kind Kind, defaultTag, tag, value string) *Node { + var style Style + if tag != "" && tag != "!" { + tag = shortTag(tag) + style = TaggedStyle + } else if defaultTag != "" { + tag = defaultTag + } else if kind == ScalarNode { + tag, _ = resolve("", value) + } + n := &Node{ + Kind: kind, + Tag: tag, + Value: value, + Style: style, + } + if !p.textless { + n.Line = p.event.start_mark.line + 1 + n.Column = p.event.start_mark.column + 1 + n.HeadComment = string(p.event.head_comment) + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + } + return n +} + +func (p *parser) parseChild(parent *Node) *Node { + child := p.parse() + parent.Content = append(parent.Content, child) + return child +} + +func (p *parser) document() *Node { + n := p.node(DocumentNode, "", "", "") + p.doc = n + p.expect(yaml_DOCUMENT_START_EVENT) + p.parseChild(n) + if p.peek() == yaml_DOCUMENT_END_EVENT { + n.FootComment = string(p.event.foot_comment) + } + p.expect(yaml_DOCUMENT_END_EVENT) + return n +} + +func (p *parser) alias() *Node { + n := p.node(AliasNode, "", "", string(p.event.anchor)) + n.Alias = p.anchors[n.Value] + if n.Alias == nil { + failf("unknown anchor '%s' referenced", n.Value) + } + p.expect(yaml_ALIAS_EVENT) + return n +} + +func (p *parser) scalar() *Node { + var parsedStyle = p.event.scalar_style() + var nodeStyle Style + switch { + case parsedStyle&yaml_DOUBLE_QUOTED_SCALAR_STYLE != 0: + nodeStyle = DoubleQuotedStyle + case parsedStyle&yaml_SINGLE_QUOTED_SCALAR_STYLE != 0: + nodeStyle = SingleQuotedStyle + case parsedStyle&yaml_LITERAL_SCALAR_STYLE != 0: + nodeStyle = LiteralStyle + case parsedStyle&yaml_FOLDED_SCALAR_STYLE != 0: + nodeStyle = FoldedStyle + } + var nodeValue = string(p.event.value) + var nodeTag = string(p.event.tag) + var defaultTag string + if nodeStyle == 0 { + if nodeValue == "<<" { + defaultTag = mergeTag + } + } else { + defaultTag = strTag + } + n := p.node(ScalarNode, defaultTag, nodeTag, nodeValue) + n.Style |= nodeStyle + p.anchor(n, p.event.anchor) + p.expect(yaml_SCALAR_EVENT) + return n +} + +func (p *parser) sequence() *Node { + n := p.node(SequenceNode, seqTag, string(p.event.tag), "") + if p.event.sequence_style()&yaml_FLOW_SEQUENCE_STYLE != 0 { + n.Style |= FlowStyle + } + p.anchor(n, p.event.anchor) + p.expect(yaml_SEQUENCE_START_EVENT) + for p.peek() != yaml_SEQUENCE_END_EVENT { + p.parseChild(n) + } + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + p.expect(yaml_SEQUENCE_END_EVENT) + return n +} + +func (p *parser) mapping() *Node { + n := p.node(MappingNode, mapTag, string(p.event.tag), "") + block := true + if p.event.mapping_style()&yaml_FLOW_MAPPING_STYLE != 0 { + block = false + n.Style |= FlowStyle + } + p.anchor(n, p.event.anchor) + p.expect(yaml_MAPPING_START_EVENT) + for p.peek() != yaml_MAPPING_END_EVENT { + k := p.parseChild(n) + if block && k.FootComment != "" { + // Must be a foot comment for the prior value when being dedented. + if len(n.Content) > 2 { + n.Content[len(n.Content)-3].FootComment = k.FootComment + k.FootComment = "" + } + } + v := p.parseChild(n) + if k.FootComment == "" && v.FootComment != "" { + k.FootComment = v.FootComment + v.FootComment = "" + } + if p.peek() == yaml_TAIL_COMMENT_EVENT { + if k.FootComment == "" { + k.FootComment = string(p.event.foot_comment) + } + p.expect(yaml_TAIL_COMMENT_EVENT) + } + } + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + if n.Style&FlowStyle == 0 && n.FootComment != "" && len(n.Content) > 1 { + n.Content[len(n.Content)-2].FootComment = n.FootComment + n.FootComment = "" + } + p.expect(yaml_MAPPING_END_EVENT) + return n +} + +// ---------------------------------------------------------------------------- +// Decoder, unmarshals a node into a provided value. + +type decoder struct { + doc *Node + aliases map[*Node]bool + terrors []string + + stringMapType reflect.Type + generalMapType reflect.Type + + knownFields bool + uniqueKeys bool + decodeCount int + aliasCount int + aliasDepth int +} + +var ( + nodeType = reflect.TypeOf(Node{}) + durationType = reflect.TypeOf(time.Duration(0)) + stringMapType = reflect.TypeOf(map[string]interface{}{}) + generalMapType = reflect.TypeOf(map[interface{}]interface{}{}) + ifaceType = generalMapType.Elem() + timeType = reflect.TypeOf(time.Time{}) + ptrTimeType = reflect.TypeOf(&time.Time{}) +) + +func newDecoder() *decoder { + d := &decoder{ + stringMapType: stringMapType, + generalMapType: generalMapType, + uniqueKeys: true, + } + d.aliases = make(map[*Node]bool) + return d +} + +func (d *decoder) terror(n *Node, tag string, out reflect.Value) { + if n.Tag != "" { + tag = n.Tag + } + value := n.Value + if tag != seqTag && tag != mapTag { + if len(value) > 10 { + value = " `" + value[:7] + "...`" + } else { + value = " `" + value + "`" + } + } + d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.Line, shortTag(tag), value, out.Type())) +} + +func (d *decoder) callUnmarshaler(n *Node, u Unmarshaler) (good bool) { + err := u.UnmarshalYAML(n) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +func (d *decoder) callObsoleteUnmarshaler(n *Node, u obsoleteUnmarshaler) (good bool) { + terrlen := len(d.terrors) + err := u.UnmarshalYAML(func(v interface{}) (err error) { + defer handleErr(&err) + d.unmarshal(n, reflect.ValueOf(v)) + if len(d.terrors) > terrlen { + issues := d.terrors[terrlen:] + d.terrors = d.terrors[:terrlen] + return &TypeError{issues} + } + return nil + }) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +// d.prepare initializes and dereferences pointers and calls UnmarshalYAML +// if a value is found to implement it. +// It returns the initialized and dereferenced out value, whether +// unmarshalling was already done by UnmarshalYAML, and if so whether +// its types unmarshalled appropriately. +// +// If n holds a null value, prepare returns before doing anything. +func (d *decoder) prepare(n *Node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { + if n.ShortTag() == nullTag || n.Kind == 0 && n.IsZero() { + return out, false, false + } + again := true + for again { + again = false + if out.Kind() == reflect.Ptr { + if out.IsNil() { + out.Set(reflect.New(out.Type().Elem())) + } + out = out.Elem() + again = true + } + if out.CanAddr() { + outi := out.Addr().Interface() + if u, ok := outi.(Unmarshaler); ok { + good = d.callUnmarshaler(n, u) + return out, true, good + } + if u, ok := outi.(obsoleteUnmarshaler); ok { + good = d.callObsoleteUnmarshaler(n, u) + return out, true, good + } + } + } + return out, false, false +} + +func (d *decoder) fieldByIndex(n *Node, v reflect.Value, index []int) (field reflect.Value) { + if n.ShortTag() == nullTag { + return reflect.Value{} + } + for _, num := range index { + for { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + v = v.Elem() + continue + } + break + } + v = v.Field(num) + } + return v +} + +const ( + // 400,000 decode operations is ~500kb of dense object declarations, or + // ~5kb of dense object declarations with 10000% alias expansion + alias_ratio_range_low = 400000 + + // 4,000,000 decode operations is ~5MB of dense object declarations, or + // ~4.5MB of dense object declarations with 10% alias expansion + alias_ratio_range_high = 4000000 + + // alias_ratio_range is the range over which we scale allowed alias ratios + alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low) +) + +func allowedAliasRatio(decodeCount int) float64 { + switch { + case decodeCount <= alias_ratio_range_low: + // allow 99% to come from alias expansion for small-to-medium documents + return 0.99 + case decodeCount >= alias_ratio_range_high: + // allow 10% to come from alias expansion for very large documents + return 0.10 + default: + // scale smoothly from 99% down to 10% over the range. + // this maps to 396,000 - 400,000 allowed alias-driven decodes over the range. + // 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps). + return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range) + } +} + +func (d *decoder) unmarshal(n *Node, out reflect.Value) (good bool) { + d.decodeCount++ + if d.aliasDepth > 0 { + d.aliasCount++ + } + if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) { + failf("document contains excessive aliasing") + } + if out.Type() == nodeType { + out.Set(reflect.ValueOf(n).Elem()) + return true + } + switch n.Kind { + case DocumentNode: + return d.document(n, out) + case AliasNode: + return d.alias(n, out) + } + out, unmarshaled, good := d.prepare(n, out) + if unmarshaled { + return good + } + switch n.Kind { + case ScalarNode: + good = d.scalar(n, out) + case MappingNode: + good = d.mapping(n, out) + case SequenceNode: + good = d.sequence(n, out) + case 0: + if n.IsZero() { + return d.null(out) + } + fallthrough + default: + failf("cannot decode node with unknown kind %d", n.Kind) + } + return good +} + +func (d *decoder) document(n *Node, out reflect.Value) (good bool) { + if len(n.Content) == 1 { + d.doc = n + d.unmarshal(n.Content[0], out) + return true + } + return false +} + +func (d *decoder) alias(n *Node, out reflect.Value) (good bool) { + if d.aliases[n] { + // TODO this could actually be allowed in some circumstances. + failf("anchor '%s' value contains itself", n.Value) + } + d.aliases[n] = true + d.aliasDepth++ + good = d.unmarshal(n.Alias, out) + d.aliasDepth-- + delete(d.aliases, n) + return good +} + +var zeroValue reflect.Value + +func resetMap(out reflect.Value) { + for _, k := range out.MapKeys() { + out.SetMapIndex(k, zeroValue) + } +} + +func (d *decoder) null(out reflect.Value) bool { + if out.CanAddr() { + switch out.Kind() { + case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: + out.Set(reflect.Zero(out.Type())) + return true + } + } + return false +} + +func (d *decoder) scalar(n *Node, out reflect.Value) bool { + var tag string + var resolved interface{} + if n.indicatedString() { + tag = strTag + resolved = n.Value + } else { + tag, resolved = resolve(n.Tag, n.Value) + if tag == binaryTag { + data, err := base64.StdEncoding.DecodeString(resolved.(string)) + if err != nil { + failf("!!binary value contains invalid base64 data") + } + resolved = string(data) + } + } + if resolved == nil { + return d.null(out) + } + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + // We've resolved to exactly the type we want, so use that. + out.Set(resolvedv) + return true + } + // Perhaps we can use the value as a TextUnmarshaler to + // set its value. + if out.CanAddr() { + u, ok := out.Addr().Interface().(encoding.TextUnmarshaler) + if ok { + var text []byte + if tag == binaryTag { + text = []byte(resolved.(string)) + } else { + // We let any value be unmarshaled into TextUnmarshaler. + // That might be more lax than we'd like, but the + // TextUnmarshaler itself should bowl out any dubious values. + text = []byte(n.Value) + } + err := u.UnmarshalText(text) + if err != nil { + fail(err) + } + return true + } + } + switch out.Kind() { + case reflect.String: + if tag == binaryTag { + out.SetString(resolved.(string)) + return true + } + out.SetString(n.Value) + return true + case reflect.Interface: + out.Set(reflect.ValueOf(resolved)) + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + // This used to work in v2, but it's very unfriendly. + isDuration := out.Type() == durationType + + switch resolved := resolved.(type) { + case int: + if !isDuration && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case int64: + if !isDuration && !out.OverflowInt(resolved) { + out.SetInt(resolved) + return true + } + case uint64: + if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case float64: + if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case string: + if out.Type() == durationType { + d, err := time.ParseDuration(resolved) + if err == nil { + out.SetInt(int64(d)) + return true + } + } + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + switch resolved := resolved.(type) { + case int: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case int64: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case uint64: + if !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case float64: + if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + } + case reflect.Bool: + switch resolved := resolved.(type) { + case bool: + out.SetBool(resolved) + return true + case string: + // This offers some compatibility with the 1.1 spec (https://yaml.org/type/bool.html). + // It only works if explicitly attempting to unmarshal into a typed bool value. + switch resolved { + case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON": + out.SetBool(true) + return true + case "n", "N", "no", "No", "NO", "off", "Off", "OFF": + out.SetBool(false) + return true + } + } + case reflect.Float32, reflect.Float64: + switch resolved := resolved.(type) { + case int: + out.SetFloat(float64(resolved)) + return true + case int64: + out.SetFloat(float64(resolved)) + return true + case uint64: + out.SetFloat(float64(resolved)) + return true + case float64: + out.SetFloat(resolved) + return true + } + case reflect.Struct: + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + out.Set(resolvedv) + return true + } + case reflect.Ptr: + panic("yaml internal error: please report the issue") + } + d.terror(n, tag, out) + return false +} + +func settableValueOf(i interface{}) reflect.Value { + v := reflect.ValueOf(i) + sv := reflect.New(v.Type()).Elem() + sv.Set(v) + return sv +} + +func (d *decoder) sequence(n *Node, out reflect.Value) (good bool) { + l := len(n.Content) + + var iface reflect.Value + switch out.Kind() { + case reflect.Slice: + out.Set(reflect.MakeSlice(out.Type(), l, l)) + case reflect.Array: + if l != out.Len() { + failf("invalid array: want %d elements but got %d", out.Len(), l) + } + case reflect.Interface: + // No type hints. Will have to use a generic sequence. + iface = out + out = settableValueOf(make([]interface{}, l)) + default: + d.terror(n, seqTag, out) + return false + } + et := out.Type().Elem() + + j := 0 + for i := 0; i < l; i++ { + e := reflect.New(et).Elem() + if ok := d.unmarshal(n.Content[i], e); ok { + out.Index(j).Set(e) + j++ + } + } + if out.Kind() != reflect.Array { + out.Set(out.Slice(0, j)) + } + if iface.IsValid() { + iface.Set(out) + } + return true +} + +func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { + l := len(n.Content) + if d.uniqueKeys { + nerrs := len(d.terrors) + for i := 0; i < l; i += 2 { + ni := n.Content[i] + for j := i + 2; j < l; j += 2 { + nj := n.Content[j] + if ni.Kind == nj.Kind && ni.Value == nj.Value { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: mapping key %#v already defined at line %d", nj.Line, nj.Value, ni.Line)) + } + } + } + if len(d.terrors) > nerrs { + return false + } + } + switch out.Kind() { + case reflect.Struct: + return d.mappingStruct(n, out) + case reflect.Map: + // okay + case reflect.Interface: + iface := out + if isStringMap(n) { + out = reflect.MakeMap(d.stringMapType) + } else { + out = reflect.MakeMap(d.generalMapType) + } + iface.Set(out) + default: + d.terror(n, mapTag, out) + return false + } + + outt := out.Type() + kt := outt.Key() + et := outt.Elem() + + stringMapType := d.stringMapType + generalMapType := d.generalMapType + if outt.Elem() == ifaceType { + if outt.Key().Kind() == reflect.String { + d.stringMapType = outt + } else if outt.Key() == ifaceType { + d.generalMapType = outt + } + } + + if out.IsNil() { + out.Set(reflect.MakeMap(outt)) + } + for i := 0; i < l; i += 2 { + if isMerge(n.Content[i]) { + d.merge(n.Content[i+1], out) + continue + } + k := reflect.New(kt).Elem() + if d.unmarshal(n.Content[i], k) { + kkind := k.Kind() + if kkind == reflect.Interface { + kkind = k.Elem().Kind() + } + if kkind == reflect.Map || kkind == reflect.Slice { + failf("invalid map key: %#v", k.Interface()) + } + e := reflect.New(et).Elem() + if d.unmarshal(n.Content[i+1], e) { + out.SetMapIndex(k, e) + } + } + } + d.stringMapType = stringMapType + d.generalMapType = generalMapType + return true +} + +func isStringMap(n *Node) bool { + if n.Kind != MappingNode { + return false + } + l := len(n.Content) + for i := 0; i < l; i += 2 { + if n.Content[i].ShortTag() != strTag { + return false + } + } + return true +} + +func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { + sinfo, err := getStructInfo(out.Type()) + if err != nil { + panic(err) + } + + var inlineMap reflect.Value + var elemType reflect.Type + if sinfo.InlineMap != -1 { + inlineMap = out.Field(sinfo.InlineMap) + inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) + elemType = inlineMap.Type().Elem() + } + + for _, index := range sinfo.InlineUnmarshalers { + field := d.fieldByIndex(n, out, index) + d.prepare(n, field) + } + + var doneFields []bool + if d.uniqueKeys { + doneFields = make([]bool, len(sinfo.FieldsList)) + } + name := settableValueOf("") + l := len(n.Content) + for i := 0; i < l; i += 2 { + ni := n.Content[i] + if isMerge(ni) { + d.merge(n.Content[i+1], out) + continue + } + if !d.unmarshal(ni, name) { + continue + } + if info, ok := sinfo.FieldsMap[name.String()]; ok { + if d.uniqueKeys { + if doneFields[info.Id] { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.Line, name.String(), out.Type())) + continue + } + doneFields[info.Id] = true + } + var field reflect.Value + if info.Inline == nil { + field = out.Field(info.Num) + } else { + field = d.fieldByIndex(n, out, info.Inline) + } + d.unmarshal(n.Content[i+1], field) + } else if sinfo.InlineMap != -1 { + if inlineMap.IsNil() { + inlineMap.Set(reflect.MakeMap(inlineMap.Type())) + } + value := reflect.New(elemType).Elem() + d.unmarshal(n.Content[i+1], value) + inlineMap.SetMapIndex(name, value) + } else if d.knownFields { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.Line, name.String(), out.Type())) + } + } + return true +} + +func failWantMap() { + failf("map merge requires map or sequence of maps as the value") +} + +func (d *decoder) merge(n *Node, out reflect.Value) { + switch n.Kind { + case MappingNode: + d.unmarshal(n, out) + case AliasNode: + if n.Alias != nil && n.Alias.Kind != MappingNode { + failWantMap() + } + d.unmarshal(n, out) + case SequenceNode: + // Step backwards as earlier nodes take precedence. + for i := len(n.Content) - 1; i >= 0; i-- { + ni := n.Content[i] + if ni.Kind == AliasNode { + if ni.Alias != nil && ni.Alias.Kind != MappingNode { + failWantMap() + } + } else if ni.Kind != MappingNode { + failWantMap() + } + d.unmarshal(ni, out) + } + default: + failWantMap() + } +} + +func isMerge(n *Node) bool { + return n.Kind == ScalarNode && n.Value == "<<" && (n.Tag == "" || n.Tag == "!" || shortTag(n.Tag) == mergeTag) +} diff --git a/vendor/gopkg.in/yaml.v3/emitterc.go b/vendor/gopkg.in/yaml.v3/emitterc.go new file mode 100644 index 0000000000..c29217ef54 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/emitterc.go @@ -0,0 +1,2022 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "bytes" + "fmt" +) + +// Flush the buffer if needed. +func flush(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) { + return yaml_emitter_flush(emitter) + } + return true +} + +// Put a character to the output buffer. +func put(emitter *yaml_emitter_t, value byte) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + emitter.buffer[emitter.buffer_pos] = value + emitter.buffer_pos++ + emitter.column++ + return true +} + +// Put a line break to the output buffer. +func put_break(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + switch emitter.line_break { + case yaml_CR_BREAK: + emitter.buffer[emitter.buffer_pos] = '\r' + emitter.buffer_pos += 1 + case yaml_LN_BREAK: + emitter.buffer[emitter.buffer_pos] = '\n' + emitter.buffer_pos += 1 + case yaml_CRLN_BREAK: + emitter.buffer[emitter.buffer_pos+0] = '\r' + emitter.buffer[emitter.buffer_pos+1] = '\n' + emitter.buffer_pos += 2 + default: + panic("unknown line break setting") + } + if emitter.column == 0 { + emitter.space_above = true + } + emitter.column = 0 + emitter.line++ + // [Go] Do this here and below and drop from everywhere else (see commented lines). + emitter.indention = true + return true +} + +// Copy a character from a string into buffer. +func write(emitter *yaml_emitter_t, s []byte, i *int) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + p := emitter.buffer_pos + w := width(s[*i]) + switch w { + case 4: + emitter.buffer[p+3] = s[*i+3] + fallthrough + case 3: + emitter.buffer[p+2] = s[*i+2] + fallthrough + case 2: + emitter.buffer[p+1] = s[*i+1] + fallthrough + case 1: + emitter.buffer[p+0] = s[*i+0] + default: + panic("unknown character width") + } + emitter.column++ + emitter.buffer_pos += w + *i += w + return true +} + +// Write a whole string into buffer. +func write_all(emitter *yaml_emitter_t, s []byte) bool { + for i := 0; i < len(s); { + if !write(emitter, s, &i) { + return false + } + } + return true +} + +// Copy a line break character from a string into buffer. +func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { + if s[*i] == '\n' { + if !put_break(emitter) { + return false + } + *i++ + } else { + if !write(emitter, s, i) { + return false + } + if emitter.column == 0 { + emitter.space_above = true + } + emitter.column = 0 + emitter.line++ + // [Go] Do this here and above and drop from everywhere else (see commented lines). + emitter.indention = true + } + return true +} + +// Set an emitter error and return false. +func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_EMITTER_ERROR + emitter.problem = problem + return false +} + +// Emit an event. +func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.events = append(emitter.events, *event) + for !yaml_emitter_need_more_events(emitter) { + event := &emitter.events[emitter.events_head] + if !yaml_emitter_analyze_event(emitter, event) { + return false + } + if !yaml_emitter_state_machine(emitter, event) { + return false + } + yaml_event_delete(event) + emitter.events_head++ + } + return true +} + +// Check if we need to accumulate more events before emitting. +// +// We accumulate extra +// - 1 event for DOCUMENT-START +// - 2 events for SEQUENCE-START +// - 3 events for MAPPING-START +// +func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { + if emitter.events_head == len(emitter.events) { + return true + } + var accumulate int + switch emitter.events[emitter.events_head].typ { + case yaml_DOCUMENT_START_EVENT: + accumulate = 1 + break + case yaml_SEQUENCE_START_EVENT: + accumulate = 2 + break + case yaml_MAPPING_START_EVENT: + accumulate = 3 + break + default: + return false + } + if len(emitter.events)-emitter.events_head > accumulate { + return false + } + var level int + for i := emitter.events_head; i < len(emitter.events); i++ { + switch emitter.events[i].typ { + case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: + level++ + case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: + level-- + } + if level == 0 { + return false + } + } + return true +} + +// Append a directive to the directives stack. +func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { + for i := 0; i < len(emitter.tag_directives); i++ { + if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") + } + } + + // [Go] Do we actually need to copy this given garbage collection + // and the lack of deallocating destructors? + tag_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(tag_copy.handle, value.handle) + copy(tag_copy.prefix, value.prefix) + emitter.tag_directives = append(emitter.tag_directives, tag_copy) + return true +} + +// Increase the indentation level. +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { + emitter.indents = append(emitter.indents, emitter.indent) + if emitter.indent < 0 { + if flow { + emitter.indent = emitter.best_indent + } else { + emitter.indent = 0 + } + } else if !indentless { + // [Go] This was changed so that indentations are more regular. + if emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE { + // The first indent inside a sequence will just skip the "- " indicator. + emitter.indent += 2 + } else { + // Everything else aligns to the chosen indentation. + emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent) + } + } + return true +} + +// State dispatcher. +func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { + switch emitter.state { + default: + case yaml_EMIT_STREAM_START_STATE: + return yaml_emitter_emit_stream_start(emitter, event) + + case yaml_EMIT_FIRST_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, true) + + case yaml_EMIT_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, false) + + case yaml_EMIT_DOCUMENT_CONTENT_STATE: + return yaml_emitter_emit_document_content(emitter, event) + + case yaml_EMIT_DOCUMENT_END_STATE: + return yaml_emitter_emit_document_end(emitter, event) + + case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, true, false) + + case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false, true) + + case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false, false) + + case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, true, false) + + case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false, true) + + case yaml_EMIT_FLOW_MAPPING_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false, false) + + case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, false) + + case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, true) + + case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, false) + + case yaml_EMIT_END_STATE: + return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") + } + panic("invalid emitter state") +} + +// Expect STREAM-START. +func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_STREAM_START_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") + } + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = event.encoding + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = yaml_UTF8_ENCODING + } + } + if emitter.best_indent < 2 || emitter.best_indent > 9 { + emitter.best_indent = 2 + } + if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { + emitter.best_width = 80 + } + if emitter.best_width < 0 { + emitter.best_width = 1<<31 - 1 + } + if emitter.line_break == yaml_ANY_BREAK { + emitter.line_break = yaml_LN_BREAK + } + + emitter.indent = -1 + emitter.line = 0 + emitter.column = 0 + emitter.whitespace = true + emitter.indention = true + emitter.space_above = true + emitter.foot_indent = -1 + + if emitter.encoding != yaml_UTF8_ENCODING { + if !yaml_emitter_write_bom(emitter) { + return false + } + } + emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE + return true +} + +// Expect DOCUMENT-START or STREAM-END. +func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + + if event.typ == yaml_DOCUMENT_START_EVENT { + + if event.version_directive != nil { + if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { + return false + } + } + + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { + return false + } + if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { + return false + } + } + + for i := 0; i < len(default_tag_directives); i++ { + tag_directive := &default_tag_directives[i] + if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { + return false + } + } + + implicit := event.implicit + if !first || emitter.canonical { + implicit = false + } + + if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if event.version_directive != nil { + implicit = false + if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if len(event.tag_directives) > 0 { + implicit = false + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { + return false + } + if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + if yaml_emitter_check_empty_document(emitter) { + implicit = false + } + if !implicit { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { + return false + } + if emitter.canonical || true { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + if len(emitter.head_comment) > 0 { + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !put_break(emitter) { + return false + } + } + + emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE + return true + } + + if event.typ == yaml_STREAM_END_EVENT { + if emitter.open_ended { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_END_STATE + return true + } + + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") +} + +// Expect the root node. +func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !yaml_emitter_emit_node(emitter, event, true, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// Expect DOCUMENT-END. +func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_DOCUMENT_END_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") + } + // [Go] Force document foot separation. + emitter.foot_indent = 0 + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.foot_indent = -1 + if !yaml_emitter_write_indent(emitter) { + return false + } + if !event.implicit { + // [Go] Allocate the slice elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_DOCUMENT_START_STATE + emitter.tag_directives = emitter.tag_directives[:0] + return true +} + +// Expect a flow item node. +func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_SEQUENCE_END_EVENT { + if emitter.canonical && !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.column == 0 || emitter.canonical && !first { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + + return true + } + + if !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if emitter.column == 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE) + } else { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) + } + if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { + return false + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// Expect a flow key node. +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_MAPPING_END_EVENT { + if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_head_comment(emitter) { + return false + } + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + + if !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + + if emitter.column == 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a flow value node. +func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { + return false + } + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE) + } else { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) + } + if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { + return false + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// Expect a block item node. +func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, false) { + return false + } + } + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) + if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +// Expect a block key node. +func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, false) { + return false + } + } + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if event.typ == yaml_MAPPING_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if len(emitter.line_comment) > 0 { + // [Go] A line comment was provided for the key. That's unusual as the + // scanner associates line comments with the value. Either way, + // save the line comment and render it appropriately later. + emitter.key_line_comment = emitter.line_comment + emitter.line_comment = nil + } + if yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block value node. +func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { + return false + } + } + if len(emitter.key_line_comment) > 0 { + // [Go] A line comment was previously provided for the key. Handle it before + // the value so the inline comments are placed correctly. + if yaml_emitter_silent_nil_event(emitter, event) && len(emitter.line_comment) == 0 { + // Nothing other than the line comment will be written on the line. + emitter.line_comment = emitter.key_line_comment + emitter.key_line_comment = nil + } else { + // An actual value is coming, so emit the comment line. + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + if !yaml_emitter_process_line_comment(emitter) { + return false + } + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + // Indent in unless it's a block that will reindent anyway. + if event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || (event.typ != yaml_MAPPING_START_EVENT && event.typ != yaml_SEQUENCE_START_EVENT) { + emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent) + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) + if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +func yaml_emitter_silent_nil_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + return event.typ == yaml_SCALAR_EVENT && event.implicit && !emitter.canonical && len(emitter.scalar_data.value) == 0 +} + +// Expect a node. +func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, + root bool, sequence bool, mapping bool, simple_key bool) bool { + + emitter.root_context = root + emitter.sequence_context = sequence + emitter.mapping_context = mapping + emitter.simple_key_context = simple_key + + switch event.typ { + case yaml_ALIAS_EVENT: + return yaml_emitter_emit_alias(emitter, event) + case yaml_SCALAR_EVENT: + return yaml_emitter_emit_scalar(emitter, event) + case yaml_SEQUENCE_START_EVENT: + return yaml_emitter_emit_sequence_start(emitter, event) + case yaml_MAPPING_START_EVENT: + return yaml_emitter_emit_mapping_start(emitter, event) + default: + return yaml_emitter_set_emitter_error(emitter, + fmt.Sprintf("expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS, but got %v", event.typ)) + } +} + +// Expect ALIAS. +func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SCALAR. +func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_select_scalar_style(emitter, event) { + return false + } + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + if !yaml_emitter_process_scalar(emitter) { + return false + } + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SEQUENCE-START. +func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || + yaml_emitter_check_empty_sequence(emitter) { + emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE + } + return true +} + +// Expect MAPPING-START. +func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || + yaml_emitter_check_empty_mapping(emitter) { + emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE + } + return true +} + +// Check if the document content is an empty scalar. +func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { + return false // [Go] Huh? +} + +// Check if the next events represent an empty sequence. +func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT +} + +// Check if the next events represent an empty mapping. +func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT +} + +// Check if the next node can be expressed as a simple key. +func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { + length := 0 + switch emitter.events[emitter.events_head].typ { + case yaml_ALIAS_EVENT: + length += len(emitter.anchor_data.anchor) + case yaml_SCALAR_EVENT: + if emitter.scalar_data.multiline { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + + len(emitter.scalar_data.value) + case yaml_SEQUENCE_START_EVENT: + if !yaml_emitter_check_empty_sequence(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + case yaml_MAPPING_START_EVENT: + if !yaml_emitter_check_empty_mapping(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + default: + return false + } + return length <= 128 +} + +// Determine an acceptable scalar style. +func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 + if no_tag && !event.implicit && !event.quoted_implicit { + return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") + } + + style := event.scalar_style() + if style == yaml_ANY_SCALAR_STYLE { + style = yaml_PLAIN_SCALAR_STYLE + } + if emitter.canonical { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + if emitter.simple_key_context && emitter.scalar_data.multiline { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + if style == yaml_PLAIN_SCALAR_STYLE { + if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || + emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if no_tag && !event.implicit { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { + if !emitter.scalar_data.single_quoted_allowed { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { + if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + + if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { + emitter.tag_data.handle = []byte{'!'} + } + emitter.scalar_data.style = style + return true +} + +// Write an anchor. +func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { + if emitter.anchor_data.anchor == nil { + return true + } + c := []byte{'&'} + if emitter.anchor_data.alias { + c[0] = '*' + } + if !yaml_emitter_write_indicator(emitter, c, true, false, false) { + return false + } + return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) +} + +// Write a tag. +func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { + if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { + return true + } + if len(emitter.tag_data.handle) > 0 { + if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { + return false + } + if len(emitter.tag_data.suffix) > 0 { + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + } + } else { + // [Go] Allocate these slices elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { + return false + } + } + return true +} + +// Write a scalar. +func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { + switch emitter.scalar_data.style { + case yaml_PLAIN_SCALAR_STYLE: + return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_SINGLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_DOUBLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_LITERAL_SCALAR_STYLE: + return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) + + case yaml_FOLDED_SCALAR_STYLE: + return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) + } + panic("unknown scalar style") +} + +// Write a head comment. +func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool { + if len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.tail_comment) { + return false + } + emitter.tail_comment = emitter.tail_comment[:0] + emitter.foot_indent = emitter.indent + if emitter.foot_indent < 0 { + emitter.foot_indent = 0 + } + } + + if len(emitter.head_comment) == 0 { + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.head_comment) { + return false + } + emitter.head_comment = emitter.head_comment[:0] + return true +} + +// Write an line comment. +func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool { + if len(emitter.line_comment) == 0 { + return true + } + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !yaml_emitter_write_comment(emitter, emitter.line_comment) { + return false + } + emitter.line_comment = emitter.line_comment[:0] + return true +} + +// Write a foot comment. +func yaml_emitter_process_foot_comment(emitter *yaml_emitter_t) bool { + if len(emitter.foot_comment) == 0 { + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.foot_comment) { + return false + } + emitter.foot_comment = emitter.foot_comment[:0] + emitter.foot_indent = emitter.indent + if emitter.foot_indent < 0 { + emitter.foot_indent = 0 + } + return true +} + +// Check if a %YAML directive is valid. +func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { + if version_directive.major != 1 || version_directive.minor != 1 { + return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") + } + return true +} + +// Check if a %TAG directive is valid. +func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { + handle := tag_directive.handle + prefix := tag_directive.prefix + if len(handle) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") + } + if handle[0] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") + } + if handle[len(handle)-1] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") + } + for i := 1; i < len(handle)-1; i += width(handle[i]) { + if !is_alpha(handle, i) { + return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") + } + } + if len(prefix) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") + } + return true +} + +// Check if an anchor is valid. +func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { + if len(anchor) == 0 { + problem := "anchor value must not be empty" + if alias { + problem = "alias value must not be empty" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + for i := 0; i < len(anchor); i += width(anchor[i]) { + if !is_alpha(anchor, i) { + problem := "anchor value must contain alphanumerical characters only" + if alias { + problem = "alias value must contain alphanumerical characters only" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + } + emitter.anchor_data.anchor = anchor + emitter.anchor_data.alias = alias + return true +} + +// Check if a tag is valid. +func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { + if len(tag) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") + } + for i := 0; i < len(emitter.tag_directives); i++ { + tag_directive := &emitter.tag_directives[i] + if bytes.HasPrefix(tag, tag_directive.prefix) { + emitter.tag_data.handle = tag_directive.handle + emitter.tag_data.suffix = tag[len(tag_directive.prefix):] + return true + } + } + emitter.tag_data.suffix = tag + return true +} + +// Check if a scalar is valid. +func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { + var ( + block_indicators = false + flow_indicators = false + line_breaks = false + special_characters = false + tab_characters = false + + leading_space = false + leading_break = false + trailing_space = false + trailing_break = false + break_space = false + space_break = false + + preceded_by_whitespace = false + followed_by_whitespace = false + previous_space = false + previous_break = false + ) + + emitter.scalar_data.value = value + + if len(value) == 0 { + emitter.scalar_data.multiline = false + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = false + return true + } + + if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { + block_indicators = true + flow_indicators = true + } + + preceded_by_whitespace = true + for i, w := 0, 0; i < len(value); i += w { + w = width(value[i]) + followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) + + if i == 0 { + switch value[i] { + case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': + flow_indicators = true + block_indicators = true + case '?', ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '-': + if followed_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } else { + switch value[i] { + case ',', '?', '[', ']', '{', '}': + flow_indicators = true + case ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '#': + if preceded_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } + + if value[i] == '\t' { + tab_characters = true + } else if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { + special_characters = true + } + if is_space(value, i) { + if i == 0 { + leading_space = true + } + if i+width(value[i]) == len(value) { + trailing_space = true + } + if previous_break { + break_space = true + } + previous_space = true + previous_break = false + } else if is_break(value, i) { + line_breaks = true + if i == 0 { + leading_break = true + } + if i+width(value[i]) == len(value) { + trailing_break = true + } + if previous_space { + space_break = true + } + previous_space = false + previous_break = true + } else { + previous_space = false + previous_break = false + } + + // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. + preceded_by_whitespace = is_blankz(value, i) + } + + emitter.scalar_data.multiline = line_breaks + emitter.scalar_data.flow_plain_allowed = true + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = true + + if leading_space || leading_break || trailing_space || trailing_break { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if trailing_space { + emitter.scalar_data.block_allowed = false + } + if break_space { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + } + if space_break || tab_characters || special_characters { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + } + if space_break || special_characters { + emitter.scalar_data.block_allowed = false + } + if line_breaks { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if flow_indicators { + emitter.scalar_data.flow_plain_allowed = false + } + if block_indicators { + emitter.scalar_data.block_plain_allowed = false + } + return true +} + +// Check if the event data is valid. +func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + emitter.anchor_data.anchor = nil + emitter.tag_data.handle = nil + emitter.tag_data.suffix = nil + emitter.scalar_data.value = nil + + if len(event.head_comment) > 0 { + emitter.head_comment = event.head_comment + } + if len(event.line_comment) > 0 { + emitter.line_comment = event.line_comment + } + if len(event.foot_comment) > 0 { + emitter.foot_comment = event.foot_comment + } + if len(event.tail_comment) > 0 { + emitter.tail_comment = event.tail_comment + } + + switch event.typ { + case yaml_ALIAS_EVENT: + if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { + return false + } + + case yaml_SCALAR_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + if !yaml_emitter_analyze_scalar(emitter, event.value) { + return false + } + + case yaml_SEQUENCE_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + + case yaml_MAPPING_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + } + return true +} + +// Write the BOM character. +func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { + if !flush(emitter) { + return false + } + pos := emitter.buffer_pos + emitter.buffer[pos+0] = '\xEF' + emitter.buffer[pos+1] = '\xBB' + emitter.buffer[pos+2] = '\xBF' + emitter.buffer_pos += 3 + return true +} + +func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { + indent := emitter.indent + if indent < 0 { + indent = 0 + } + if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { + if !put_break(emitter) { + return false + } + } + if emitter.foot_indent == indent { + if !put_break(emitter) { + return false + } + } + for emitter.column < indent { + if !put(emitter, ' ') { + return false + } + } + emitter.whitespace = true + //emitter.indention = true + emitter.space_above = false + emitter.foot_indent = -1 + return true +} + +func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, indicator) { + return false + } + emitter.whitespace = is_whitespace + emitter.indention = (emitter.indention && is_indention) + emitter.open_ended = false + return true +} + +func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + for i := 0; i < len(value); { + var must_write bool + switch value[i] { + case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': + must_write = true + default: + must_write = is_alpha(value, i) + } + if must_write { + if !write(emitter, value, &i) { + return false + } + } else { + w := width(value[i]) + for k := 0; k < w; k++ { + octet := value[i] + i++ + if !put(emitter, '%') { + return false + } + + c := octet >> 4 + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + + c = octet & 0x0f + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + } + } + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + if len(value) > 0 && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + //emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + + if len(value) > 0 { + emitter.whitespace = false + } + emitter.indention = false + if emitter.root_context { + emitter.open_ended = true + } + + return true +} + +func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { + return false + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + //emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if value[i] == '\'' { + if !put(emitter, '\'') { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + spaces := false + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { + return false + } + + for i := 0; i < len(value); { + if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || + is_bom(value, i) || is_break(value, i) || + value[i] == '"' || value[i] == '\\' { + + octet := value[i] + + var w int + var v rune + switch { + case octet&0x80 == 0x00: + w, v = 1, rune(octet&0x7F) + case octet&0xE0 == 0xC0: + w, v = 2, rune(octet&0x1F) + case octet&0xF0 == 0xE0: + w, v = 3, rune(octet&0x0F) + case octet&0xF8 == 0xF0: + w, v = 4, rune(octet&0x07) + } + for k := 1; k < w; k++ { + octet = value[i+k] + v = (v << 6) + (rune(octet) & 0x3F) + } + i += w + + if !put(emitter, '\\') { + return false + } + + var ok bool + switch v { + case 0x00: + ok = put(emitter, '0') + case 0x07: + ok = put(emitter, 'a') + case 0x08: + ok = put(emitter, 'b') + case 0x09: + ok = put(emitter, 't') + case 0x0A: + ok = put(emitter, 'n') + case 0x0b: + ok = put(emitter, 'v') + case 0x0c: + ok = put(emitter, 'f') + case 0x0d: + ok = put(emitter, 'r') + case 0x1b: + ok = put(emitter, 'e') + case 0x22: + ok = put(emitter, '"') + case 0x5c: + ok = put(emitter, '\\') + case 0x85: + ok = put(emitter, 'N') + case 0xA0: + ok = put(emitter, '_') + case 0x2028: + ok = put(emitter, 'L') + case 0x2029: + ok = put(emitter, 'P') + default: + if v <= 0xFF { + ok = put(emitter, 'x') + w = 2 + } else if v <= 0xFFFF { + ok = put(emitter, 'u') + w = 4 + } else { + ok = put(emitter, 'U') + w = 8 + } + for k := (w - 1) * 4; ok && k >= 0; k -= 4 { + digit := byte((v >> uint(k)) & 0x0F) + if digit < 10 { + ok = put(emitter, digit+'0') + } else { + ok = put(emitter, digit+'A'-10) + } + } + } + if !ok { + return false + } + spaces = false + } else if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if is_space(value, i+1) { + if !put(emitter, '\\') { + return false + } + } + i += width(value[i]) + } else if !write(emitter, value, &i) { + return false + } + spaces = true + } else { + if !write(emitter, value, &i) { + return false + } + spaces = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { + if is_space(value, 0) || is_break(value, 0) { + indent_hint := []byte{'0' + byte(emitter.best_indent)} + if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { + return false + } + } + + emitter.open_ended = false + + var chomp_hint [1]byte + if len(value) == 0 { + chomp_hint[0] = '-' + } else { + i := len(value) - 1 + for value[i]&0xC0 == 0x80 { + i-- + } + if !is_break(value, i) { + chomp_hint[0] = '-' + } else if i == 0 { + chomp_hint[0] = '+' + emitter.open_ended = true + } else { + i-- + for value[i]&0xC0 == 0x80 { + i-- + } + if is_break(value, i) { + chomp_hint[0] = '+' + emitter.open_ended = true + } + } + } + if chomp_hint[0] != 0 { + if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { + return false + } + } + return true +} + +func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + if !put_break(emitter) { + return false + } + //emitter.indention = true + emitter.whitespace = true + breaks := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !write_break(emitter, value, &i) { + return false + } + //emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + + return true +} + +func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + + if !put_break(emitter) { + return false + } + //emitter.indention = true + emitter.whitespace = true + + breaks := true + leading_spaces := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !breaks && !leading_spaces && value[i] == '\n' { + k := 0 + for is_break(value, k) { + k += width(value[k]) + } + if !is_blankz(value, k) { + if !put_break(emitter) { + return false + } + } + } + if !write_break(emitter, value, &i) { + return false + } + //emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + leading_spaces = is_blank(value, i) + } + if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + emitter.indention = false + breaks = false + } + } + return true +} + +func yaml_emitter_write_comment(emitter *yaml_emitter_t, comment []byte) bool { + breaks := false + pound := false + for i := 0; i < len(comment); { + if is_break(comment, i) { + if !write_break(emitter, comment, &i) { + return false + } + //emitter.indention = true + breaks = true + pound = false + } else { + if breaks && !yaml_emitter_write_indent(emitter) { + return false + } + if !pound { + if comment[i] != '#' && (!put(emitter, '#') || !put(emitter, ' ')) { + return false + } + pound = true + } + if !write(emitter, comment, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + if !breaks && !put_break(emitter) { + return false + } + + emitter.whitespace = true + //emitter.indention = true + return true +} diff --git a/vendor/gopkg.in/yaml.v3/encode.go b/vendor/gopkg.in/yaml.v3/encode.go new file mode 100644 index 0000000000..45e8d1e1b9 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/encode.go @@ -0,0 +1,572 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "encoding" + "fmt" + "io" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +type encoder struct { + emitter yaml_emitter_t + event yaml_event_t + out []byte + flow bool + indent int + doneInit bool +} + +func newEncoder() *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_string(&e.emitter, &e.out) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func newEncoderWithWriter(w io.Writer) *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_writer(&e.emitter, w) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func (e *encoder) init() { + if e.doneInit { + return + } + if e.indent == 0 { + e.indent = 4 + } + e.emitter.best_indent = e.indent + yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) + e.emit() + e.doneInit = true +} + +func (e *encoder) finish() { + e.emitter.open_ended = false + yaml_stream_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) destroy() { + yaml_emitter_delete(&e.emitter) +} + +func (e *encoder) emit() { + // This will internally delete the e.event value. + e.must(yaml_emitter_emit(&e.emitter, &e.event)) +} + +func (e *encoder) must(ok bool) { + if !ok { + msg := e.emitter.problem + if msg == "" { + msg = "unknown problem generating YAML content" + } + failf("%s", msg) + } +} + +func (e *encoder) marshalDoc(tag string, in reflect.Value) { + e.init() + var node *Node + if in.IsValid() { + node, _ = in.Interface().(*Node) + } + if node != nil && node.Kind == DocumentNode { + e.nodev(in) + } else { + yaml_document_start_event_initialize(&e.event, nil, nil, true) + e.emit() + e.marshal(tag, in) + yaml_document_end_event_initialize(&e.event, true) + e.emit() + } +} + +func (e *encoder) marshal(tag string, in reflect.Value) { + tag = shortTag(tag) + if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { + e.nilv() + return + } + iface := in.Interface() + switch value := iface.(type) { + case *Node: + e.nodev(in) + return + case Node: + e.nodev(in.Addr()) + return + case time.Time: + e.timev(tag, in) + return + case *time.Time: + e.timev(tag, in.Elem()) + return + case time.Duration: + e.stringv(tag, reflect.ValueOf(value.String())) + return + case Marshaler: + v, err := value.MarshalYAML() + if err != nil { + fail(err) + } + if v == nil { + e.nilv() + return + } + e.marshal(tag, reflect.ValueOf(v)) + return + case encoding.TextMarshaler: + text, err := value.MarshalText() + if err != nil { + fail(err) + } + in = reflect.ValueOf(string(text)) + case nil: + e.nilv() + return + } + switch in.Kind() { + case reflect.Interface: + e.marshal(tag, in.Elem()) + case reflect.Map: + e.mapv(tag, in) + case reflect.Ptr: + e.marshal(tag, in.Elem()) + case reflect.Struct: + e.structv(tag, in) + case reflect.Slice, reflect.Array: + e.slicev(tag, in) + case reflect.String: + e.stringv(tag, in) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + e.intv(tag, in) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + e.uintv(tag, in) + case reflect.Float32, reflect.Float64: + e.floatv(tag, in) + case reflect.Bool: + e.boolv(tag, in) + default: + panic("cannot marshal type: " + in.Type().String()) + } +} + +func (e *encoder) mapv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + keys := keyList(in.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + e.marshal("", k) + e.marshal("", in.MapIndex(k)) + } + }) +} + +func (e *encoder) fieldByIndex(v reflect.Value, index []int) (field reflect.Value) { + for _, num := range index { + for { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + return reflect.Value{} + } + v = v.Elem() + continue + } + break + } + v = v.Field(num) + } + return v +} + +func (e *encoder) structv(tag string, in reflect.Value) { + sinfo, err := getStructInfo(in.Type()) + if err != nil { + panic(err) + } + e.mappingv(tag, func() { + for _, info := range sinfo.FieldsList { + var value reflect.Value + if info.Inline == nil { + value = in.Field(info.Num) + } else { + value = e.fieldByIndex(in, info.Inline) + if !value.IsValid() { + continue + } + } + if info.OmitEmpty && isZero(value) { + continue + } + e.marshal("", reflect.ValueOf(info.Key)) + e.flow = info.Flow + e.marshal("", value) + } + if sinfo.InlineMap >= 0 { + m := in.Field(sinfo.InlineMap) + if m.Len() > 0 { + e.flow = false + keys := keyList(m.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + if _, found := sinfo.FieldsMap[k.String()]; found { + panic(fmt.Sprintf("cannot have key %q in inlined map: conflicts with struct field", k.String())) + } + e.marshal("", k) + e.flow = false + e.marshal("", m.MapIndex(k)) + } + } + } + }) +} + +func (e *encoder) mappingv(tag string, f func()) { + implicit := tag == "" + style := yaml_BLOCK_MAPPING_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_MAPPING_STYLE + } + yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) + e.emit() + f() + yaml_mapping_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) slicev(tag string, in reflect.Value) { + implicit := tag == "" + style := yaml_BLOCK_SEQUENCE_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) + e.emit() + n := in.Len() + for i := 0; i < n; i++ { + e.marshal("", in.Index(i)) + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.emit() +} + +// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. +// +// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported +// in YAML 1.2 and by this package, but these should be marshalled quoted for +// the time being for compatibility with other parsers. +func isBase60Float(s string) (result bool) { + // Fast path. + if s == "" { + return false + } + c := s[0] + if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { + return false + } + // Do the full match. + return base60float.MatchString(s) +} + +// From http://yaml.org/type/float.html, except the regular expression there +// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. +var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) + +// isOldBool returns whether s is bool notation as defined in YAML 1.1. +// +// We continue to force strings that YAML 1.1 would interpret as booleans to be +// rendered as quotes strings so that the marshalled output valid for YAML 1.1 +// parsing. +func isOldBool(s string) (result bool) { + switch s { + case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON", + "n", "N", "no", "No", "NO", "off", "Off", "OFF": + return true + default: + return false + } +} + +func (e *encoder) stringv(tag string, in reflect.Value) { + var style yaml_scalar_style_t + s := in.String() + canUsePlain := true + switch { + case !utf8.ValidString(s): + if tag == binaryTag { + failf("explicitly tagged !!binary data must be base64-encoded") + } + if tag != "" { + failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) + } + // It can't be encoded directly as YAML so use a binary tag + // and encode it as base64. + tag = binaryTag + s = encodeBase64(s) + case tag == "": + // Check to see if it would resolve to a specific + // tag when encoded unquoted. If it doesn't, + // there's no need to quote it. + rtag, _ := resolve("", s) + canUsePlain = rtag == strTag && !(isBase60Float(s) || isOldBool(s)) + } + // Note: it's possible for user code to emit invalid YAML + // if they explicitly specify a tag and a string containing + // text that's incompatible with that tag. + switch { + case strings.Contains(s, "\n"): + if e.flow { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } else { + style = yaml_LITERAL_SCALAR_STYLE + } + case canUsePlain: + style = yaml_PLAIN_SCALAR_STYLE + default: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + e.emitScalar(s, "", tag, style, nil, nil, nil, nil) +} + +func (e *encoder) boolv(tag string, in reflect.Value) { + var s string + if in.Bool() { + s = "true" + } else { + s = "false" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) intv(tag string, in reflect.Value) { + s := strconv.FormatInt(in.Int(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) uintv(tag string, in reflect.Value) { + s := strconv.FormatUint(in.Uint(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) timev(tag string, in reflect.Value) { + t := in.Interface().(time.Time) + s := t.Format(time.RFC3339Nano) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) floatv(tag string, in reflect.Value) { + // Issue #352: When formatting, use the precision of the underlying value + precision := 64 + if in.Kind() == reflect.Float32 { + precision = 32 + } + + s := strconv.FormatFloat(in.Float(), 'g', -1, precision) + switch s { + case "+Inf": + s = ".inf" + case "-Inf": + s = "-.inf" + case "NaN": + s = ".nan" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) nilv() { + e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t, head, line, foot, tail []byte) { + // TODO Kill this function. Replace all initialize calls by their underlining Go literals. + implicit := tag == "" + if !implicit { + tag = longTag(tag) + } + e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) + e.event.head_comment = head + e.event.line_comment = line + e.event.foot_comment = foot + e.event.tail_comment = tail + e.emit() +} + +func (e *encoder) nodev(in reflect.Value) { + e.node(in.Interface().(*Node), "") +} + +func (e *encoder) node(node *Node, tail string) { + // Zero nodes behave as nil. + if node.Kind == 0 && node.IsZero() { + e.nilv() + return + } + + // If the tag was not explicitly requested, and dropping it won't change the + // implicit tag of the value, don't include it in the presentation. + var tag = node.Tag + var stag = shortTag(tag) + var forceQuoting bool + if tag != "" && node.Style&TaggedStyle == 0 { + if node.Kind == ScalarNode { + if stag == strTag && node.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0 { + tag = "" + } else { + rtag, _ := resolve("", node.Value) + if rtag == stag { + tag = "" + } else if stag == strTag { + tag = "" + forceQuoting = true + } + } + } else { + var rtag string + switch node.Kind { + case MappingNode: + rtag = mapTag + case SequenceNode: + rtag = seqTag + } + if rtag == stag { + tag = "" + } + } + } + + switch node.Kind { + case DocumentNode: + yaml_document_start_event_initialize(&e.event, nil, nil, true) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + for _, node := range node.Content { + e.node(node, "") + } + yaml_document_end_event_initialize(&e.event, true) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case SequenceNode: + style := yaml_BLOCK_SEQUENCE_STYLE + if node.Style&FlowStyle != 0 { + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style)) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + for _, node := range node.Content { + e.node(node, "") + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case MappingNode: + style := yaml_BLOCK_MAPPING_STYLE + if node.Style&FlowStyle != 0 { + style = yaml_FLOW_MAPPING_STYLE + } + yaml_mapping_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style) + e.event.tail_comment = []byte(tail) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + + // The tail logic below moves the foot comment of prior keys to the following key, + // since the value for each key may be a nested structure and the foot needs to be + // processed only the entirety of the value is streamed. The last tail is processed + // with the mapping end event. + var tail string + for i := 0; i+1 < len(node.Content); i += 2 { + k := node.Content[i] + foot := k.FootComment + if foot != "" { + kopy := *k + kopy.FootComment = "" + k = &kopy + } + e.node(k, tail) + tail = foot + + v := node.Content[i+1] + e.node(v, "") + } + + yaml_mapping_end_event_initialize(&e.event) + e.event.tail_comment = []byte(tail) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case AliasNode: + yaml_alias_event_initialize(&e.event, []byte(node.Value)) + e.event.head_comment = []byte(node.HeadComment) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case ScalarNode: + value := node.Value + if !utf8.ValidString(value) { + if stag == binaryTag { + failf("explicitly tagged !!binary data must be base64-encoded") + } + if stag != "" { + failf("cannot marshal invalid UTF-8 data as %s", stag) + } + // It can't be encoded directly as YAML so use a binary tag + // and encode it as base64. + tag = binaryTag + value = encodeBase64(value) + } + + style := yaml_PLAIN_SCALAR_STYLE + switch { + case node.Style&DoubleQuotedStyle != 0: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + case node.Style&SingleQuotedStyle != 0: + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + case node.Style&LiteralStyle != 0: + style = yaml_LITERAL_SCALAR_STYLE + case node.Style&FoldedStyle != 0: + style = yaml_FOLDED_SCALAR_STYLE + case strings.Contains(value, "\n"): + style = yaml_LITERAL_SCALAR_STYLE + case forceQuoting: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + e.emitScalar(value, node.Anchor, tag, style, []byte(node.HeadComment), []byte(node.LineComment), []byte(node.FootComment), []byte(tail)) + default: + failf("cannot encode node with unknown kind %d", node.Kind) + } +} diff --git a/vendor/gopkg.in/yaml.v3/go.mod b/vendor/gopkg.in/yaml.v3/go.mod new file mode 100644 index 0000000000..f407ea3213 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/go.mod @@ -0,0 +1,5 @@ +module "gopkg.in/yaml.v3" + +require ( + "gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405 +) diff --git a/vendor/gopkg.in/yaml.v3/parserc.go b/vendor/gopkg.in/yaml.v3/parserc.go new file mode 100644 index 0000000000..ac66fccc05 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/parserc.go @@ -0,0 +1,1249 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "bytes" +) + +// The parser implements the following grammar: +// +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// implicit_document ::= block_node DOCUMENT-END* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// block_node_or_indentless_sequence ::= +// ALIAS +// | properties (block_content | indentless_block_sequence)? +// | block_content +// | indentless_block_sequence +// block_node ::= ALIAS +// | properties block_content? +// | block_content +// flow_node ::= ALIAS +// | properties flow_content? +// | flow_content +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// block_content ::= block_collection | flow_collection | SCALAR +// flow_content ::= flow_collection | SCALAR +// block_collection ::= block_sequence | block_mapping +// flow_collection ::= flow_sequence | flow_mapping +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// block_mapping ::= BLOCK-MAPPING_START +// ((KEY block_node_or_indentless_sequence?)? +// (VALUE block_node_or_indentless_sequence?)?)* +// BLOCK-END +// flow_sequence ::= FLOW-SEQUENCE-START +// (flow_sequence_entry FLOW-ENTRY)* +// flow_sequence_entry? +// FLOW-SEQUENCE-END +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// flow_mapping ::= FLOW-MAPPING-START +// (flow_mapping_entry FLOW-ENTRY)* +// flow_mapping_entry? +// FLOW-MAPPING-END +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + +// Peek the next token in the token queue. +func peek_token(parser *yaml_parser_t) *yaml_token_t { + if parser.token_available || yaml_parser_fetch_more_tokens(parser) { + token := &parser.tokens[parser.tokens_head] + yaml_parser_unfold_comments(parser, token) + return token + } + return nil +} + +// yaml_parser_unfold_comments walks through the comments queue and joins all +// comments behind the position of the provided token into the respective +// top-level comment slices in the parser. +func yaml_parser_unfold_comments(parser *yaml_parser_t, token *yaml_token_t) { + for parser.comments_head < len(parser.comments) && token.start_mark.index >= parser.comments[parser.comments_head].token_mark.index { + comment := &parser.comments[parser.comments_head] + if len(comment.head) > 0 { + if token.typ == yaml_BLOCK_END_TOKEN { + // No heads on ends, so keep comment.head for a follow up token. + break + } + if len(parser.head_comment) > 0 { + parser.head_comment = append(parser.head_comment, '\n') + } + parser.head_comment = append(parser.head_comment, comment.head...) + } + if len(comment.foot) > 0 { + if len(parser.foot_comment) > 0 { + parser.foot_comment = append(parser.foot_comment, '\n') + } + parser.foot_comment = append(parser.foot_comment, comment.foot...) + } + if len(comment.line) > 0 { + if len(parser.line_comment) > 0 { + parser.line_comment = append(parser.line_comment, '\n') + } + parser.line_comment = append(parser.line_comment, comment.line...) + } + *comment = yaml_comment_t{} + parser.comments_head++ + } +} + +// Remove the next token from the queue (must be called after peek_token). +func skip_token(parser *yaml_parser_t) { + parser.token_available = false + parser.tokens_parsed++ + parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN + parser.tokens_head++ +} + +// Get the next event. +func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { + // Erase the event object. + *event = yaml_event_t{} + + // No events after the end of the stream or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { + return true + } + + // Generate the next event. + return yaml_parser_state_machine(parser, event) +} + +// Set parser error. +func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +// State dispatcher. +func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { + //trace("yaml_parser_state_machine", "state:", parser.state.String()) + + switch parser.state { + case yaml_PARSE_STREAM_START_STATE: + return yaml_parser_parse_stream_start(parser, event) + + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, true) + + case yaml_PARSE_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, false) + + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return yaml_parser_parse_document_content(parser, event) + + case yaml_PARSE_DOCUMENT_END_STATE: + return yaml_parser_parse_document_end(parser, event) + + case yaml_PARSE_BLOCK_NODE_STATE: + return yaml_parser_parse_node(parser, event, true, false) + + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return yaml_parser_parse_node(parser, event, true, true) + + case yaml_PARSE_FLOW_NODE_STATE: + return yaml_parser_parse_node(parser, event, false, false) + + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, true) + + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, false) + + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_indentless_sequence_entry(parser, event) + + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, true) + + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, false) + + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return yaml_parser_parse_block_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, true) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, false) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) + + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, true) + + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, true) + + default: + panic("invalid parser state") + } +} + +// Parse the production: +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// ************ +func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_STREAM_START_TOKEN { + return yaml_parser_set_parser_error(parser, "did not find expected <stream-start>", token.start_mark) + } + parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + encoding: token.encoding, + } + skip_token(parser) + return true +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// * +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// ************************* +func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { + + token := peek_token(parser) + if token == nil { + return false + } + + // Parse extra document end indicators. + if !implicit { + for token.typ == yaml_DOCUMENT_END_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && + token.typ != yaml_TAG_DIRECTIVE_TOKEN && + token.typ != yaml_DOCUMENT_START_TOKEN && + token.typ != yaml_STREAM_END_TOKEN { + // Parse an implicit document. + if !yaml_parser_process_directives(parser, nil, nil) { + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_BLOCK_NODE_STATE + + var head_comment []byte + if len(parser.head_comment) > 0 { + // [Go] Scan the header comment backwards, and if an empty line is found, break + // the header so the part before the last empty line goes into the + // document header, while the bottom of it goes into a follow up event. + for i := len(parser.head_comment) - 1; i > 0; i-- { + if parser.head_comment[i] == '\n' { + if i == len(parser.head_comment)-1 { + head_comment = parser.head_comment[:i] + parser.head_comment = parser.head_comment[i+1:] + break + } else if parser.head_comment[i-1] == '\n' { + head_comment = parser.head_comment[:i-1] + parser.head_comment = parser.head_comment[i+1:] + break + } + } + } + } + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + + head_comment: head_comment, + } + + } else if token.typ != yaml_STREAM_END_TOKEN { + // Parse an explicit document. + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + start_mark := token.start_mark + if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { + return false + } + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_DOCUMENT_START_TOKEN { + yaml_parser_set_parser_error(parser, + "did not find expected <document start>", token.start_mark) + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE + end_mark := token.end_mark + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: false, + } + skip_token(parser) + + } else { + // Parse the stream end. + parser.state = yaml_PARSE_END_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + } + + return true +} + +// Parse the productions: +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// *********** +// +func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || + token.typ == yaml_TAG_DIRECTIVE_TOKEN || + token.typ == yaml_DOCUMENT_START_TOKEN || + token.typ == yaml_DOCUMENT_END_TOKEN || + token.typ == yaml_STREAM_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + return yaml_parser_process_empty_scalar(parser, event, + token.start_mark) + } + return yaml_parser_parse_node(parser, event, true, false) +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// ************* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// +func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + start_mark := token.start_mark + end_mark := token.start_mark + + implicit := true + if token.typ == yaml_DOCUMENT_END_TOKEN { + end_mark = token.end_mark + skip_token(parser) + implicit = false + } + + parser.tag_directives = parser.tag_directives[:0] + + parser.state = yaml_PARSE_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + start_mark: start_mark, + end_mark: end_mark, + implicit: implicit, + } + yaml_parser_set_event_comments(parser, event) + if len(event.head_comment) > 0 && len(event.foot_comment) == 0 { + event.foot_comment = event.head_comment + event.head_comment = nil + } + return true +} + +func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t) { + event.head_comment = parser.head_comment + event.line_comment = parser.line_comment + event.foot_comment = parser.foot_comment + parser.head_comment = nil + parser.line_comment = nil + parser.foot_comment = nil + parser.tail_comment = nil + parser.stem_comment = nil +} + +// Parse the productions: +// block_node_or_indentless_sequence ::= +// ALIAS +// ***** +// | properties (block_content | indentless_block_sequence)? +// ********** * +// | block_content | indentless_block_sequence +// * +// block_node ::= ALIAS +// ***** +// | properties block_content? +// ********** * +// | block_content +// * +// flow_node ::= ALIAS +// ***** +// | properties flow_content? +// ********** * +// | flow_content +// * +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// ************************* +// block_content ::= block_collection | flow_collection | SCALAR +// ****** +// flow_content ::= flow_collection | SCALAR +// ****** +func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { + //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_ALIAS_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + anchor: token.value, + } + yaml_parser_set_event_comments(parser, event) + skip_token(parser) + return true + } + + start_mark := token.start_mark + end_mark := token.start_mark + + var tag_token bool + var tag_handle, tag_suffix, anchor []byte + var tag_mark yaml_mark_t + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + start_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } else if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + start_mark = token.start_mark + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + var tag []byte + if tag_token { + if len(tag_handle) == 0 { + tag = tag_suffix + tag_suffix = nil + } else { + for i := range parser.tag_directives { + if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { + tag = append([]byte(nil), parser.tag_directives[i].prefix...) + tag = append(tag, tag_suffix...) + break + } + } + if len(tag) == 0 { + yaml_parser_set_parser_error_context(parser, + "while parsing a node", start_mark, + "found undefined tag handle", tag_mark) + return false + } + } + } + + implicit := len(tag) == 0 + if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_SCALAR_TOKEN { + var plain_implicit, quoted_implicit bool + end_mark = token.end_mark + if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { + plain_implicit = true + } else if len(tag) == 0 { + quoted_implicit = true + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + value: token.value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(token.style), + } + yaml_parser_set_event_comments(parser, event) + skip_token(parser) + return true + } + if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { + // [Go] Some of the events below can be merged as they differ only on style. + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), + } + yaml_parser_set_event_comments(parser, event) + return true + } + if token.typ == yaml_FLOW_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + yaml_parser_set_event_comments(parser, event) + return true + } + if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + if parser.stem_comment != nil { + event.head_comment = parser.stem_comment + parser.stem_comment = nil + } + return true + } + if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), + } + if parser.stem_comment != nil { + event.head_comment = parser.stem_comment + parser.stem_comment = nil + } + return true + } + if len(anchor) > 0 || len(tag) > 0 { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + quoted_implicit: false, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true + } + + context := "while parsing a flow node" + if block { + context = "while parsing a block node" + } + yaml_parser_set_parser_error_context(parser, context, start_mark, + "did not find expected node content", token.start_mark) + return false +} + +// Parse the productions: +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// ******************** *********** * ********* +// +func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + prior_head_len := len(parser.head_comment) + skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } else { + parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } + if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block collection", context_mark, + "did not find expected '-' indicator", token.start_mark) +} + +// Parse the productions: +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// *********** * +func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + prior_head_len := len(parser.head_comment) + skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && + token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? + } + return true +} + +// Split stem comment from head comment. +// +// When a sequence or map is found under a sequence entry, the former head comment +// is assigned to the underlying sequence or map as a whole, not the individual +// sequence or map entry as would be expected otherwise. To handle this case the +// previous head comment is moved aside as the stem comment. +func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) { + if stem_len == 0 { + return + } + + token := peek_token(parser) + if token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN { + return + } + + parser.stem_comment = parser.head_comment[:stem_len] + if len(parser.head_comment) == stem_len { + parser.head_comment = nil + } else { + // Copy suffix to prevent very strange bugs if someone ever appends + // further bytes to the prefix in the stem_comment slice above. + parser.head_comment = append([]byte(nil), parser.head_comment[stem_len+1:]...) + } +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// ******************* +// ((KEY block_node_or_indentless_sequence?)? +// *** * +// (VALUE block_node_or_indentless_sequence?)?)* +// +// BLOCK-END +// ********* +// +func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + // [Go] A tail comment was left from the prior mapping value processed. Emit an event + // as it needs to be processed with that value and not the following key. + if len(parser.tail_comment) > 0 { + *event = yaml_event_t{ + typ: yaml_TAIL_COMMENT_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + foot_comment: parser.tail_comment, + } + parser.tail_comment = nil + return true + } + + if token.typ == yaml_KEY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } else { + parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } else if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + yaml_parser_set_event_comments(parser, event) + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block mapping", context_mark, + "did not find expected key", token.start_mark) +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// +// ((KEY block_node_or_indentless_sequence?)? +// +// (VALUE block_node_or_indentless_sequence?)?)* +// ***** * +// BLOCK-END +// +// +func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence ::= FLOW-SEQUENCE-START +// ******************* +// (flow_sequence_entry FLOW-ENTRY)* +// * ********** +// flow_sequence_entry? +// * +// FLOW-SEQUENCE-END +// ***************** +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow sequence", context_mark, + "did not find expected ',' or ']'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + implicit: true, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + skip_token(parser) + return true + } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + yaml_parser_set_event_comments(parser, event) + + skip_token(parser) + return true +} + +// +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// *** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + mark := token.end_mark + skip_token(parser) + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// ***** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? + } + return true +} + +// Parse the productions: +// flow_mapping ::= FLOW-MAPPING-START +// ****************** +// (flow_mapping_entry FLOW-ENTRY)* +// * ********** +// flow_mapping_entry? +// ****************** +// FLOW-MAPPING-END +// **************** +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * *** * +// +func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow mapping", context_mark, + "did not find expected ',' or '}'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } else { + parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + yaml_parser_set_event_comments(parser, event) + skip_token(parser) + return true +} + +// Parse the productions: +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * ***** * +// +func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { + token := peek_token(parser) + if token == nil { + return false + } + if empty { + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Generate an empty scalar event. +func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: mark, + end_mark: mark, + value: nil, // Empty + implicit: true, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true +} + +var default_tag_directives = []yaml_tag_directive_t{ + {[]byte("!"), []byte("!")}, + {[]byte("!!"), []byte("tag:yaml.org,2002:")}, +} + +// Parse directives. +func yaml_parser_process_directives(parser *yaml_parser_t, + version_directive_ref **yaml_version_directive_t, + tag_directives_ref *[]yaml_tag_directive_t) bool { + + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + + token := peek_token(parser) + if token == nil { + return false + } + + for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { + if version_directive != nil { + yaml_parser_set_parser_error(parser, + "found duplicate %YAML directive", token.start_mark) + return false + } + if token.major != 1 || token.minor != 1 { + yaml_parser_set_parser_error(parser, + "found incompatible YAML document", token.start_mark) + return false + } + version_directive = &yaml_version_directive_t{ + major: token.major, + minor: token.minor, + } + } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { + value := yaml_tag_directive_t{ + handle: token.value, + prefix: token.prefix, + } + if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { + return false + } + tag_directives = append(tag_directives, value) + } + + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + + for i := range default_tag_directives { + if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { + return false + } + } + + if version_directive_ref != nil { + *version_directive_ref = version_directive + } + if tag_directives_ref != nil { + *tag_directives_ref = tag_directives + } + return true +} + +// Append a tag directive to the directives stack. +func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { + for i := range parser.tag_directives { + if bytes.Equal(value.handle, parser.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) + } + } + + // [Go] I suspect the copy is unnecessary. This was likely done + // because there was no way to track ownership of the data. + value_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(value_copy.handle, value.handle) + copy(value_copy.prefix, value.prefix) + parser.tag_directives = append(parser.tag_directives, value_copy) + return true +} diff --git a/vendor/gopkg.in/yaml.v3/readerc.go b/vendor/gopkg.in/yaml.v3/readerc.go new file mode 100644 index 0000000000..b7de0a89c4 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/readerc.go @@ -0,0 +1,434 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "io" +) + +// Set the reader error and return 0. +func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { + parser.error = yaml_READER_ERROR + parser.problem = problem + parser.problem_offset = offset + parser.problem_value = value + return false +} + +// Byte order marks. +const ( + bom_UTF8 = "\xef\xbb\xbf" + bom_UTF16LE = "\xff\xfe" + bom_UTF16BE = "\xfe\xff" +) + +// Determine the input stream encoding by checking the BOM symbol. If no BOM is +// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. +func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { + // Ensure that we had enough bytes in the raw buffer. + for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { + if !yaml_parser_update_raw_buffer(parser) { + return false + } + } + + // Determine the encoding. + buf := parser.raw_buffer + pos := parser.raw_buffer_pos + avail := len(buf) - pos + if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { + parser.encoding = yaml_UTF16LE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { + parser.encoding = yaml_UTF16BE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { + parser.encoding = yaml_UTF8_ENCODING + parser.raw_buffer_pos += 3 + parser.offset += 3 + } else { + parser.encoding = yaml_UTF8_ENCODING + } + return true +} + +// Update the raw buffer. +func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { + size_read := 0 + + // Return if the raw buffer is full. + if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { + return true + } + + // Return on EOF. + if parser.eof { + return true + } + + // Move the remaining bytes in the raw buffer to the beginning. + if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { + copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) + } + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] + parser.raw_buffer_pos = 0 + + // Call the read handler to fill the buffer. + size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] + if err == io.EOF { + parser.eof = true + } else if err != nil { + return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) + } + return true +} + +// Ensure that the buffer contains at least `length` characters. +// Return true on success, false on failure. +// +// The length is supposed to be significantly less that the buffer size. +func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { + if parser.read_handler == nil { + panic("read handler must be set") + } + + // [Go] This function was changed to guarantee the requested length size at EOF. + // The fact we need to do this is pretty awful, but the description above implies + // for that to be the case, and there are tests + + // If the EOF flag is set and the raw buffer is empty, do nothing. + if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { + // [Go] ACTUALLY! Read the documentation of this function above. + // This is just broken. To return true, we need to have the + // given length in the buffer. Not doing that means every single + // check that calls this function to make sure the buffer has a + // given length is Go) panicking; or C) accessing invalid memory. + //return true + } + + // Return if the buffer contains enough characters. + if parser.unread >= length { + return true + } + + // Determine the input encoding if it is not known yet. + if parser.encoding == yaml_ANY_ENCODING { + if !yaml_parser_determine_encoding(parser) { + return false + } + } + + // Move the unread characters to the beginning of the buffer. + buffer_len := len(parser.buffer) + if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { + copy(parser.buffer, parser.buffer[parser.buffer_pos:]) + buffer_len -= parser.buffer_pos + parser.buffer_pos = 0 + } else if parser.buffer_pos == buffer_len { + buffer_len = 0 + parser.buffer_pos = 0 + } + + // Open the whole buffer for writing, and cut it before returning. + parser.buffer = parser.buffer[:cap(parser.buffer)] + + // Fill the buffer until it has enough characters. + first := true + for parser.unread < length { + + // Fill the raw buffer if necessary. + if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { + if !yaml_parser_update_raw_buffer(parser) { + parser.buffer = parser.buffer[:buffer_len] + return false + } + } + first = false + + // Decode the raw buffer. + inner: + for parser.raw_buffer_pos != len(parser.raw_buffer) { + var value rune + var width int + + raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos + + // Decode the next character. + switch parser.encoding { + case yaml_UTF8_ENCODING: + // Decode a UTF-8 character. Check RFC 3629 + // (http://www.ietf.org/rfc/rfc3629.txt) for more details. + // + // The following table (taken from the RFC) is used for + // decoding. + // + // Char. number range | UTF-8 octet sequence + // (hexadecimal) | (binary) + // --------------------+------------------------------------ + // 0000 0000-0000 007F | 0xxxxxxx + // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + // + // Additionally, the characters in the range 0xD800-0xDFFF + // are prohibited as they are reserved for use with UTF-16 + // surrogate pairs. + + // Determine the length of the UTF-8 sequence. + octet := parser.raw_buffer[parser.raw_buffer_pos] + switch { + case octet&0x80 == 0x00: + width = 1 + case octet&0xE0 == 0xC0: + width = 2 + case octet&0xF0 == 0xE0: + width = 3 + case octet&0xF8 == 0xF0: + width = 4 + default: + // The leading octet is invalid. + return yaml_parser_set_reader_error(parser, + "invalid leading UTF-8 octet", + parser.offset, int(octet)) + } + + // Check if the raw buffer contains an incomplete character. + if width > raw_unread { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-8 octet sequence", + parser.offset, -1) + } + break inner + } + + // Decode the leading octet. + switch { + case octet&0x80 == 0x00: + value = rune(octet & 0x7F) + case octet&0xE0 == 0xC0: + value = rune(octet & 0x1F) + case octet&0xF0 == 0xE0: + value = rune(octet & 0x0F) + case octet&0xF8 == 0xF0: + value = rune(octet & 0x07) + default: + value = 0 + } + + // Check and decode the trailing octets. + for k := 1; k < width; k++ { + octet = parser.raw_buffer[parser.raw_buffer_pos+k] + + // Check if the octet is valid. + if (octet & 0xC0) != 0x80 { + return yaml_parser_set_reader_error(parser, + "invalid trailing UTF-8 octet", + parser.offset+k, int(octet)) + } + + // Decode the octet. + value = (value << 6) + rune(octet&0x3F) + } + + // Check the length of the sequence against the value. + switch { + case width == 1: + case width == 2 && value >= 0x80: + case width == 3 && value >= 0x800: + case width == 4 && value >= 0x10000: + default: + return yaml_parser_set_reader_error(parser, + "invalid length of a UTF-8 sequence", + parser.offset, -1) + } + + // Check the range of the value. + if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { + return yaml_parser_set_reader_error(parser, + "invalid Unicode character", + parser.offset, int(value)) + } + + case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: + var low, high int + if parser.encoding == yaml_UTF16LE_ENCODING { + low, high = 0, 1 + } else { + low, high = 1, 0 + } + + // The UTF-16 encoding is not as simple as one might + // naively think. Check RFC 2781 + // (http://www.ietf.org/rfc/rfc2781.txt). + // + // Normally, two subsequent bytes describe a Unicode + // character. However a special technique (called a + // surrogate pair) is used for specifying character + // values larger than 0xFFFF. + // + // A surrogate pair consists of two pseudo-characters: + // high surrogate area (0xD800-0xDBFF) + // low surrogate area (0xDC00-0xDFFF) + // + // The following formulas are used for decoding + // and encoding characters using surrogate pairs: + // + // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) + // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) + // W1 = 110110yyyyyyyyyy + // W2 = 110111xxxxxxxxxx + // + // where U is the character value, W1 is the high surrogate + // area, W2 is the low surrogate area. + + // Check for incomplete UTF-16 character. + if raw_unread < 2 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 character", + parser.offset, -1) + } + break inner + } + + // Get the character. + value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) + + // Check for unexpected low surrogate area. + if value&0xFC00 == 0xDC00 { + return yaml_parser_set_reader_error(parser, + "unexpected low surrogate area", + parser.offset, int(value)) + } + + // Check for a high surrogate area. + if value&0xFC00 == 0xD800 { + width = 4 + + // Check for incomplete surrogate pair. + if raw_unread < 4 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 surrogate pair", + parser.offset, -1) + } + break inner + } + + // Get the next character. + value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) + + // Check for a low surrogate area. + if value2&0xFC00 != 0xDC00 { + return yaml_parser_set_reader_error(parser, + "expected low surrogate area", + parser.offset+2, int(value2)) + } + + // Generate the value of the surrogate pair. + value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) + } else { + width = 2 + } + + default: + panic("impossible") + } + + // Check if the character is in the allowed range: + // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) + // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) + // | [#x10000-#x10FFFF] (32 bit) + switch { + case value == 0x09: + case value == 0x0A: + case value == 0x0D: + case value >= 0x20 && value <= 0x7E: + case value == 0x85: + case value >= 0xA0 && value <= 0xD7FF: + case value >= 0xE000 && value <= 0xFFFD: + case value >= 0x10000 && value <= 0x10FFFF: + default: + return yaml_parser_set_reader_error(parser, + "control characters are not allowed", + parser.offset, int(value)) + } + + // Move the raw pointers. + parser.raw_buffer_pos += width + parser.offset += width + + // Finally put the character into the buffer. + if value <= 0x7F { + // 0000 0000-0000 007F . 0xxxxxxx + parser.buffer[buffer_len+0] = byte(value) + buffer_len += 1 + } else if value <= 0x7FF { + // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) + parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) + buffer_len += 2 + } else if value <= 0xFFFF { + // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) + buffer_len += 3 + } else { + // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) + buffer_len += 4 + } + + parser.unread++ + } + + // On EOF, put NUL into the buffer and return. + if parser.eof { + parser.buffer[buffer_len] = 0 + buffer_len++ + parser.unread++ + break + } + } + // [Go] Read the documentation of this function above. To return true, + // we need to have the given length in the buffer. Not doing that means + // every single check that calls this function to make sure the buffer + // has a given length is Go) panicking; or C) accessing invalid memory. + // This happens here due to the EOF above breaking early. + for buffer_len < length { + parser.buffer[buffer_len] = 0 + buffer_len++ + } + parser.buffer = parser.buffer[:buffer_len] + return true +} diff --git a/vendor/gopkg.in/yaml.v3/resolve.go b/vendor/gopkg.in/yaml.v3/resolve.go new file mode 100644 index 0000000000..64ae888057 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/resolve.go @@ -0,0 +1,326 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "encoding/base64" + "math" + "regexp" + "strconv" + "strings" + "time" +) + +type resolveMapItem struct { + value interface{} + tag string +} + +var resolveTable = make([]byte, 256) +var resolveMap = make(map[string]resolveMapItem) + +func init() { + t := resolveTable + t[int('+')] = 'S' // Sign + t[int('-')] = 'S' + for _, c := range "0123456789" { + t[int(c)] = 'D' // Digit + } + for _, c := range "yYnNtTfFoO~" { + t[int(c)] = 'M' // In map + } + t[int('.')] = '.' // Float (potentially in map) + + var resolveMapList = []struct { + v interface{} + tag string + l []string + }{ + {true, boolTag, []string{"true", "True", "TRUE"}}, + {false, boolTag, []string{"false", "False", "FALSE"}}, + {nil, nullTag, []string{"", "~", "null", "Null", "NULL"}}, + {math.NaN(), floatTag, []string{".nan", ".NaN", ".NAN"}}, + {math.Inf(+1), floatTag, []string{".inf", ".Inf", ".INF"}}, + {math.Inf(+1), floatTag, []string{"+.inf", "+.Inf", "+.INF"}}, + {math.Inf(-1), floatTag, []string{"-.inf", "-.Inf", "-.INF"}}, + {"<<", mergeTag, []string{"<<"}}, + } + + m := resolveMap + for _, item := range resolveMapList { + for _, s := range item.l { + m[s] = resolveMapItem{item.v, item.tag} + } + } +} + +const ( + nullTag = "!!null" + boolTag = "!!bool" + strTag = "!!str" + intTag = "!!int" + floatTag = "!!float" + timestampTag = "!!timestamp" + seqTag = "!!seq" + mapTag = "!!map" + binaryTag = "!!binary" + mergeTag = "!!merge" +) + +var longTags = make(map[string]string) +var shortTags = make(map[string]string) + +func init() { + for _, stag := range []string{nullTag, boolTag, strTag, intTag, floatTag, timestampTag, seqTag, mapTag, binaryTag, mergeTag} { + ltag := longTag(stag) + longTags[stag] = ltag + shortTags[ltag] = stag + } +} + +const longTagPrefix = "tag:yaml.org,2002:" + +func shortTag(tag string) string { + if strings.HasPrefix(tag, longTagPrefix) { + if stag, ok := shortTags[tag]; ok { + return stag + } + return "!!" + tag[len(longTagPrefix):] + } + return tag +} + +func longTag(tag string) string { + if strings.HasPrefix(tag, "!!") { + if ltag, ok := longTags[tag]; ok { + return ltag + } + return longTagPrefix + tag[2:] + } + return tag +} + +func resolvableTag(tag string) bool { + switch tag { + case "", strTag, boolTag, intTag, floatTag, nullTag, timestampTag: + return true + } + return false +} + +var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`) + +func resolve(tag string, in string) (rtag string, out interface{}) { + tag = shortTag(tag) + if !resolvableTag(tag) { + return tag, in + } + + defer func() { + switch tag { + case "", rtag, strTag, binaryTag: + return + case floatTag: + if rtag == intTag { + switch v := out.(type) { + case int64: + rtag = floatTag + out = float64(v) + return + case int: + rtag = floatTag + out = float64(v) + return + } + } + } + failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) + }() + + // Any data is accepted as a !!str or !!binary. + // Otherwise, the prefix is enough of a hint about what it might be. + hint := byte('N') + if in != "" { + hint = resolveTable[in[0]] + } + if hint != 0 && tag != strTag && tag != binaryTag { + // Handle things we can lookup in a map. + if item, ok := resolveMap[in]; ok { + return item.tag, item.value + } + + // Base 60 floats are a bad idea, were dropped in YAML 1.2, and + // are purposefully unsupported here. They're still quoted on + // the way out for compatibility with other parser, though. + + switch hint { + case 'M': + // We've already checked the map above. + + case '.': + // Not in the map, so maybe a normal float. + floatv, err := strconv.ParseFloat(in, 64) + if err == nil { + return floatTag, floatv + } + + case 'D', 'S': + // Int, float, or timestamp. + // Only try values as a timestamp if the value is unquoted or there's an explicit + // !!timestamp tag. + if tag == "" || tag == timestampTag { + t, ok := parseTimestamp(in) + if ok { + return timestampTag, t + } + } + + plain := strings.Replace(in, "_", "", -1) + intv, err := strconv.ParseInt(plain, 0, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain, 0, 64) + if err == nil { + return intTag, uintv + } + if yamlStyleFloat.MatchString(plain) { + floatv, err := strconv.ParseFloat(plain, 64) + if err == nil { + return floatTag, floatv + } + } + if strings.HasPrefix(plain, "0b") { + intv, err := strconv.ParseInt(plain[2:], 2, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 2, 64) + if err == nil { + return intTag, uintv + } + } else if strings.HasPrefix(plain, "-0b") { + intv, err := strconv.ParseInt("-"+plain[3:], 2, 64) + if err == nil { + if true || intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + } + // Octals as introduced in version 1.2 of the spec. + // Octals from the 1.1 spec, spelled as 0777, are still + // decoded by default in v3 as well for compatibility. + // May be dropped in v4 depending on how usage evolves. + if strings.HasPrefix(plain, "0o") { + intv, err := strconv.ParseInt(plain[2:], 8, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 8, 64) + if err == nil { + return intTag, uintv + } + } else if strings.HasPrefix(plain, "-0o") { + intv, err := strconv.ParseInt("-"+plain[3:], 8, 64) + if err == nil { + if true || intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + } + default: + panic("internal error: missing handler for resolver table: " + string(rune(hint)) + " (with " + in + ")") + } + } + return strTag, in +} + +// encodeBase64 encodes s as base64 that is broken up into multiple lines +// as appropriate for the resulting length. +func encodeBase64(s string) string { + const lineLen = 70 + encLen := base64.StdEncoding.EncodedLen(len(s)) + lines := encLen/lineLen + 1 + buf := make([]byte, encLen*2+lines) + in := buf[0:encLen] + out := buf[encLen:] + base64.StdEncoding.Encode(in, []byte(s)) + k := 0 + for i := 0; i < len(in); i += lineLen { + j := i + lineLen + if j > len(in) { + j = len(in) + } + k += copy(out[k:], in[i:j]) + if lines > 1 { + out[k] = '\n' + k++ + } + } + return string(out[:k]) +} + +// This is a subset of the formats allowed by the regular expression +// defined at http://yaml.org/type/timestamp.html. +var allowedTimestampFormats = []string{ + "2006-1-2T15:4:5.999999999Z07:00", // RCF3339Nano with short date fields. + "2006-1-2t15:4:5.999999999Z07:00", // RFC3339Nano with short date fields and lower-case "t". + "2006-1-2 15:4:5.999999999", // space separated with no time zone + "2006-1-2", // date only + // Notable exception: time.Parse cannot handle: "2001-12-14 21:59:43.10 -5" + // from the set of examples. +} + +// parseTimestamp parses s as a timestamp string and +// returns the timestamp and reports whether it succeeded. +// Timestamp formats are defined at http://yaml.org/type/timestamp.html +func parseTimestamp(s string) (time.Time, bool) { + // TODO write code to check all the formats supported by + // http://yaml.org/type/timestamp.html instead of using time.Parse. + + // Quick check: all date formats start with YYYY-. + i := 0 + for ; i < len(s); i++ { + if c := s[i]; c < '0' || c > '9' { + break + } + } + if i != 4 || i == len(s) || s[i] != '-' { + return time.Time{}, false + } + for _, format := range allowedTimestampFormats { + if t, err := time.Parse(format, s); err == nil { + return t, true + } + } + return time.Time{}, false +} diff --git a/vendor/gopkg.in/yaml.v3/scannerc.go b/vendor/gopkg.in/yaml.v3/scannerc.go new file mode 100644 index 0000000000..d9a539c39a --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/scannerc.go @@ -0,0 +1,3028 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "bytes" + "fmt" +) + +// Introduction +// ************ +// +// The following notes assume that you are familiar with the YAML specification +// (http://yaml.org/spec/1.2/spec.html). We mostly follow it, although in +// some cases we are less restrictive that it requires. +// +// The process of transforming a YAML stream into a sequence of events is +// divided on two steps: Scanning and Parsing. +// +// The Scanner transforms the input stream into a sequence of tokens, while the +// parser transform the sequence of tokens produced by the Scanner into a +// sequence of parsing events. +// +// The Scanner is rather clever and complicated. The Parser, on the contrary, +// is a straightforward implementation of a recursive-descendant parser (or, +// LL(1) parser, as it is usually called). +// +// Actually there are two issues of Scanning that might be called "clever", the +// rest is quite straightforward. The issues are "block collection start" and +// "simple keys". Both issues are explained below in details. +// +// Here the Scanning step is explained and implemented. We start with the list +// of all the tokens produced by the Scanner together with short descriptions. +// +// Now, tokens: +// +// STREAM-START(encoding) # The stream start. +// STREAM-END # The stream end. +// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. +// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. +// DOCUMENT-START # '---' +// DOCUMENT-END # '...' +// BLOCK-SEQUENCE-START # Indentation increase denoting a block +// BLOCK-MAPPING-START # sequence or a block mapping. +// BLOCK-END # Indentation decrease. +// FLOW-SEQUENCE-START # '[' +// FLOW-SEQUENCE-END # ']' +// BLOCK-SEQUENCE-START # '{' +// BLOCK-SEQUENCE-END # '}' +// BLOCK-ENTRY # '-' +// FLOW-ENTRY # ',' +// KEY # '?' or nothing (simple keys). +// VALUE # ':' +// ALIAS(anchor) # '*anchor' +// ANCHOR(anchor) # '&anchor' +// TAG(handle,suffix) # '!handle!suffix' +// SCALAR(value,style) # A scalar. +// +// The following two tokens are "virtual" tokens denoting the beginning and the +// end of the stream: +// +// STREAM-START(encoding) +// STREAM-END +// +// We pass the information about the input stream encoding with the +// STREAM-START token. +// +// The next two tokens are responsible for tags: +// +// VERSION-DIRECTIVE(major,minor) +// TAG-DIRECTIVE(handle,prefix) +// +// Example: +// +// %YAML 1.1 +// %TAG ! !foo +// %TAG !yaml! tag:yaml.org,2002: +// --- +// +// The correspoding sequence of tokens: +// +// STREAM-START(utf-8) +// VERSION-DIRECTIVE(1,1) +// TAG-DIRECTIVE("!","!foo") +// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") +// DOCUMENT-START +// STREAM-END +// +// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole +// line. +// +// The document start and end indicators are represented by: +// +// DOCUMENT-START +// DOCUMENT-END +// +// Note that if a YAML stream contains an implicit document (without '---' +// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be +// produced. +// +// In the following examples, we present whole documents together with the +// produced tokens. +// +// 1. An implicit document: +// +// 'a scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// STREAM-END +// +// 2. An explicit document: +// +// --- +// 'a scalar' +// ... +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// SCALAR("a scalar",single-quoted) +// DOCUMENT-END +// STREAM-END +// +// 3. Several documents in a stream: +// +// 'a scalar' +// --- +// 'another scalar' +// --- +// 'yet another scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// DOCUMENT-START +// SCALAR("another scalar",single-quoted) +// DOCUMENT-START +// SCALAR("yet another scalar",single-quoted) +// STREAM-END +// +// We have already introduced the SCALAR token above. The following tokens are +// used to describe aliases, anchors, tag, and scalars: +// +// ALIAS(anchor) +// ANCHOR(anchor) +// TAG(handle,suffix) +// SCALAR(value,style) +// +// The following series of examples illustrate the usage of these tokens: +// +// 1. A recursive sequence: +// +// &A [ *A ] +// +// Tokens: +// +// STREAM-START(utf-8) +// ANCHOR("A") +// FLOW-SEQUENCE-START +// ALIAS("A") +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A tagged scalar: +// +// !!float "3.14" # A good approximation. +// +// Tokens: +// +// STREAM-START(utf-8) +// TAG("!!","float") +// SCALAR("3.14",double-quoted) +// STREAM-END +// +// 3. Various scalar styles: +// +// --- # Implicit empty plain scalars do not produce tokens. +// --- a plain scalar +// --- 'a single-quoted scalar' +// --- "a double-quoted scalar" +// --- |- +// a literal scalar +// --- >- +// a folded +// scalar +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// DOCUMENT-START +// SCALAR("a plain scalar",plain) +// DOCUMENT-START +// SCALAR("a single-quoted scalar",single-quoted) +// DOCUMENT-START +// SCALAR("a double-quoted scalar",double-quoted) +// DOCUMENT-START +// SCALAR("a literal scalar",literal) +// DOCUMENT-START +// SCALAR("a folded scalar",folded) +// STREAM-END +// +// Now it's time to review collection-related tokens. We will start with +// flow collections: +// +// FLOW-SEQUENCE-START +// FLOW-SEQUENCE-END +// FLOW-MAPPING-START +// FLOW-MAPPING-END +// FLOW-ENTRY +// KEY +// VALUE +// +// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and +// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' +// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the +// indicators '?' and ':', which are used for denoting mapping keys and values, +// are represented by the KEY and VALUE tokens. +// +// The following examples show flow collections: +// +// 1. A flow sequence: +// +// [item 1, item 2, item 3] +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-SEQUENCE-START +// SCALAR("item 1",plain) +// FLOW-ENTRY +// SCALAR("item 2",plain) +// FLOW-ENTRY +// SCALAR("item 3",plain) +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A flow mapping: +// +// { +// a simple key: a value, # Note that the KEY token is produced. +// ? a complex key: another value, +// } +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// FLOW-ENTRY +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// FLOW-ENTRY +// FLOW-MAPPING-END +// STREAM-END +// +// A simple key is a key which is not denoted by the '?' indicator. Note that +// the Scanner still produce the KEY token whenever it encounters a simple key. +// +// For scanning block collections, the following tokens are used (note that we +// repeat KEY and VALUE here): +// +// BLOCK-SEQUENCE-START +// BLOCK-MAPPING-START +// BLOCK-END +// BLOCK-ENTRY +// KEY +// VALUE +// +// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation +// increase that precedes a block collection (cf. the INDENT token in Python). +// The token BLOCK-END denote indentation decrease that ends a block collection +// (cf. the DEDENT token in Python). However YAML has some syntax pecularities +// that makes detections of these tokens more complex. +// +// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators +// '-', '?', and ':' correspondingly. +// +// The following examples show how the tokens BLOCK-SEQUENCE-START, +// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: +// +// 1. Block sequences: +// +// - item 1 +// - item 2 +// - +// - item 3.1 +// - item 3.2 +// - +// key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 3.1",plain) +// BLOCK-ENTRY +// SCALAR("item 3.2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Block mappings: +// +// a simple key: a value # The KEY token is produced here. +// ? a complex key +// : another value +// a mapping: +// key 1: value 1 +// key 2: value 2 +// a sequence: +// - item 1 +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// KEY +// SCALAR("a mapping",plain) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML does not always require to start a new block collection from a new +// line. If the current line contains only '-', '?', and ':' indicators, a new +// block collection may start at the current line. The following examples +// illustrate this case: +// +// 1. Collections in a sequence: +// +// - - item 1 +// - item 2 +// - key 1: value 1 +// key 2: value 2 +// - ? complex key +// : complex value +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("complex key") +// VALUE +// SCALAR("complex value") +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Collections in a mapping: +// +// ? a sequence +// : - item 1 +// - item 2 +// ? a mapping +// : key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// KEY +// SCALAR("a mapping",plain) +// VALUE +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML also permits non-indented sequences if they are included into a block +// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: +// +// key: +// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key",plain) +// VALUE +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// + +// Ensure that the buffer contains the required number of characters. +// Return true on success, false on failure (reader error or memory error). +func cache(parser *yaml_parser_t, length int) bool { + // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) + return parser.unread >= length || yaml_parser_update_buffer(parser, length) +} + +// Advance the buffer pointer. +func skip(parser *yaml_parser_t) { + if !is_blank(parser.buffer, parser.buffer_pos) { + parser.newlines = 0 + } + parser.mark.index++ + parser.mark.column++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) +} + +func skip_line(parser *yaml_parser_t) { + if is_crlf(parser.buffer, parser.buffer_pos) { + parser.mark.index += 2 + parser.mark.column = 0 + parser.mark.line++ + parser.unread -= 2 + parser.buffer_pos += 2 + parser.newlines++ + } else if is_break(parser.buffer, parser.buffer_pos) { + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) + parser.newlines++ + } +} + +// Copy a character to a string buffer and advance pointers. +func read(parser *yaml_parser_t, s []byte) []byte { + if !is_blank(parser.buffer, parser.buffer_pos) { + parser.newlines = 0 + } + w := width(parser.buffer[parser.buffer_pos]) + if w == 0 { + panic("invalid character sequence") + } + if len(s) == 0 { + s = make([]byte, 0, 32) + } + if w == 1 && len(s)+w <= cap(s) { + s = s[:len(s)+1] + s[len(s)-1] = parser.buffer[parser.buffer_pos] + parser.buffer_pos++ + } else { + s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) + parser.buffer_pos += w + } + parser.mark.index++ + parser.mark.column++ + parser.unread-- + return s +} + +// Copy a line break character to a string buffer and advance pointers. +func read_line(parser *yaml_parser_t, s []byte) []byte { + buf := parser.buffer + pos := parser.buffer_pos + switch { + case buf[pos] == '\r' && buf[pos+1] == '\n': + // CR LF . LF + s = append(s, '\n') + parser.buffer_pos += 2 + parser.mark.index++ + parser.unread-- + case buf[pos] == '\r' || buf[pos] == '\n': + // CR|LF . LF + s = append(s, '\n') + parser.buffer_pos += 1 + case buf[pos] == '\xC2' && buf[pos+1] == '\x85': + // NEL . LF + s = append(s, '\n') + parser.buffer_pos += 2 + case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): + // LS|PS . LS|PS + s = append(s, buf[parser.buffer_pos:pos+3]...) + parser.buffer_pos += 3 + default: + return s + } + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + parser.newlines++ + return s +} + +// Get the next token. +func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { + // Erase the token object. + *token = yaml_token_t{} // [Go] Is this necessary? + + // No tokens after STREAM-END or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR { + return true + } + + // Ensure that the tokens queue contains enough tokens. + if !parser.token_available { + if !yaml_parser_fetch_more_tokens(parser) { + return false + } + } + + // Fetch the next token from the queue. + *token = parser.tokens[parser.tokens_head] + parser.tokens_head++ + parser.tokens_parsed++ + parser.token_available = false + + if token.typ == yaml_STREAM_END_TOKEN { + parser.stream_end_produced = true + } + return true +} + +// Set the scanner error and return false. +func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { + parser.error = yaml_SCANNER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = parser.mark + return false +} + +func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { + context := "while parsing a tag" + if directive { + context = "while parsing a %TAG directive" + } + return yaml_parser_set_scanner_error(parser, context, context_mark, problem) +} + +func trace(args ...interface{}) func() { + pargs := append([]interface{}{"+++"}, args...) + fmt.Println(pargs...) + pargs = append([]interface{}{"---"}, args...) + return func() { fmt.Println(pargs...) } +} + +// Ensure that the tokens queue contains at least one token which can be +// returned to the Parser. +func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { + // While we need more tokens to fetch, do it. + for { + // [Go] The comment parsing logic requires a lookahead of two tokens + // so that foot comments may be parsed in time of associating them + // with the tokens that are parsed before them, and also for line + // comments to be transformed into head comments in some edge cases. + if parser.tokens_head < len(parser.tokens)-2 { + // If a potential simple key is at the head position, we need to fetch + // the next token to disambiguate it. + head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed] + if !ok { + break + } else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok { + return false + } else if !valid { + break + } + } + // Fetch the next token. + if !yaml_parser_fetch_next_token(parser) { + return false + } + } + + parser.token_available = true + return true +} + +// The dispatcher for token fetchers. +func yaml_parser_fetch_next_token(parser *yaml_parser_t) (ok bool) { + // Ensure that the buffer is initialized. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we just started scanning. Fetch STREAM-START then. + if !parser.stream_start_produced { + return yaml_parser_fetch_stream_start(parser) + } + + scan_mark := parser.mark + + // Eat whitespaces and comments until we reach the next token. + if !yaml_parser_scan_to_next_token(parser) { + return false + } + + // [Go] While unrolling indents, transform the head comments of prior + // indentation levels observed after scan_start into foot comments at + // the respective indexes. + + // Check the indentation level against the current column. + if !yaml_parser_unroll_indent(parser, parser.mark.column, scan_mark) { + return false + } + + // Ensure that the buffer contains at least 4 characters. 4 is the length + // of the longest indicators ('--- ' and '... '). + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + // Is it the end of the stream? + if is_z(parser.buffer, parser.buffer_pos) { + return yaml_parser_fetch_stream_end(parser) + } + + // Is it a directive? + if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { + return yaml_parser_fetch_directive(parser) + } + + buf := parser.buffer + pos := parser.buffer_pos + + // Is it the document start indicator? + if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) + } + + // Is it the document end indicator? + if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) + } + + comment_mark := parser.mark + if len(parser.tokens) > 0 && (parser.flow_level == 0 && buf[pos] == ':' || parser.flow_level > 0 && buf[pos] == ',') { + // Associate any following comments with the prior token. + comment_mark = parser.tokens[len(parser.tokens)-1].start_mark + } + defer func() { + if !ok { + return + } + if len(parser.tokens) > 0 && parser.tokens[len(parser.tokens)-1].typ == yaml_BLOCK_ENTRY_TOKEN { + // Sequence indicators alone have no line comments. It becomes + // a head comment for whatever follows. + return + } + if !yaml_parser_scan_line_comment(parser, comment_mark) { + ok = false + return + } + }() + + // Is it the flow sequence start indicator? + if buf[pos] == '[' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) + } + + // Is it the flow mapping start indicator? + if parser.buffer[parser.buffer_pos] == '{' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) + } + + // Is it the flow sequence end indicator? + if parser.buffer[parser.buffer_pos] == ']' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_SEQUENCE_END_TOKEN) + } + + // Is it the flow mapping end indicator? + if parser.buffer[parser.buffer_pos] == '}' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_MAPPING_END_TOKEN) + } + + // Is it the flow entry indicator? + if parser.buffer[parser.buffer_pos] == ',' { + return yaml_parser_fetch_flow_entry(parser) + } + + // Is it the block entry indicator? + if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { + return yaml_parser_fetch_block_entry(parser) + } + + // Is it the key indicator? + if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_key(parser) + } + + // Is it the value indicator? + if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_value(parser) + } + + // Is it an alias? + if parser.buffer[parser.buffer_pos] == '*' { + return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) + } + + // Is it an anchor? + if parser.buffer[parser.buffer_pos] == '&' { + return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) + } + + // Is it a tag? + if parser.buffer[parser.buffer_pos] == '!' { + return yaml_parser_fetch_tag(parser) + } + + // Is it a literal scalar? + if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, true) + } + + // Is it a folded scalar? + if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, false) + } + + // Is it a single-quoted scalar? + if parser.buffer[parser.buffer_pos] == '\'' { + return yaml_parser_fetch_flow_scalar(parser, true) + } + + // Is it a double-quoted scalar? + if parser.buffer[parser.buffer_pos] == '"' { + return yaml_parser_fetch_flow_scalar(parser, false) + } + + // Is it a plain scalar? + // + // A plain scalar may start with any non-blank characters except + // + // '-', '?', ':', ',', '[', ']', '{', '}', + // '#', '&', '*', '!', '|', '>', '\'', '\"', + // '%', '@', '`'. + // + // In the block context (and, for the '-' indicator, in the flow context + // too), it may also start with the characters + // + // '-', '?', ':' + // + // if it is followed by a non-space character. + // + // The last rule is more restrictive than the specification requires. + // [Go] TODO Make this logic more reasonable. + //switch parser.buffer[parser.buffer_pos] { + //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': + //} + if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || + parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || + parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || + (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level == 0 && + (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && + !is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_plain_scalar(parser) + } + + // If we don't determine the token type so far, it is an error. + return yaml_parser_set_scanner_error(parser, + "while scanning for the next token", parser.mark, + "found character that cannot start any token") +} + +func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) { + if !simple_key.possible { + return false, true + } + + // The 1.2 specification says: + // + // "If the ? indicator is omitted, parsing needs to see past the + // implicit key to recognize it as such. To limit the amount of + // lookahead required, the “:” indicator must appear at most 1024 + // Unicode characters beyond the start of the key. In addition, the key + // is restricted to a single line." + // + if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index { + // Check if the potential simple key to be removed is required. + if simple_key.required { + return false, yaml_parser_set_scanner_error(parser, + "while scanning a simple key", simple_key.mark, + "could not find expected ':'") + } + simple_key.possible = false + return false, true + } + return true, true +} + +// Check if a simple key may start at the current position and add it if +// needed. +func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { + // A simple key is required at the current position if the scanner is in + // the block context and the current column coincides with the indentation + // level. + + required := parser.flow_level == 0 && parser.indent == parser.mark.column + + // + // If the current position may start a simple key, save it. + // + if parser.simple_key_allowed { + simple_key := yaml_simple_key_t{ + possible: true, + required: required, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + mark: parser.mark, + } + + if !yaml_parser_remove_simple_key(parser) { + return false + } + parser.simple_keys[len(parser.simple_keys)-1] = simple_key + parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1 + } + return true +} + +// Remove a potential simple key at the current flow level. +func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { + i := len(parser.simple_keys) - 1 + if parser.simple_keys[i].possible { + // If the key is required, it is an error. + if parser.simple_keys[i].required { + return yaml_parser_set_scanner_error(parser, + "while scanning a simple key", parser.simple_keys[i].mark, + "could not find expected ':'") + } + // Remove the key from the stack. + parser.simple_keys[i].possible = false + delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number) + } + return true +} + +// max_flow_level limits the flow_level +const max_flow_level = 10000 + +// Increase the flow level and resize the simple key list if needed. +func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { + // Reset the simple key on the next level. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{ + possible: false, + required: false, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + mark: parser.mark, + }) + + // Increase the flow level. + parser.flow_level++ + if parser.flow_level > max_flow_level { + return yaml_parser_set_scanner_error(parser, + "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_flow_level)) + } + return true +} + +// Decrease the flow level. +func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { + if parser.flow_level > 0 { + parser.flow_level-- + last := len(parser.simple_keys) - 1 + delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number) + parser.simple_keys = parser.simple_keys[:last] + } + return true +} + +// max_indents limits the indents stack size +const max_indents = 10000 + +// Push the current indentation level to the stack and set the new level +// the current column is greater than the indentation level. In this case, +// append or insert the specified token into the token queue. +func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + if parser.indent < column { + // Push the current indentation level to the stack and set the new + // indentation level. + parser.indents = append(parser.indents, parser.indent) + parser.indent = column + if len(parser.indents) > max_indents { + return yaml_parser_set_scanner_error(parser, + "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_indents)) + } + + // Create a token and insert it into the queue. + token := yaml_token_t{ + typ: typ, + start_mark: mark, + end_mark: mark, + } + if number > -1 { + number -= parser.tokens_parsed + } + yaml_insert_token(parser, number, &token) + } + return true +} + +// Pop indentation levels from the indents stack until the current level +// becomes less or equal to the column. For each indentation level, append +// the BLOCK-END token. +func yaml_parser_unroll_indent(parser *yaml_parser_t, column int, scan_mark yaml_mark_t) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + block_mark := scan_mark + block_mark.index-- + + // Loop through the indentation levels in the stack. + for parser.indent > column { + + // [Go] Reposition the end token before potential following + // foot comments of parent blocks. For that, search + // backwards for recent comments that were at the same + // indent as the block that is ending now. + stop_index := block_mark.index + for i := len(parser.comments) - 1; i >= 0; i-- { + comment := &parser.comments[i] + + if comment.end_mark.index < stop_index { + // Don't go back beyond the start of the comment/whitespace scan, unless column < 0. + // If requested indent column is < 0, then the document is over and everything else + // is a foot anyway. + break + } + if comment.start_mark.column == parser.indent+1 { + // This is a good match. But maybe there's a former comment + // at that same indent level, so keep searching. + block_mark = comment.start_mark + } + + // While the end of the former comment matches with + // the start of the following one, we know there's + // nothing in between and scanning is still safe. + stop_index = comment.scan_mark.index + } + + // Create a token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_END_TOKEN, + start_mark: block_mark, + end_mark: block_mark, + } + yaml_insert_token(parser, -1, &token) + + // Pop the indentation level. + parser.indent = parser.indents[len(parser.indents)-1] + parser.indents = parser.indents[:len(parser.indents)-1] + } + return true +} + +// Initialize the scanner and produce the STREAM-START token. +func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { + + // Set the initial indentation. + parser.indent = -1 + + // Initialize the simple key stack. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + + parser.simple_keys_by_tok = make(map[int]int) + + // A simple key is allowed at the beginning of the stream. + parser.simple_key_allowed = true + + // We have started. + parser.stream_start_produced = true + + // Create the STREAM-START token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_START_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + encoding: parser.encoding, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the STREAM-END token and shut down the scanner. +func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { + + // Force new line. + if parser.mark.column != 0 { + parser.mark.column = 0 + parser.mark.line++ + } + + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1, parser.mark) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the STREAM-END token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. +func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1, parser.mark) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. + token := yaml_token_t{} + if !yaml_parser_scan_directive(parser, &token) { + return false + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the DOCUMENT-START or DOCUMENT-END token. +func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1, parser.mark) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Consume the token. + start_mark := parser.mark + + skip(parser) + skip(parser) + skip(parser) + + end_mark := parser.mark + + // Create the DOCUMENT-START or DOCUMENT-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. +func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { + + // The indicators '[' and '{' may start a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // Increase the flow level. + if !yaml_parser_increase_flow_level(parser) { + return false + } + + // A simple key may follow the indicators '[' and '{'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. +func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset any potential simple key on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Decrease the flow level. + if !yaml_parser_decrease_flow_level(parser) { + return false + } + + // No simple keys after the indicators ']' and '}'. + parser.simple_key_allowed = false + + // Consume the token. + + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-ENTRY token. +func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after ','. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_FLOW_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the BLOCK-ENTRY token. +func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { + // Check if the scanner is in the block context. + if parser.flow_level == 0 { + // Check if we are allowed to start a new entry. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "block sequence entries are not allowed in this context") + } + // Add the BLOCK-SEQUENCE-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { + return false + } + } else { + // It is an error for the '-' indicator to occur in the flow context, + // but we let the Parser detect and report about it because the Parser + // is able to point to the context. + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '-'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the BLOCK-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the KEY token. +func yaml_parser_fetch_key(parser *yaml_parser_t) bool { + + // In the block context, additional checks are required. + if parser.flow_level == 0 { + // Check if we are allowed to start a new key (not nessesary simple). + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping keys are not allowed in this context") + } + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '?' in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the KEY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the VALUE token. +func yaml_parser_fetch_value(parser *yaml_parser_t) bool { + + simple_key := &parser.simple_keys[len(parser.simple_keys)-1] + + // Have we found a simple key? + if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok { + return false + + } else if valid { + + // Create the KEY token and insert it into the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: simple_key.mark, + end_mark: simple_key.mark, + } + yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) + + // In the block context, we may need to add the BLOCK-MAPPING-START token. + if !yaml_parser_roll_indent(parser, simple_key.mark.column, + simple_key.token_number, + yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { + return false + } + + // Remove the simple key. + simple_key.possible = false + delete(parser.simple_keys_by_tok, simple_key.token_number) + + // A simple key cannot follow another simple key. + parser.simple_key_allowed = false + + } else { + // The ':' indicator follows a complex key. + + // In the block context, extra checks are required. + if parser.flow_level == 0 { + + // Check if we are allowed to start a complex value. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping values are not allowed in this context") + } + + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Simple keys after ':' are allowed in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + } + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the VALUE token and append it to the queue. + token := yaml_token_t{ + typ: yaml_VALUE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the ALIAS or ANCHOR token. +func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // An anchor or an alias could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow an anchor or an alias. + parser.simple_key_allowed = false + + // Create the ALIAS or ANCHOR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_anchor(parser, &token, typ) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the TAG token. +func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { + // A tag could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a tag. + parser.simple_key_allowed = false + + // Create the TAG token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_tag(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. +func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { + // Remove any potential simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // A simple key may follow a block scalar. + parser.simple_key_allowed = true + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_block_scalar(parser, &token, literal) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. +func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_flow_scalar(parser, &token, single) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,plain) token. +func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_plain_scalar(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Eat whitespaces and comments until the next token is found. +func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { + + scan_mark := parser.mark + + // Until the next token is not found. + for { + // Allow the BOM mark to start a line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { + skip(parser) + } + + // Eat whitespaces. + // Tabs are allowed: + // - in the flow context + // - in the block context, but not at the beginning of the line or + // after '-', '?', or ':' (complex value). + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if we just had a line comment under a sequence entry that + // looks more like a header to the following content. Similar to this: + // + // - # The comment + // - Some data + // + // If so, transform the line comment to a head comment and reposition. + if len(parser.comments) > 0 && len(parser.tokens) > 1 { + tokenA := parser.tokens[len(parser.tokens)-2] + tokenB := parser.tokens[len(parser.tokens)-1] + comment := &parser.comments[len(parser.comments)-1] + if tokenA.typ == yaml_BLOCK_SEQUENCE_START_TOKEN && tokenB.typ == yaml_BLOCK_ENTRY_TOKEN && len(comment.line) > 0 && !is_break(parser.buffer, parser.buffer_pos) { + // If it was in the prior line, reposition so it becomes a + // header of the follow up token. Otherwise, keep it in place + // so it becomes a header of the former. + comment.head = comment.line + comment.line = nil + if comment.start_mark.line == parser.mark.line-1 { + comment.token_mark = parser.mark + } + } + } + + // Eat a comment until a line break. + if parser.buffer[parser.buffer_pos] == '#' { + if !yaml_parser_scan_comments(parser, scan_mark) { + return false + } + } + + // If it is a line break, eat it. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + + // In the block context, a new line may start a simple key. + if parser.flow_level == 0 { + parser.simple_key_allowed = true + } + } else { + break // We have found a token. + } + } + + return true +} + +// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { + // Eat '%'. + start_mark := parser.mark + skip(parser) + + // Scan the directive name. + var name []byte + if !yaml_parser_scan_directive_name(parser, start_mark, &name) { + return false + } + + // Is it a YAML directive? + if bytes.Equal(name, []byte("YAML")) { + // Scan the VERSION directive value. + var major, minor int8 + if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { + return false + } + end_mark := parser.mark + + // Create a VERSION-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_VERSION_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + major: major, + minor: minor, + } + + // Is it a TAG directive? + } else if bytes.Equal(name, []byte("TAG")) { + // Scan the TAG directive value. + var handle, prefix []byte + if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { + return false + } + end_mark := parser.mark + + // Create a TAG-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_TAG_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + prefix: prefix, + } + + // Unknown directive. + } else { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unknown directive name") + return false + } + + // Eat the rest of the line including any comments. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + if parser.buffer[parser.buffer_pos] == '#' { + // [Go] Discard this inline comment for the time being. + //if !yaml_parser_scan_line_comment(parser, start_mark) { + // return false + //} + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + return true +} + +// Scan the directive name. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^ +// +func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { + // Consume the directive name. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + var s []byte + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the name is empty. + if len(s) == 0 { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "could not find expected directive name") + return false + } + + // Check for an blank character after the name. + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unexpected non-alphabetical character") + return false + } + *name = s + return true +} + +// Scan the value of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^ +func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the major version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { + return false + } + + // Eat '.'. + if parser.buffer[parser.buffer_pos] != '.' { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected digit or '.' character") + } + + skip(parser) + + // Consume the minor version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { + return false + } + return true +} + +const max_number_length = 2 + +// Scan the version number of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^ +// %YAML 1.1 # a comment \n +// ^ +func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { + + // Repeat while the next character is digit. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var value, length int8 + for is_digit(parser.buffer, parser.buffer_pos) { + // Check if the number is too long. + length++ + if length > max_number_length { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "found extremely long version number") + } + value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the number was present. + if length == 0 { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected version number") + } + *number = value + return true +} + +// Scan the value of a TAG-DIRECTIVE token. +// +// Scope: +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { + var handle_value, prefix_value []byte + + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a handle. + if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { + return false + } + + // Expect a whitespace. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blank(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace") + return false + } + + // Eat whitespaces. + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a prefix. + if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { + return false + } + + // Expect a whitespace or line break. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace or line break") + return false + } + + *handle = handle_value + *prefix = prefix_value + return true +} + +func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { + var s []byte + + // Eat the indicator character. + start_mark := parser.mark + skip(parser) + + // Consume the value. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + end_mark := parser.mark + + /* + * Check if length of the anchor is greater than 0 and it is followed by + * a whitespace character or one of the indicators: + * + * '?', ':', ',', ']', '}', '%', '@', '`'. + */ + + if len(s) == 0 || + !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || + parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '`') { + context := "while scanning an alias" + if typ == yaml_ANCHOR_TOKEN { + context = "while scanning an anchor" + } + yaml_parser_set_scanner_error(parser, context, start_mark, + "did not find expected alphabetic or numeric character") + return false + } + + // Create a token. + *token = yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + value: s, + } + + return true +} + +/* + * Scan a TAG token. + */ + +func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { + var handle, suffix []byte + + start_mark := parser.mark + + // Check if the tag is in the canonical form. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + if parser.buffer[parser.buffer_pos+1] == '<' { + // Keep the handle as '' + + // Eat '!<' + skip(parser) + skip(parser) + + // Consume the tag value. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + + // Check for '>' and eat it. + if parser.buffer[parser.buffer_pos] != '>' { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find the expected '>'") + return false + } + + skip(parser) + } else { + // The tag has either the '!suffix' or the '!handle!suffix' form. + + // First, try to scan a handle. + if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { + return false + } + + // Check if it is, indeed, handle. + if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { + // Scan the suffix now. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + } else { + // It wasn't a handle after all. Scan the rest of the tag. + if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { + return false + } + + // Set the handle to '!'. + handle = []byte{'!'} + + // A special case: the '!' tag. Set the handle to '' and the + // suffix to '!'. + if len(suffix) == 0 { + handle, suffix = suffix, handle + } + } + } + + // Check the character which ends the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find expected whitespace or line break") + return false + } + + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_TAG_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + suffix: suffix, + } + return true +} + +// Scan a tag handle. +func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { + // Check the initial '!' character. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] != '!' { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + + var s []byte + + // Copy the '!' character. + s = read(parser, s) + + // Copy all subsequent alphabetical and numerical characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the trailing character is '!' and copy it. + if parser.buffer[parser.buffer_pos] == '!' { + s = read(parser, s) + } else { + // It's either the '!' tag or not really a tag handle. If it's a %TAG + // directive, it's an error. If it's a tag token, it must be a part of URI. + if directive && string(s) != "!" { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + } + + *handle = s + return true +} + +// Scan a tag. +func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { + //size_t length = head ? strlen((char *)head) : 0 + var s []byte + hasTag := len(head) > 0 + + // Copy the head if needed. + // + // Note that we don't copy the leading '!' character. + if len(head) > 1 { + s = append(s, head[1:]...) + } + + // Scan the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // The set of characters that may appear in URI is as follows: + // + // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', + // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', + // '%'. + // [Go] TODO Convert this into more reasonable logic. + for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || + parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || + parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || + parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || + parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || + parser.buffer[parser.buffer_pos] == '%' { + // Check if it is a URI-escape sequence. + if parser.buffer[parser.buffer_pos] == '%' { + if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { + return false + } + } else { + s = read(parser, s) + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + hasTag = true + } + + if !hasTag { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected tag URI") + return false + } + *uri = s + return true +} + +// Decode an URI-escape sequence corresponding to a single UTF-8 character. +func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { + + // Decode the required number of characters. + w := 1024 + for w > 0 { + // Check for a URI-escaped octet. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + + if !(parser.buffer[parser.buffer_pos] == '%' && + is_hex(parser.buffer, parser.buffer_pos+1) && + is_hex(parser.buffer, parser.buffer_pos+2)) { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find URI escaped octet") + } + + // Get the octet. + octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) + + // If it is the leading octet, determine the length of the UTF-8 sequence. + if w == 1024 { + w = width(octet) + if w == 0 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect leading UTF-8 octet") + } + } else { + // Check if the trailing octet is correct. + if octet&0xC0 != 0x80 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect trailing UTF-8 octet") + } + } + + // Copy the octet and move the pointers. + *s = append(*s, octet) + skip(parser) + skip(parser) + skip(parser) + w-- + } + return true +} + +// Scan a block scalar. +func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { + // Eat the indicator '|' or '>'. + start_mark := parser.mark + skip(parser) + + // Scan the additional block scalar indicators. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check for a chomping indicator. + var chomping, increment int + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + // Set the chomping method and eat the indicator. + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + + // Check for an indentation indicator. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_digit(parser.buffer, parser.buffer_pos) { + // Check that the indentation is greater than 0. + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an indentation indicator equal to 0") + return false + } + + // Get the indentation level and eat the indicator. + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + } + + } else if is_digit(parser.buffer, parser.buffer_pos) { + // Do the same as above, but in the opposite order. + + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an indentation indicator equal to 0") + return false + } + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + } + } + + // Eat whitespaces and comments to the end of the line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.buffer[parser.buffer_pos] == '#' { + // TODO Test this and then re-enable it. + //if !yaml_parser_scan_line_comment(parser, start_mark) { + // return false + //} + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + end_mark := parser.mark + + // Set the indentation level if it was specified. + var indent int + if increment > 0 { + if parser.indent >= 0 { + indent = parser.indent + increment + } else { + indent = increment + } + } + + // Scan the leading line breaks and determine the indentation level if needed. + var s, leading_break, trailing_breaks []byte + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + + // Scan the block scalar content. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var leading_blank, trailing_blank bool + for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { + // We are at the beginning of a non-empty line. + + // Is it a trailing whitespace? + trailing_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Check if we need to fold the leading line break. + if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { + // Do we need to join the lines by space? + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } + } else { + s = append(s, leading_break...) + } + leading_break = leading_break[:0] + + // Append the remaining line breaks. + s = append(s, trailing_breaks...) + trailing_breaks = trailing_breaks[:0] + + // Is it a leading whitespace? + leading_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Consume the current line. + for !is_breakz(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + leading_break = read_line(parser, leading_break) + + // Eat the following indentation spaces and line breaks. + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + } + + // Chomp the tail. + if chomping != -1 { + s = append(s, leading_break...) + } + if chomping == 1 { + s = append(s, trailing_breaks...) + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_LITERAL_SCALAR_STYLE, + } + if !literal { + token.style = yaml_FOLDED_SCALAR_STYLE + } + return true +} + +// Scan indentation spaces and line breaks for a block scalar. Determine the +// indentation level if needed. +func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { + *end_mark = parser.mark + + // Eat the indentation spaces and line breaks. + max_indent := 0 + for { + // Eat the indentation spaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.mark.column > max_indent { + max_indent = parser.mark.column + } + + // Check for a tab character messing the indentation. + if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { + return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found a tab character where an indentation space is expected") + } + + // Have we found a non-empty line? + if !is_break(parser.buffer, parser.buffer_pos) { + break + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + // [Go] Should really be returning breaks instead. + *breaks = read_line(parser, *breaks) + *end_mark = parser.mark + } + + // Determine the indentation level if needed. + if *indent == 0 { + *indent = max_indent + if *indent < parser.indent+1 { + *indent = parser.indent + 1 + } + if *indent < 1 { + *indent = 1 + } + } + return true +} + +// Scan a quoted scalar. +func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { + // Eat the left quote. + start_mark := parser.mark + skip(parser) + + // Consume the content of the quoted scalar. + var s, leading_break, trailing_breaks, whitespaces []byte + for { + // Check that there are no document indicators at the beginning of the line. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected document indicator") + return false + } + + // Check for EOF. + if is_z(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected end of stream") + return false + } + + // Consume non-blank characters. + leading_blanks := false + for !is_blankz(parser.buffer, parser.buffer_pos) { + if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { + // Is is an escaped single quote. + s = append(s, '\'') + skip(parser) + skip(parser) + + } else if single && parser.buffer[parser.buffer_pos] == '\'' { + // It is a right single quote. + break + } else if !single && parser.buffer[parser.buffer_pos] == '"' { + // It is a right double quote. + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { + // It is an escaped line break. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + skip(parser) + skip_line(parser) + leading_blanks = true + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' { + // It is an escape sequence. + code_length := 0 + + // Check the escape character. + switch parser.buffer[parser.buffer_pos+1] { + case '0': + s = append(s, 0) + case 'a': + s = append(s, '\x07') + case 'b': + s = append(s, '\x08') + case 't', '\t': + s = append(s, '\x09') + case 'n': + s = append(s, '\x0A') + case 'v': + s = append(s, '\x0B') + case 'f': + s = append(s, '\x0C') + case 'r': + s = append(s, '\x0D') + case 'e': + s = append(s, '\x1B') + case ' ': + s = append(s, '\x20') + case '"': + s = append(s, '"') + case '\'': + s = append(s, '\'') + case '\\': + s = append(s, '\\') + case 'N': // NEL (#x85) + s = append(s, '\xC2') + s = append(s, '\x85') + case '_': // #xA0 + s = append(s, '\xC2') + s = append(s, '\xA0') + case 'L': // LS (#x2028) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA8') + case 'P': // PS (#x2029) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA9') + case 'x': + code_length = 2 + case 'u': + code_length = 4 + case 'U': + code_length = 8 + default: + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found unknown escape character") + return false + } + + skip(parser) + skip(parser) + + // Consume an arbitrary escape code. + if code_length > 0 { + var value int + + // Scan the character value. + if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { + return false + } + for k := 0; k < code_length; k++ { + if !is_hex(parser.buffer, parser.buffer_pos+k) { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "did not find expected hexdecimal number") + return false + } + value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) + } + + // Check the value and write the character. + if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found invalid Unicode character escape code") + return false + } + if value <= 0x7F { + s = append(s, byte(value)) + } else if value <= 0x7FF { + s = append(s, byte(0xC0+(value>>6))) + s = append(s, byte(0x80+(value&0x3F))) + } else if value <= 0xFFFF { + s = append(s, byte(0xE0+(value>>12))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } else { + s = append(s, byte(0xF0+(value>>18))) + s = append(s, byte(0x80+((value>>12)&0x3F))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } + + // Advance the pointer. + for k := 0; k < code_length; k++ { + skip(parser) + } + } + } else { + // It is a non-escaped non-blank character. + s = read(parser, s) + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we are at the end of the scalar. + if single { + if parser.buffer[parser.buffer_pos] == '\'' { + break + } + } else { + if parser.buffer[parser.buffer_pos] == '"' { + break + } + } + + // Consume blank characters. + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Join the whitespaces or fold line breaks. + if leading_blanks { + // Do we need to fold line breaks? + if len(leading_break) > 0 && leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Eat the right quote. + skip(parser) + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_SINGLE_QUOTED_SCALAR_STYLE, + } + if !single { + token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + return true +} + +// Scan a plain scalar. +func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { + + var s, leading_break, trailing_breaks, whitespaces []byte + var leading_blanks bool + var indent = parser.indent + 1 + + start_mark := parser.mark + end_mark := parser.mark + + // Consume the content of the plain scalar. + for { + // Check for a document indicator. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + break + } + + // Check for a comment. + if parser.buffer[parser.buffer_pos] == '#' { + break + } + + // Consume non-blank characters. + for !is_blankz(parser.buffer, parser.buffer_pos) { + + // Check for indicators that may end a plain scalar. + if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level > 0 && + (parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}')) { + break + } + + // Check if we need to join whitespaces and breaks. + if leading_blanks || len(whitespaces) > 0 { + if leading_blanks { + // Do we need to fold line breaks? + if leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + leading_blanks = false + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Copy the character. + s = read(parser, s) + + end_mark = parser.mark + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + // Is it the end? + if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { + break + } + + // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + + // Check for tab characters that abuse indentation. + if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", + start_mark, "found a tab character that violates indentation") + return false + } + + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check indentation level. + if parser.flow_level == 0 && parser.mark.column < indent { + break + } + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_PLAIN_SCALAR_STYLE, + } + + // Note that we change the 'simple_key_allowed' flag. + if leading_blanks { + parser.simple_key_allowed = true + } + return true +} + +func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t) bool { + if parser.newlines > 0 { + return true + } + + var start_mark yaml_mark_t + var text []byte + + for peek := 0; peek < 512; peek++ { + if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { + break + } + if is_blank(parser.buffer, parser.buffer_pos+peek) { + continue + } + if parser.buffer[parser.buffer_pos+peek] == '#' { + seen := parser.mark.index+peek + for { + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_breakz(parser.buffer, parser.buffer_pos) { + if parser.mark.index >= seen { + break + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } else if parser.mark.index >= seen { + if len(text) == 0 { + start_mark = parser.mark + } + text = read(parser, text) + } else { + skip(parser) + } + } + } + break + } + if len(text) > 0 { + parser.comments = append(parser.comments, yaml_comment_t{ + token_mark: token_mark, + start_mark: start_mark, + line: text, + }) + } + return true +} + +func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) bool { + token := parser.tokens[len(parser.tokens)-1] + + if token.typ == yaml_FLOW_ENTRY_TOKEN && len(parser.tokens) > 1 { + token = parser.tokens[len(parser.tokens)-2] + } + + var token_mark = token.start_mark + var start_mark yaml_mark_t + + var recent_empty = false + var first_empty = parser.newlines <= 1 + + var line = parser.mark.line + var column = parser.mark.column + + var text []byte + + // The foot line is the place where a comment must start to + // still be considered as a foot of the prior content. + // If there's some content in the currently parsed line, then + // the foot is the line below it. + var foot_line = -1 + if scan_mark.line > 0 { + foot_line = parser.mark.line-parser.newlines+1 + if parser.newlines == 0 && parser.mark.column > 1 { + foot_line++ + } + } + + var peek = 0 + for ; peek < 512; peek++ { + if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { + break + } + column++ + if is_blank(parser.buffer, parser.buffer_pos+peek) { + continue + } + c := parser.buffer[parser.buffer_pos+peek] + if is_breakz(parser.buffer, parser.buffer_pos+peek) || parser.flow_level > 0 && (c == ']' || c == '}') { + // Got line break or terminator. + if !recent_empty { + if first_empty && (start_mark.line == foot_line || start_mark.column-1 < parser.indent) { + // This is the first empty line and there were no empty lines before, + // so this initial part of the comment is a foot of the prior token + // instead of being a head for the following one. Split it up. + if len(text) > 0 { + if start_mark.column-1 < parser.indent { + // If dedented it's unrelated to the prior token. + token_mark = start_mark + } + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: token_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, + foot: text, + }) + scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} + token_mark = scan_mark + text = nil + } + } else { + if len(text) > 0 && parser.buffer[parser.buffer_pos+peek] != 0 { + text = append(text, '\n') + } + } + } + if !is_break(parser.buffer, parser.buffer_pos+peek) { + break + } + first_empty = false + recent_empty = true + column = 0 + line++ + continue + } + + if len(text) > 0 && column < parser.indent+1 && column != start_mark.column { + // The comment at the different indentation is a foot of the + // preceding data rather than a head of the upcoming one. + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: token_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, + foot: text, + }) + scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} + token_mark = scan_mark + text = nil + } + + if parser.buffer[parser.buffer_pos+peek] != '#' { + break + } + + if len(text) == 0 { + start_mark = yaml_mark_t{parser.mark.index + peek, line, column} + } else { + text = append(text, '\n') + } + + recent_empty = false + + // Consume until after the consumed comment line. + seen := parser.mark.index+peek + for { + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_breakz(parser.buffer, parser.buffer_pos) { + if parser.mark.index >= seen { + break + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } else if parser.mark.index >= seen { + text = read(parser, text) + } else { + skip(parser) + } + } + + peek = 0 + column = 0 + line = parser.mark.line + } + + if len(text) > 0 { + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: start_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek - 1, line, column}, + head: text, + }) + } + return true +} diff --git a/vendor/gopkg.in/yaml.v3/sorter.go b/vendor/gopkg.in/yaml.v3/sorter.go new file mode 100644 index 0000000000..9210ece7e9 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/sorter.go @@ -0,0 +1,134 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "reflect" + "unicode" +) + +type keyList []reflect.Value + +func (l keyList) Len() int { return len(l) } +func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l keyList) Less(i, j int) bool { + a := l[i] + b := l[j] + ak := a.Kind() + bk := b.Kind() + for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { + a = a.Elem() + ak = a.Kind() + } + for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { + b = b.Elem() + bk = b.Kind() + } + af, aok := keyFloat(a) + bf, bok := keyFloat(b) + if aok && bok { + if af != bf { + return af < bf + } + if ak != bk { + return ak < bk + } + return numLess(a, b) + } + if ak != reflect.String || bk != reflect.String { + return ak < bk + } + ar, br := []rune(a.String()), []rune(b.String()) + digits := false + for i := 0; i < len(ar) && i < len(br); i++ { + if ar[i] == br[i] { + digits = unicode.IsDigit(ar[i]) + continue + } + al := unicode.IsLetter(ar[i]) + bl := unicode.IsLetter(br[i]) + if al && bl { + return ar[i] < br[i] + } + if al || bl { + if digits { + return al + } else { + return bl + } + } + var ai, bi int + var an, bn int64 + if ar[i] == '0' || br[i] == '0' { + for j := i - 1; j >= 0 && unicode.IsDigit(ar[j]); j-- { + if ar[j] != '0' { + an = 1 + bn = 1 + break + } + } + } + for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { + an = an*10 + int64(ar[ai]-'0') + } + for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { + bn = bn*10 + int64(br[bi]-'0') + } + if an != bn { + return an < bn + } + if ai != bi { + return ai < bi + } + return ar[i] < br[i] + } + return len(ar) < len(br) +} + +// keyFloat returns a float value for v if it is a number/bool +// and whether it is a number/bool or not. +func keyFloat(v reflect.Value) (f float64, ok bool) { + switch v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return float64(v.Int()), true + case reflect.Float32, reflect.Float64: + return v.Float(), true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return float64(v.Uint()), true + case reflect.Bool: + if v.Bool() { + return 1, true + } + return 0, true + } + return 0, false +} + +// numLess returns whether a < b. +// a and b must necessarily have the same kind. +func numLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return a.Int() < b.Int() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Bool: + return !a.Bool() && b.Bool() + } + panic("not a number") +} diff --git a/vendor/gopkg.in/yaml.v3/writerc.go b/vendor/gopkg.in/yaml.v3/writerc.go new file mode 100644 index 0000000000..b8a116bf9a --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/writerc.go @@ -0,0 +1,48 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +// Set the writer error and return false. +func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_WRITER_ERROR + emitter.problem = problem + return false +} + +// Flush the output buffer. +func yaml_emitter_flush(emitter *yaml_emitter_t) bool { + if emitter.write_handler == nil { + panic("write handler not set") + } + + // Check if the buffer is empty. + if emitter.buffer_pos == 0 { + return true + } + + if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + return true +} diff --git a/vendor/gopkg.in/yaml.v3/yaml.go b/vendor/gopkg.in/yaml.v3/yaml.go new file mode 100644 index 0000000000..56e8a84903 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/yaml.go @@ -0,0 +1,693 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package yaml implements YAML support for the Go language. +// +// Source code and other details for the project are available at GitHub: +// +// https://github.com/go-yaml/yaml +// +package yaml + +import ( + "errors" + "fmt" + "io" + "reflect" + "strings" + "sync" + "unicode/utf8" +) + +// The Unmarshaler interface may be implemented by types to customize their +// behavior when being unmarshaled from a YAML document. +type Unmarshaler interface { + UnmarshalYAML(value *Node) error +} + +type obsoleteUnmarshaler interface { + UnmarshalYAML(unmarshal func(interface{}) error) error +} + +// The Marshaler interface may be implemented by types to customize their +// behavior when being marshaled into a YAML document. The returned value +// is marshaled in place of the original value implementing Marshaler. +// +// If an error is returned by MarshalYAML, the marshaling procedure stops +// and returns with the provided error. +type Marshaler interface { + MarshalYAML() (interface{}, error) +} + +// Unmarshal decodes the first document found within the in byte slice +// and assigns decoded values into the out value. +// +// Maps and pointers (to a struct, string, int, etc) are accepted as out +// values. If an internal pointer within a struct is not initialized, +// the yaml package will initialize it if necessary for unmarshalling +// the provided data. The out parameter must not be nil. +// +// The type of the decoded values should be compatible with the respective +// values in out. If one or more values cannot be decoded due to a type +// mismatches, decoding continues partially until the end of the YAML +// content, and a *yaml.TypeError is returned with details for all +// missed values. +// +// Struct fields are only unmarshalled if they are exported (have an +// upper case first letter), and are unmarshalled using the field name +// lowercased as the default key. Custom keys may be defined via the +// "yaml" name in the field tag: the content preceding the first comma +// is used as the key, and the following comma-separated options are +// used to tweak the marshalling process (see Marshal). +// Conflicting names result in a runtime error. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// var t T +// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) +// +// See the documentation of Marshal for the format of tags and a list of +// supported tag options. +// +func Unmarshal(in []byte, out interface{}) (err error) { + return unmarshal(in, out, false) +} + +// A Decoder reads and decodes YAML values from an input stream. +type Decoder struct { + parser *parser + knownFields bool +} + +// NewDecoder returns a new decoder that reads from r. +// +// The decoder introduces its own buffering and may read +// data from r beyond the YAML values requested. +func NewDecoder(r io.Reader) *Decoder { + return &Decoder{ + parser: newParserFromReader(r), + } +} + +// KnownFields ensures that the keys in decoded mappings to +// exist as fields in the struct being decoded into. +func (dec *Decoder) KnownFields(enable bool) { + dec.knownFields = enable +} + +// Decode reads the next YAML-encoded value from its input +// and stores it in the value pointed to by v. +// +// See the documentation for Unmarshal for details about the +// conversion of YAML into a Go value. +func (dec *Decoder) Decode(v interface{}) (err error) { + d := newDecoder() + d.knownFields = dec.knownFields + defer handleErr(&err) + node := dec.parser.parse() + if node == nil { + return io.EOF + } + out := reflect.ValueOf(v) + if out.Kind() == reflect.Ptr && !out.IsNil() { + out = out.Elem() + } + d.unmarshal(node, out) + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +// Decode decodes the node and stores its data into the value pointed to by v. +// +// See the documentation for Unmarshal for details about the +// conversion of YAML into a Go value. +func (n *Node) Decode(v interface{}) (err error) { + d := newDecoder() + defer handleErr(&err) + out := reflect.ValueOf(v) + if out.Kind() == reflect.Ptr && !out.IsNil() { + out = out.Elem() + } + d.unmarshal(n, out) + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +func unmarshal(in []byte, out interface{}, strict bool) (err error) { + defer handleErr(&err) + d := newDecoder() + p := newParser(in) + defer p.destroy() + node := p.parse() + if node != nil { + v := reflect.ValueOf(out) + if v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + d.unmarshal(node, v) + } + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +// Marshal serializes the value provided into a YAML document. The structure +// of the generated document will reflect the structure of the value itself. +// Maps and pointers (to struct, string, int, etc) are accepted as the in value. +// +// Struct fields are only marshalled if they are exported (have an upper case +// first letter), and are marshalled using the field name lowercased as the +// default key. Custom keys may be defined via the "yaml" name in the field +// tag: the content preceding the first comma is used as the key, and the +// following comma-separated options are used to tweak the marshalling process. +// Conflicting names result in a runtime error. +// +// The field tag format accepted is: +// +// `(...) yaml:"[<key>][,<flag1>[,<flag2>]]" (...)` +// +// The following flags are currently supported: +// +// omitempty Only include the field if it's not set to the zero +// value for the type or to empty slices or maps. +// Zero valued structs will be omitted if all their public +// fields are zero, unless they implement an IsZero +// method (see the IsZeroer interface type), in which +// case the field will be excluded if IsZero returns true. +// +// flow Marshal using a flow style (useful for structs, +// sequences and maps). +// +// inline Inline the field, which must be a struct or a map, +// causing all of its fields or keys to be processed as if +// they were part of the outer struct. For maps, keys must +// not conflict with the yaml keys of other struct fields. +// +// In addition, if the key is "-", the field is ignored. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" +// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" +// +func Marshal(in interface{}) (out []byte, err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshalDoc("", reflect.ValueOf(in)) + e.finish() + out = e.out + return +} + +// An Encoder writes YAML values to an output stream. +type Encoder struct { + encoder *encoder +} + +// NewEncoder returns a new encoder that writes to w. +// The Encoder should be closed after use to flush all data +// to w. +func NewEncoder(w io.Writer) *Encoder { + return &Encoder{ + encoder: newEncoderWithWriter(w), + } +} + +// Encode writes the YAML encoding of v to the stream. +// If multiple items are encoded to the stream, the +// second and subsequent document will be preceded +// with a "---" document separator, but the first will not. +// +// See the documentation for Marshal for details about the conversion of Go +// values to YAML. +func (e *Encoder) Encode(v interface{}) (err error) { + defer handleErr(&err) + e.encoder.marshalDoc("", reflect.ValueOf(v)) + return nil +} + +// Encode encodes value v and stores its representation in n. +// +// See the documentation for Marshal for details about the +// conversion of Go values into YAML. +func (n *Node) Encode(v interface{}) (err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshalDoc("", reflect.ValueOf(v)) + e.finish() + p := newParser(e.out) + p.textless = true + defer p.destroy() + doc := p.parse() + *n = *doc.Content[0] + return nil +} + +// SetIndent changes the used indentation used when encoding. +func (e *Encoder) SetIndent(spaces int) { + if spaces < 0 { + panic("yaml: cannot indent to a negative number of spaces") + } + e.encoder.indent = spaces +} + +// Close closes the encoder by writing any remaining data. +// It does not write a stream terminating string "...". +func (e *Encoder) Close() (err error) { + defer handleErr(&err) + e.encoder.finish() + return nil +} + +func handleErr(err *error) { + if v := recover(); v != nil { + if e, ok := v.(yamlError); ok { + *err = e.err + } else { + panic(v) + } + } +} + +type yamlError struct { + err error +} + +func fail(err error) { + panic(yamlError{err}) +} + +func failf(format string, args ...interface{}) { + panic(yamlError{fmt.Errorf("yaml: "+format, args...)}) +} + +// A TypeError is returned by Unmarshal when one or more fields in +// the YAML document cannot be properly decoded into the requested +// types. When this error is returned, the value is still +// unmarshaled partially. +type TypeError struct { + Errors []string +} + +func (e *TypeError) Error() string { + return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n ")) +} + +type Kind uint32 + +const ( + DocumentNode Kind = 1 << iota + SequenceNode + MappingNode + ScalarNode + AliasNode +) + +type Style uint32 + +const ( + TaggedStyle Style = 1 << iota + DoubleQuotedStyle + SingleQuotedStyle + LiteralStyle + FoldedStyle + FlowStyle +) + +// Node represents an element in the YAML document hierarchy. While documents +// are typically encoded and decoded into higher level types, such as structs +// and maps, Node is an intermediate representation that allows detailed +// control over the content being decoded or encoded. +// +// It's worth noting that although Node offers access into details such as +// line numbers, colums, and comments, the content when re-encoded will not +// have its original textual representation preserved. An effort is made to +// render the data plesantly, and to preserve comments near the data they +// describe, though. +// +// Values that make use of the Node type interact with the yaml package in the +// same way any other type would do, by encoding and decoding yaml data +// directly or indirectly into them. +// +// For example: +// +// var person struct { +// Name string +// Address yaml.Node +// } +// err := yaml.Unmarshal(data, &person) +// +// Or by itself: +// +// var person Node +// err := yaml.Unmarshal(data, &person) +// +type Node struct { + // Kind defines whether the node is a document, a mapping, a sequence, + // a scalar value, or an alias to another node. The specific data type of + // scalar nodes may be obtained via the ShortTag and LongTag methods. + Kind Kind + + // Style allows customizing the apperance of the node in the tree. + Style Style + + // Tag holds the YAML tag defining the data type for the value. + // When decoding, this field will always be set to the resolved tag, + // even when it wasn't explicitly provided in the YAML content. + // When encoding, if this field is unset the value type will be + // implied from the node properties, and if it is set, it will only + // be serialized into the representation if TaggedStyle is used or + // the implicit tag diverges from the provided one. + Tag string + + // Value holds the unescaped and unquoted represenation of the value. + Value string + + // Anchor holds the anchor name for this node, which allows aliases to point to it. + Anchor string + + // Alias holds the node that this alias points to. Only valid when Kind is AliasNode. + Alias *Node + + // Content holds contained nodes for documents, mappings, and sequences. + Content []*Node + + // HeadComment holds any comments in the lines preceding the node and + // not separated by an empty line. + HeadComment string + + // LineComment holds any comments at the end of the line where the node is in. + LineComment string + + // FootComment holds any comments following the node and before empty lines. + FootComment string + + // Line and Column hold the node position in the decoded YAML text. + // These fields are not respected when encoding the node. + Line int + Column int +} + +// IsZero returns whether the node has all of its fields unset. +func (n *Node) IsZero() bool { + return n.Kind == 0 && n.Style == 0 && n.Tag == "" && n.Value == "" && n.Anchor == "" && n.Alias == nil && n.Content == nil && + n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && n.Line == 0 && n.Column == 0 +} + + +// LongTag returns the long form of the tag that indicates the data type for +// the node. If the Tag field isn't explicitly defined, one will be computed +// based on the node properties. +func (n *Node) LongTag() string { + return longTag(n.ShortTag()) +} + +// ShortTag returns the short form of the YAML tag that indicates data type for +// the node. If the Tag field isn't explicitly defined, one will be computed +// based on the node properties. +func (n *Node) ShortTag() string { + if n.indicatedString() { + return strTag + } + if n.Tag == "" || n.Tag == "!" { + switch n.Kind { + case MappingNode: + return mapTag + case SequenceNode: + return seqTag + case AliasNode: + if n.Alias != nil { + return n.Alias.ShortTag() + } + case ScalarNode: + tag, _ := resolve("", n.Value) + return tag + } + return "" + } + return shortTag(n.Tag) +} + +func (n *Node) indicatedString() bool { + return n.Kind == ScalarNode && + (shortTag(n.Tag) == strTag || + (n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0) +} + +// SetString is a convenience function that sets the node to a string value +// and defines its style in a pleasant way depending on its content. +func (n *Node) SetString(s string) { + n.Kind = ScalarNode + if utf8.ValidString(s) { + n.Value = s + n.Tag = strTag + } else { + n.Value = encodeBase64(s) + n.Tag = binaryTag + } + if strings.Contains(n.Value, "\n") { + n.Style = LiteralStyle + } +} + +// -------------------------------------------------------------------------- +// Maintain a mapping of keys to structure field indexes + +// The code in this section was copied from mgo/bson. + +// structInfo holds details for the serialization of fields of +// a given struct. +type structInfo struct { + FieldsMap map[string]fieldInfo + FieldsList []fieldInfo + + // InlineMap is the number of the field in the struct that + // contains an ,inline map, or -1 if there's none. + InlineMap int + + // InlineUnmarshalers holds indexes to inlined fields that + // contain unmarshaler values. + InlineUnmarshalers [][]int +} + +type fieldInfo struct { + Key string + Num int + OmitEmpty bool + Flow bool + // Id holds the unique field identifier, so we can cheaply + // check for field duplicates without maintaining an extra map. + Id int + + // Inline holds the field index if the field is part of an inlined struct. + Inline []int +} + +var structMap = make(map[reflect.Type]*structInfo) +var fieldMapMutex sync.RWMutex +var unmarshalerType reflect.Type + +func init() { + var v Unmarshaler + unmarshalerType = reflect.ValueOf(&v).Elem().Type() +} + +func getStructInfo(st reflect.Type) (*structInfo, error) { + fieldMapMutex.RLock() + sinfo, found := structMap[st] + fieldMapMutex.RUnlock() + if found { + return sinfo, nil + } + + n := st.NumField() + fieldsMap := make(map[string]fieldInfo) + fieldsList := make([]fieldInfo, 0, n) + inlineMap := -1 + inlineUnmarshalers := [][]int(nil) + for i := 0; i != n; i++ { + field := st.Field(i) + if field.PkgPath != "" && !field.Anonymous { + continue // Private field + } + + info := fieldInfo{Num: i} + + tag := field.Tag.Get("yaml") + if tag == "" && strings.Index(string(field.Tag), ":") < 0 { + tag = string(field.Tag) + } + if tag == "-" { + continue + } + + inline := false + fields := strings.Split(tag, ",") + if len(fields) > 1 { + for _, flag := range fields[1:] { + switch flag { + case "omitempty": + info.OmitEmpty = true + case "flow": + info.Flow = true + case "inline": + inline = true + default: + return nil, errors.New(fmt.Sprintf("unsupported flag %q in tag %q of type %s", flag, tag, st)) + } + } + tag = fields[0] + } + + if inline { + switch field.Type.Kind() { + case reflect.Map: + if inlineMap >= 0 { + return nil, errors.New("multiple ,inline maps in struct " + st.String()) + } + if field.Type.Key() != reflect.TypeOf("") { + return nil, errors.New("option ,inline needs a map with string keys in struct " + st.String()) + } + inlineMap = info.Num + case reflect.Struct, reflect.Ptr: + ftype := field.Type + for ftype.Kind() == reflect.Ptr { + ftype = ftype.Elem() + } + if ftype.Kind() != reflect.Struct { + return nil, errors.New("option ,inline may only be used on a struct or map field") + } + if reflect.PtrTo(ftype).Implements(unmarshalerType) { + inlineUnmarshalers = append(inlineUnmarshalers, []int{i}) + } else { + sinfo, err := getStructInfo(ftype) + if err != nil { + return nil, err + } + for _, index := range sinfo.InlineUnmarshalers { + inlineUnmarshalers = append(inlineUnmarshalers, append([]int{i}, index...)) + } + for _, finfo := range sinfo.FieldsList { + if _, found := fieldsMap[finfo.Key]; found { + msg := "duplicated key '" + finfo.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + if finfo.Inline == nil { + finfo.Inline = []int{i, finfo.Num} + } else { + finfo.Inline = append([]int{i}, finfo.Inline...) + } + finfo.Id = len(fieldsList) + fieldsMap[finfo.Key] = finfo + fieldsList = append(fieldsList, finfo) + } + } + default: + return nil, errors.New("option ,inline may only be used on a struct or map field") + } + continue + } + + if tag != "" { + info.Key = tag + } else { + info.Key = strings.ToLower(field.Name) + } + + if _, found = fieldsMap[info.Key]; found { + msg := "duplicated key '" + info.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + + info.Id = len(fieldsList) + fieldsList = append(fieldsList, info) + fieldsMap[info.Key] = info + } + + sinfo = &structInfo{ + FieldsMap: fieldsMap, + FieldsList: fieldsList, + InlineMap: inlineMap, + InlineUnmarshalers: inlineUnmarshalers, + } + + fieldMapMutex.Lock() + structMap[st] = sinfo + fieldMapMutex.Unlock() + return sinfo, nil +} + +// IsZeroer is used to check whether an object is zero to +// determine whether it should be omitted when marshaling +// with the omitempty flag. One notable implementation +// is time.Time. +type IsZeroer interface { + IsZero() bool +} + +func isZero(v reflect.Value) bool { + kind := v.Kind() + if z, ok := v.Interface().(IsZeroer); ok { + if (kind == reflect.Ptr || kind == reflect.Interface) && v.IsNil() { + return true + } + return z.IsZero() + } + switch kind { + case reflect.String: + return len(v.String()) == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + case reflect.Slice: + return v.Len() == 0 + case reflect.Map: + return v.Len() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Struct: + vt := v.Type() + for i := v.NumField() - 1; i >= 0; i-- { + if vt.Field(i).PkgPath != "" { + continue // Private field + } + if !isZero(v.Field(i)) { + return false + } + } + return true + } + return false +} diff --git a/vendor/gopkg.in/yaml.v3/yamlh.go b/vendor/gopkg.in/yaml.v3/yamlh.go new file mode 100644 index 0000000000..7c6d007706 --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/yamlh.go @@ -0,0 +1,807 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +import ( + "fmt" + "io" +) + +// The version directive data. +type yaml_version_directive_t struct { + major int8 // The major version number. + minor int8 // The minor version number. +} + +// The tag directive data. +type yaml_tag_directive_t struct { + handle []byte // The tag handle. + prefix []byte // The tag prefix. +} + +type yaml_encoding_t int + +// The stream encoding. +const ( + // Let the parser choose the encoding. + yaml_ANY_ENCODING yaml_encoding_t = iota + + yaml_UTF8_ENCODING // The default UTF-8 encoding. + yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. + yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. +) + +type yaml_break_t int + +// Line break types. +const ( + // Let the parser choose the break type. + yaml_ANY_BREAK yaml_break_t = iota + + yaml_CR_BREAK // Use CR for line breaks (Mac style). + yaml_LN_BREAK // Use LN for line breaks (Unix style). + yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). +) + +type yaml_error_type_t int + +// Many bad things could happen with the parser and emitter. +const ( + // No error is produced. + yaml_NO_ERROR yaml_error_type_t = iota + + yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. + yaml_READER_ERROR // Cannot read or decode the input stream. + yaml_SCANNER_ERROR // Cannot scan the input stream. + yaml_PARSER_ERROR // Cannot parse the input stream. + yaml_COMPOSER_ERROR // Cannot compose a YAML document. + yaml_WRITER_ERROR // Cannot write to the output stream. + yaml_EMITTER_ERROR // Cannot emit a YAML stream. +) + +// The pointer position. +type yaml_mark_t struct { + index int // The position index. + line int // The position line. + column int // The position column. +} + +// Node Styles + +type yaml_style_t int8 + +type yaml_scalar_style_t yaml_style_t + +// Scalar styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = 0 + + yaml_PLAIN_SCALAR_STYLE yaml_scalar_style_t = 1 << iota // The plain scalar style. + yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. + yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. + yaml_LITERAL_SCALAR_STYLE // The literal scalar style. + yaml_FOLDED_SCALAR_STYLE // The folded scalar style. +) + +type yaml_sequence_style_t yaml_style_t + +// Sequence styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota + + yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. + yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. +) + +type yaml_mapping_style_t yaml_style_t + +// Mapping styles. +const ( + // Let the emitter choose the style. + yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota + + yaml_BLOCK_MAPPING_STYLE // The block mapping style. + yaml_FLOW_MAPPING_STYLE // The flow mapping style. +) + +// Tokens + +type yaml_token_type_t int + +// Token types. +const ( + // An empty token. + yaml_NO_TOKEN yaml_token_type_t = iota + + yaml_STREAM_START_TOKEN // A STREAM-START token. + yaml_STREAM_END_TOKEN // A STREAM-END token. + + yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. + yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. + yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. + yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. + + yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. + yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. + yaml_BLOCK_END_TOKEN // A BLOCK-END token. + + yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. + yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. + yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. + yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. + + yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. + yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. + yaml_KEY_TOKEN // A KEY token. + yaml_VALUE_TOKEN // A VALUE token. + + yaml_ALIAS_TOKEN // An ALIAS token. + yaml_ANCHOR_TOKEN // An ANCHOR token. + yaml_TAG_TOKEN // A TAG token. + yaml_SCALAR_TOKEN // A SCALAR token. +) + +func (tt yaml_token_type_t) String() string { + switch tt { + case yaml_NO_TOKEN: + return "yaml_NO_TOKEN" + case yaml_STREAM_START_TOKEN: + return "yaml_STREAM_START_TOKEN" + case yaml_STREAM_END_TOKEN: + return "yaml_STREAM_END_TOKEN" + case yaml_VERSION_DIRECTIVE_TOKEN: + return "yaml_VERSION_DIRECTIVE_TOKEN" + case yaml_TAG_DIRECTIVE_TOKEN: + return "yaml_TAG_DIRECTIVE_TOKEN" + case yaml_DOCUMENT_START_TOKEN: + return "yaml_DOCUMENT_START_TOKEN" + case yaml_DOCUMENT_END_TOKEN: + return "yaml_DOCUMENT_END_TOKEN" + case yaml_BLOCK_SEQUENCE_START_TOKEN: + return "yaml_BLOCK_SEQUENCE_START_TOKEN" + case yaml_BLOCK_MAPPING_START_TOKEN: + return "yaml_BLOCK_MAPPING_START_TOKEN" + case yaml_BLOCK_END_TOKEN: + return "yaml_BLOCK_END_TOKEN" + case yaml_FLOW_SEQUENCE_START_TOKEN: + return "yaml_FLOW_SEQUENCE_START_TOKEN" + case yaml_FLOW_SEQUENCE_END_TOKEN: + return "yaml_FLOW_SEQUENCE_END_TOKEN" + case yaml_FLOW_MAPPING_START_TOKEN: + return "yaml_FLOW_MAPPING_START_TOKEN" + case yaml_FLOW_MAPPING_END_TOKEN: + return "yaml_FLOW_MAPPING_END_TOKEN" + case yaml_BLOCK_ENTRY_TOKEN: + return "yaml_BLOCK_ENTRY_TOKEN" + case yaml_FLOW_ENTRY_TOKEN: + return "yaml_FLOW_ENTRY_TOKEN" + case yaml_KEY_TOKEN: + return "yaml_KEY_TOKEN" + case yaml_VALUE_TOKEN: + return "yaml_VALUE_TOKEN" + case yaml_ALIAS_TOKEN: + return "yaml_ALIAS_TOKEN" + case yaml_ANCHOR_TOKEN: + return "yaml_ANCHOR_TOKEN" + case yaml_TAG_TOKEN: + return "yaml_TAG_TOKEN" + case yaml_SCALAR_TOKEN: + return "yaml_SCALAR_TOKEN" + } + return "<unknown token>" +} + +// The token structure. +type yaml_token_t struct { + // The token type. + typ yaml_token_type_t + + // The start/end of the token. + start_mark, end_mark yaml_mark_t + + // The stream encoding (for yaml_STREAM_START_TOKEN). + encoding yaml_encoding_t + + // The alias/anchor/scalar value or tag/tag directive handle + // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). + value []byte + + // The tag suffix (for yaml_TAG_TOKEN). + suffix []byte + + // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). + prefix []byte + + // The scalar style (for yaml_SCALAR_TOKEN). + style yaml_scalar_style_t + + // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). + major, minor int8 +} + +// Events + +type yaml_event_type_t int8 + +// Event types. +const ( + // An empty event. + yaml_NO_EVENT yaml_event_type_t = iota + + yaml_STREAM_START_EVENT // A STREAM-START event. + yaml_STREAM_END_EVENT // A STREAM-END event. + yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. + yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. + yaml_ALIAS_EVENT // An ALIAS event. + yaml_SCALAR_EVENT // A SCALAR event. + yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. + yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. + yaml_MAPPING_START_EVENT // A MAPPING-START event. + yaml_MAPPING_END_EVENT // A MAPPING-END event. + yaml_TAIL_COMMENT_EVENT +) + +var eventStrings = []string{ + yaml_NO_EVENT: "none", + yaml_STREAM_START_EVENT: "stream start", + yaml_STREAM_END_EVENT: "stream end", + yaml_DOCUMENT_START_EVENT: "document start", + yaml_DOCUMENT_END_EVENT: "document end", + yaml_ALIAS_EVENT: "alias", + yaml_SCALAR_EVENT: "scalar", + yaml_SEQUENCE_START_EVENT: "sequence start", + yaml_SEQUENCE_END_EVENT: "sequence end", + yaml_MAPPING_START_EVENT: "mapping start", + yaml_MAPPING_END_EVENT: "mapping end", + yaml_TAIL_COMMENT_EVENT: "tail comment", +} + +func (e yaml_event_type_t) String() string { + if e < 0 || int(e) >= len(eventStrings) { + return fmt.Sprintf("unknown event %d", e) + } + return eventStrings[e] +} + +// The event structure. +type yaml_event_t struct { + + // The event type. + typ yaml_event_type_t + + // The start and end of the event. + start_mark, end_mark yaml_mark_t + + // The document encoding (for yaml_STREAM_START_EVENT). + encoding yaml_encoding_t + + // The version directive (for yaml_DOCUMENT_START_EVENT). + version_directive *yaml_version_directive_t + + // The list of tag directives (for yaml_DOCUMENT_START_EVENT). + tag_directives []yaml_tag_directive_t + + // The comments + head_comment []byte + line_comment []byte + foot_comment []byte + tail_comment []byte + + // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). + anchor []byte + + // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + tag []byte + + // The scalar value (for yaml_SCALAR_EVENT). + value []byte + + // Is the document start/end indicator implicit, or the tag optional? + // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). + implicit bool + + // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). + quoted_implicit bool + + // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + style yaml_style_t +} + +func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } +func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } +func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } + +// Nodes + +const ( + yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. + yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. + yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. + yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. + yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. + yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. + + yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. + yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. + + // Not in original libyaml. + yaml_BINARY_TAG = "tag:yaml.org,2002:binary" + yaml_MERGE_TAG = "tag:yaml.org,2002:merge" + + yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. + yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. + yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. +) + +type yaml_node_type_t int + +// Node types. +const ( + // An empty node. + yaml_NO_NODE yaml_node_type_t = iota + + yaml_SCALAR_NODE // A scalar node. + yaml_SEQUENCE_NODE // A sequence node. + yaml_MAPPING_NODE // A mapping node. +) + +// An element of a sequence node. +type yaml_node_item_t int + +// An element of a mapping node. +type yaml_node_pair_t struct { + key int // The key of the element. + value int // The value of the element. +} + +// The node structure. +type yaml_node_t struct { + typ yaml_node_type_t // The node type. + tag []byte // The node tag. + + // The node data. + + // The scalar parameters (for yaml_SCALAR_NODE). + scalar struct { + value []byte // The scalar value. + length int // The length of the scalar value. + style yaml_scalar_style_t // The scalar style. + } + + // The sequence parameters (for YAML_SEQUENCE_NODE). + sequence struct { + items_data []yaml_node_item_t // The stack of sequence items. + style yaml_sequence_style_t // The sequence style. + } + + // The mapping parameters (for yaml_MAPPING_NODE). + mapping struct { + pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). + pairs_start *yaml_node_pair_t // The beginning of the stack. + pairs_end *yaml_node_pair_t // The end of the stack. + pairs_top *yaml_node_pair_t // The top of the stack. + style yaml_mapping_style_t // The mapping style. + } + + start_mark yaml_mark_t // The beginning of the node. + end_mark yaml_mark_t // The end of the node. + +} + +// The document structure. +type yaml_document_t struct { + + // The document nodes. + nodes []yaml_node_t + + // The version directive. + version_directive *yaml_version_directive_t + + // The list of tag directives. + tag_directives_data []yaml_tag_directive_t + tag_directives_start int // The beginning of the tag directives list. + tag_directives_end int // The end of the tag directives list. + + start_implicit int // Is the document start indicator implicit? + end_implicit int // Is the document end indicator implicit? + + // The start/end of the document. + start_mark, end_mark yaml_mark_t +} + +// The prototype of a read handler. +// +// The read handler is called when the parser needs to read more bytes from the +// source. The handler should write not more than size bytes to the buffer. +// The number of written bytes should be set to the size_read variable. +// +// [in,out] data A pointer to an application data specified by +// yaml_parser_set_input(). +// [out] buffer The buffer to write the data from the source. +// [in] size The size of the buffer. +// [out] size_read The actual number of bytes read from the source. +// +// On success, the handler should return 1. If the handler failed, +// the returned value should be 0. On EOF, the handler should set the +// size_read to 0 and return 1. +type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) + +// This structure holds information about a potential simple key. +type yaml_simple_key_t struct { + possible bool // Is a simple key possible? + required bool // Is a simple key required? + token_number int // The number of the token. + mark yaml_mark_t // The position mark. +} + +// The states of the parser. +type yaml_parser_state_t int + +const ( + yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota + + yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. + yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. + yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. + yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. + yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. + yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. + yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. + yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. + yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. + yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. + yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. + yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. + yaml_PARSE_END_STATE // Expect nothing. +) + +func (ps yaml_parser_state_t) String() string { + switch ps { + case yaml_PARSE_STREAM_START_STATE: + return "yaml_PARSE_STREAM_START_STATE" + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_START_STATE: + return "yaml_PARSE_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return "yaml_PARSE_DOCUMENT_CONTENT_STATE" + case yaml_PARSE_DOCUMENT_END_STATE: + return "yaml_PARSE_DOCUMENT_END_STATE" + case yaml_PARSE_BLOCK_NODE_STATE: + return "yaml_PARSE_BLOCK_NODE_STATE" + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" + case yaml_PARSE_FLOW_NODE_STATE: + return "yaml_PARSE_FLOW_NODE_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" + case yaml_PARSE_END_STATE: + return "yaml_PARSE_END_STATE" + } + return "<unknown parser state>" +} + +// This structure holds aliases data. +type yaml_alias_data_t struct { + anchor []byte // The anchor. + index int // The node id. + mark yaml_mark_t // The anchor mark. +} + +// The parser structure. +// +// All members are internal. Manage the structure using the +// yaml_parser_ family of functions. +type yaml_parser_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + + problem string // Error description. + + // The byte about which the problem occurred. + problem_offset int + problem_value int + problem_mark yaml_mark_t + + // The error context. + context string + context_mark yaml_mark_t + + // Reader stuff + + read_handler yaml_read_handler_t // Read handler. + + input_reader io.Reader // File input data. + input []byte // String input data. + input_pos int + + eof bool // EOF flag + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + unread int // The number of unread characters in the buffer. + + newlines int // The number of line breaks since last non-break/non-blank character + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The input encoding. + + offset int // The offset of the current position (in bytes). + mark yaml_mark_t // The mark of the current position. + + // Comments + + head_comment []byte // The current head comments + line_comment []byte // The current line comments + foot_comment []byte // The current foot comments + tail_comment []byte // Foot comment that happens at the end of a block. + stem_comment []byte // Comment in item preceding a nested structure (list inside list item, etc) + + comments []yaml_comment_t // The folded comments for all parsed tokens + comments_head int + + // Scanner stuff + + stream_start_produced bool // Have we started to scan the input stream? + stream_end_produced bool // Have we reached the end of the input stream? + + flow_level int // The number of unclosed '[' and '{' indicators. + + tokens []yaml_token_t // The tokens queue. + tokens_head int // The head of the tokens queue. + tokens_parsed int // The number of tokens fetched from the queue. + token_available bool // Does the tokens queue contain a token ready for dequeueing. + + indent int // The current indentation level. + indents []int // The indentation levels stack. + + simple_key_allowed bool // May a simple key occur at the current position? + simple_keys []yaml_simple_key_t // The stack of simple keys. + simple_keys_by_tok map[int]int // possible simple_key indexes indexed by token_number + + // Parser stuff + + state yaml_parser_state_t // The current parser state. + states []yaml_parser_state_t // The parser states stack. + marks []yaml_mark_t // The stack of marks. + tag_directives []yaml_tag_directive_t // The list of TAG directives. + + // Dumper stuff + + aliases []yaml_alias_data_t // The alias data. + + document *yaml_document_t // The currently parsed document. +} + +type yaml_comment_t struct { + + scan_mark yaml_mark_t // Position where scanning for comments started + token_mark yaml_mark_t // Position after which tokens will be associated with this comment + start_mark yaml_mark_t // Position of '#' comment mark + end_mark yaml_mark_t // Position where comment terminated + + head []byte + line []byte + foot []byte +} + +// Emitter Definitions + +// The prototype of a write handler. +// +// The write handler is called when the emitter needs to flush the accumulated +// characters to the output. The handler should write @a size bytes of the +// @a buffer to the output. +// +// @param[in,out] data A pointer to an application data specified by +// yaml_emitter_set_output(). +// @param[in] buffer The buffer with bytes to be written. +// @param[in] size The size of the buffer. +// +// @returns On success, the handler should return @c 1. If the handler failed, +// the returned value should be @c 0. +// +type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error + +type yaml_emitter_state_t int + +// The emitter states. +const ( + // Expect STREAM-START. + yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota + + yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. + yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE // Expect the next item of a flow sequence, with the comma already written out + yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. + yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE // Expect the next key of a flow mapping, with the comma already written out + yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. + yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. + yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. + yaml_EMIT_END_STATE // Expect nothing. +) + +// The emitter structure. +// +// All members are internal. Manage the structure using the @c yaml_emitter_ +// family of functions. +type yaml_emitter_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + problem string // Error description. + + // Writer stuff + + write_handler yaml_write_handler_t // Write handler. + + output_buffer *[]byte // String output data. + output_writer io.Writer // File output data. + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The stream encoding. + + // Emitter stuff + + canonical bool // If the output is in the canonical style? + best_indent int // The number of indentation spaces. + best_width int // The preferred width of the output lines. + unicode bool // Allow unescaped non-ASCII characters? + line_break yaml_break_t // The preferred line break. + + state yaml_emitter_state_t // The current emitter state. + states []yaml_emitter_state_t // The stack of states. + + events []yaml_event_t // The event queue. + events_head int // The head of the event queue. + + indents []int // The stack of indentation levels. + + tag_directives []yaml_tag_directive_t // The list of tag directives. + + indent int // The current indentation level. + + flow_level int // The current flow level. + + root_context bool // Is it the document root context? + sequence_context bool // Is it a sequence context? + mapping_context bool // Is it a mapping context? + simple_key_context bool // Is it a simple mapping key context? + + line int // The current line. + column int // The current column. + whitespace bool // If the last character was a whitespace? + indention bool // If the last character was an indentation character (' ', '-', '?', ':')? + open_ended bool // If an explicit document end is required? + + space_above bool // Is there's an empty line above? + foot_indent int // The indent used to write the foot comment above, or -1 if none. + + // Anchor analysis. + anchor_data struct { + anchor []byte // The anchor value. + alias bool // Is it an alias? + } + + // Tag analysis. + tag_data struct { + handle []byte // The tag handle. + suffix []byte // The tag suffix. + } + + // Scalar analysis. + scalar_data struct { + value []byte // The scalar value. + multiline bool // Does the scalar contain line breaks? + flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? + block_plain_allowed bool // Can the scalar be expressed in the block plain style? + single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? + block_allowed bool // Can the scalar be expressed in the literal or folded styles? + style yaml_scalar_style_t // The output style. + } + + // Comments + head_comment []byte + line_comment []byte + foot_comment []byte + tail_comment []byte + + key_line_comment []byte + + // Dumper stuff + + opened bool // If the stream was already opened? + closed bool // If the stream was already closed? + + // The information associated with the document nodes. + anchors *struct { + references int // The number of references. + anchor int // The anchor id. + serialized bool // If the node has been emitted? + } + + last_anchor_id int // The last assigned anchor id. + + document *yaml_document_t // The currently emitted document. +} diff --git a/vendor/gopkg.in/yaml.v3/yamlprivateh.go b/vendor/gopkg.in/yaml.v3/yamlprivateh.go new file mode 100644 index 0000000000..e88f9c54ae --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/yamlprivateh.go @@ -0,0 +1,198 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +const ( + // The size of the input raw buffer. + input_raw_buffer_size = 512 + + // The size of the input buffer. + // It should be possible to decode the whole raw buffer. + input_buffer_size = input_raw_buffer_size * 3 + + // The size of the output buffer. + output_buffer_size = 128 + + // The size of the output raw buffer. + // It should be possible to encode the whole output buffer. + output_raw_buffer_size = (output_buffer_size*2 + 2) + + // The size of other stacks and queues. + initial_stack_size = 16 + initial_queue_size = 16 + initial_string_size = 16 +) + +// Check if the character at the specified position is an alphabetical +// character, a digit, '_', or '-'. +func is_alpha(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' +} + +// Check if the character at the specified position is a digit. +func is_digit(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' +} + +// Get the value of a digit. +func as_digit(b []byte, i int) int { + return int(b[i]) - '0' +} + +// Check if the character at the specified position is a hex-digit. +func is_hex(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' +} + +// Get the value of a hex-digit. +func as_hex(b []byte, i int) int { + bi := b[i] + if bi >= 'A' && bi <= 'F' { + return int(bi) - 'A' + 10 + } + if bi >= 'a' && bi <= 'f' { + return int(bi) - 'a' + 10 + } + return int(bi) - '0' +} + +// Check if the character is ASCII. +func is_ascii(b []byte, i int) bool { + return b[i] <= 0x7F +} + +// Check if the character at the start of the buffer can be printed unescaped. +func is_printable(b []byte, i int) bool { + return ((b[i] == 0x0A) || // . == #x0A + (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E + (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF + (b[i] > 0xC2 && b[i] < 0xED) || + (b[i] == 0xED && b[i+1] < 0xA0) || + (b[i] == 0xEE) || + (b[i] == 0xEF && // #xE000 <= . <= #xFFFD + !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF + !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) +} + +// Check if the character at the specified position is NUL. +func is_z(b []byte, i int) bool { + return b[i] == 0x00 +} + +// Check if the beginning of the buffer is a BOM. +func is_bom(b []byte, i int) bool { + return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF +} + +// Check if the character at the specified position is space. +func is_space(b []byte, i int) bool { + return b[i] == ' ' +} + +// Check if the character at the specified position is tab. +func is_tab(b []byte, i int) bool { + return b[i] == '\t' +} + +// Check if the character at the specified position is blank (space or tab). +func is_blank(b []byte, i int) bool { + //return is_space(b, i) || is_tab(b, i) + return b[i] == ' ' || b[i] == '\t' +} + +// Check if the character at the specified position is a line break. +func is_break(b []byte, i int) bool { + return (b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) +} + +func is_crlf(b []byte, i int) bool { + return b[i] == '\r' && b[i+1] == '\n' +} + +// Check if the character is a line break or NUL. +func is_breakz(b []byte, i int) bool { + //return is_break(b, i) || is_z(b, i) + return ( + // is_break: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + // is_z: + b[i] == 0) +} + +// Check if the character is a line break, space, or NUL. +func is_spacez(b []byte, i int) bool { + //return is_space(b, i) || is_breakz(b, i) + return ( + // is_space: + b[i] == ' ' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Check if the character is a line break, space, tab, or NUL. +func is_blankz(b []byte, i int) bool { + //return is_blank(b, i) || is_breakz(b, i) + return ( + // is_blank: + b[i] == ' ' || b[i] == '\t' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Determine the width of the character. +func width(b byte) int { + // Don't replace these by a switch without first + // confirming that it is being inlined. + if b&0x80 == 0x00 { + return 1 + } + if b&0xE0 == 0xC0 { + return 2 + } + if b&0xF0 == 0xE0 { + return 3 + } + if b&0xF8 == 0xF0 { + return 4 + } + return 0 + +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 8360fc5aeb..a8784e51c7 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,5 +1,4 @@ -# cloud.google.com/go v0.45.0 -## explicit +# cloud.google.com/go v0.46.3 cloud.google.com/go/compute/metadata # code.gitea.io/gitea-vet v0.2.1 ## explicit @@ -101,14 +100,12 @@ github.com/andybalholm/brotli github.com/andybalholm/cascadia # github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 github.com/anmitsu/go-shlex -# github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a +# github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 github.com/asaskevich/govalidator # github.com/aymerick/douceur v0.2.0 github.com/aymerick/douceur/css # github.com/beorn7/perks v1.0.1 github.com/beorn7/perks/quantile -# github.com/bgentry/speakeasy v0.1.0 -## explicit # github.com/blevesearch/bleve v1.0.7 ## explicit github.com/blevesearch/bleve @@ -241,7 +238,7 @@ github.com/ethantkoenig/rupture github.com/fatih/color # github.com/fatih/structtag v1.2.0 github.com/fatih/structtag -# github.com/fsnotify/fsnotify v1.4.7 +# github.com/fsnotify/fsnotify v1.4.9 github.com/fsnotify/fsnotify # github.com/gliderlabs/ssh v0.2.2 ## explicit @@ -317,22 +314,21 @@ github.com/go-git/go-git/v5/utils/merkletrie/filesystem github.com/go-git/go-git/v5/utils/merkletrie/index github.com/go-git/go-git/v5/utils/merkletrie/internal/frame github.com/go-git/go-git/v5/utils/merkletrie/noder -# github.com/go-openapi/analysis v0.19.5 +# github.com/go-openapi/analysis v0.19.10 github.com/go-openapi/analysis github.com/go-openapi/analysis/internal -# github.com/go-openapi/errors v0.19.2 +# github.com/go-openapi/errors v0.19.6 github.com/go-openapi/errors # github.com/go-openapi/inflect v0.19.0 github.com/go-openapi/inflect # github.com/go-openapi/jsonpointer v0.19.3 github.com/go-openapi/jsonpointer -# github.com/go-openapi/jsonreference v0.19.3 -## explicit +# github.com/go-openapi/jsonreference v0.19.4 github.com/go-openapi/jsonreference -# github.com/go-openapi/loads v0.19.3 +# github.com/go-openapi/loads v0.19.5 github.com/go-openapi/loads github.com/go-openapi/loads/fmts -# github.com/go-openapi/runtime v0.19.5 +# github.com/go-openapi/runtime v0.19.20 github.com/go-openapi/runtime github.com/go-openapi/runtime/logger github.com/go-openapi/runtime/middleware @@ -340,13 +336,13 @@ github.com/go-openapi/runtime/middleware/denco github.com/go-openapi/runtime/middleware/header github.com/go-openapi/runtime/middleware/untyped github.com/go-openapi/runtime/security -# github.com/go-openapi/spec v0.19.3 +# github.com/go-openapi/spec v0.19.8 github.com/go-openapi/spec -# github.com/go-openapi/strfmt v0.19.3 +# github.com/go-openapi/strfmt v0.19.5 github.com/go-openapi/strfmt -# github.com/go-openapi/swag v0.19.5 +# github.com/go-openapi/swag v0.19.9 github.com/go-openapi/swag -# github.com/go-openapi/validate v0.19.3 +# github.com/go-openapi/validate v0.19.10 github.com/go-openapi/validate # github.com/go-redis/redis v6.15.2+incompatible ## explicit @@ -362,7 +358,7 @@ github.com/go-redis/redis/internal/util github.com/go-sql-driver/mysql # github.com/go-stack/stack v1.8.0 github.com/go-stack/stack -# github.com/go-swagger/go-swagger v0.21.0 +# github.com/go-swagger/go-swagger v0.25.0 ## explicit github.com/go-swagger/go-swagger/cmd/swagger github.com/go-swagger/go-swagger/cmd/swagger/commands @@ -396,8 +392,7 @@ github.com/golang-sql/civil # github.com/golang/gddo v0.0.0-20190419222130-af0f2af80721 github.com/golang/gddo/httputil github.com/golang/gddo/httputil/header -# github.com/golang/protobuf v1.4.1 -## explicit +# github.com/golang/protobuf v1.4.2 github.com/golang/protobuf/proto # github.com/golang/snappy v0.0.1 github.com/golang/snappy @@ -492,7 +487,7 @@ github.com/klauspost/compress/zstd/internal/xxhash github.com/klauspost/cpuid # github.com/klauspost/pgzip v1.2.1 github.com/klauspost/pgzip -# github.com/kr/pretty v0.1.0 +# github.com/kr/pretty v0.2.0 github.com/kr/pretty # github.com/kr/text v0.2.0 github.com/kr/text @@ -518,8 +513,7 @@ github.com/lunny/nodb/store/driver github.com/lunny/nodb/store/goleveldb # github.com/magiconair/properties v1.8.1 github.com/magiconair/properties -# github.com/mailru/easyjson v0.7.0 -## explicit +# github.com/mailru/easyjson v0.7.1 github.com/mailru/easyjson github.com/mailru/easyjson/buffer github.com/mailru/easyjson/jlexer @@ -589,7 +583,7 @@ github.com/minio/sha256-simd # github.com/mitchellh/go-homedir v1.1.0 ## explicit github.com/mitchellh/go-homedir -# github.com/mitchellh/mapstructure v1.1.2 +# github.com/mitchellh/mapstructure v1.3.2 github.com/mitchellh/mapstructure # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd github.com/modern-go/concurrent @@ -620,7 +614,7 @@ github.com/oliamb/cutter github.com/olivere/elastic/v7 github.com/olivere/elastic/v7/config github.com/olivere/elastic/v7/uritemplates -# github.com/pelletier/go-toml v1.4.0 +# github.com/pelletier/go-toml v1.8.0 github.com/pelletier/go-toml # github.com/philhofer/fwd v1.0.0 github.com/philhofer/fwd @@ -643,7 +637,6 @@ github.com/prometheus/client_golang/prometheus github.com/prometheus/client_golang/prometheus/internal github.com/prometheus/client_golang/prometheus/promhttp # github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 -## explicit github.com/prometheus/client_model/go # github.com/prometheus/common v0.6.0 github.com/prometheus/common/expfmt @@ -673,23 +666,25 @@ github.com/shurcooL/httpfs/vfsutil github.com/shurcooL/vfsgen # github.com/siddontang/go-snappy v0.0.0-20140704025258-d8f7bb82a96d github.com/siddontang/go-snappy/snappy -# github.com/spf13/afero v1.2.2 +# github.com/spf13/afero v1.3.2 github.com/spf13/afero github.com/spf13/afero/mem -# github.com/spf13/cast v1.3.0 +# github.com/spf13/cast v1.3.1 github.com/spf13/cast # github.com/spf13/jwalterweatherman v1.1.0 github.com/spf13/jwalterweatherman # github.com/spf13/pflag v1.0.5 github.com/spf13/pflag -# github.com/spf13/viper v1.4.0 +# github.com/spf13/viper v1.7.0 github.com/spf13/viper # github.com/steveyen/gtreap v0.1.0 github.com/steveyen/gtreap -# github.com/stretchr/testify v1.5.1 +# github.com/stretchr/testify v1.6.1 ## explicit github.com/stretchr/testify/assert github.com/stretchr/testify/require +# github.com/subosito/gotenv v1.2.0 +github.com/subosito/gotenv # github.com/syndtr/goleveldb v1.0.0 github.com/syndtr/goleveldb/leveldb github.com/syndtr/goleveldb/leveldb/cache @@ -761,9 +756,10 @@ github.com/yuin/goldmark-highlighting github.com/yuin/goldmark-meta # go.etcd.io/bbolt v1.3.4 go.etcd.io/bbolt -# go.mongodb.org/mongo-driver v1.1.1 +# go.mongodb.org/mongo-driver v1.3.5 go.mongodb.org/mongo-driver/bson go.mongodb.org/mongo-driver/bson/bsoncodec +go.mongodb.org/mongo-driver/bson/bsonoptions go.mongodb.org/mongo-driver/bson/bsonrw go.mongodb.org/mongo-driver/bson/bsontype go.mongodb.org/mongo-driver/bson/primitive @@ -884,8 +880,7 @@ golang.org/x/tools/internal/typesinternal # golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 golang.org/x/xerrors golang.org/x/xerrors/internal -# google.golang.org/appengine v1.6.5 -## explicit +# google.golang.org/appengine v1.6.6 google.golang.org/appengine google.golang.org/appengine/internal google.golang.org/appengine/internal/app_identity @@ -896,7 +891,7 @@ google.golang.org/appengine/internal/modules google.golang.org/appengine/internal/remote_api google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/urlfetch -# google.golang.org/protobuf v1.22.0 +# google.golang.org/protobuf v1.25.0 google.golang.org/protobuf/encoding/prototext google.golang.org/protobuf/encoding/protowire google.golang.org/protobuf/internal/descfmt @@ -907,12 +902,11 @@ google.golang.org/protobuf/internal/encoding/messageset google.golang.org/protobuf/internal/encoding/tag google.golang.org/protobuf/internal/encoding/text google.golang.org/protobuf/internal/errors -google.golang.org/protobuf/internal/fieldnum google.golang.org/protobuf/internal/fieldsort google.golang.org/protobuf/internal/filedesc google.golang.org/protobuf/internal/filetype google.golang.org/protobuf/internal/flags -google.golang.org/protobuf/internal/genname +google.golang.org/protobuf/internal/genid google.golang.org/protobuf/internal/impl google.golang.org/protobuf/internal/mapsort google.golang.org/protobuf/internal/pragma @@ -944,6 +938,8 @@ gopkg.in/warnings.v0 # gopkg.in/yaml.v2 v2.3.0 ## explicit gopkg.in/yaml.v2 +# gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 +gopkg.in/yaml.v3 # mvdan.cc/xurls/v2 v2.1.0 ## explicit mvdan.cc/xurls/v2 |