diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index e502436..623a343 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -15,7 +15,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.23.1' - name: Build run: | go build -o main.exe -v ./main.go @@ -40,7 +40,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.23.1' - name: Build run: | go build -o main -v ./main.go @@ -65,7 +65,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: '1.20' + go-version: '1.23.1' - name: Build run: | go build -o main -v ./main.go diff --git a/README.md b/README.md index b474ecb..a3a8a77 100644 --- a/README.md +++ b/README.md @@ -18,11 +18,12 @@ ### Special thanks to `chocomint` for creating `agent-arm64.js` -本项目仅支持ALAC、Atmos和苹果数字母带生成的AAC(adm-aac),不支持仅有AAC的专辑(only-aac)及MV +本项目暂不支持MV下载,对于下载aac-lc则必须填入有订阅的media-user-token - `alac (audio-alac-stereo)` - `ec3 (audio-atmos / audio-ec3)` - `aac (audio-stereo)` +- `aac-lc (audio-stereo)` - `aac-binaural (audio-stereo-binaural)` - `aac-downmix (audio-stereo-downmix)` @@ -54,7 +55,7 @@ Original script by Sorrow. Modified by me to include some fixes and improvements 8. Start downloading singles: `go run main.go --select https://music.apple.com/us/album/whenever-you-need-somebody-2022-remaster/1624945511` input numbers separated by spaces. 9. Start downloading some playlists: `go run main.go https://music.apple.com/us/playlist/taylor-swift-essentials/pl.3950454ced8c45a3b0cc693c2a7db97b` or `go run main.go https://music.apple.com/us/playlist/hi-res-lossless-24-bit-192khz/pl.u-MDAWvpjt38370N`. 10. For dolby atmos: `go run main.go --atmos https://music.apple.com/us/album/1989-taylors-version-deluxe/1713845538`. -11. For adm aac: `go run main.go --aac https://music.apple.com/us/album/1989-taylors-version-deluxe/1713845538`. +11. For aac: `go run main.go --aac https://music.apple.com/us/album/1989-taylors-version-deluxe/1713845538`. [中文教程-详见方法三](https://telegra.ph/Apple-Music-Alac高解析度无损音乐下载教程-04-02-2) diff --git a/config.yaml b/config.yaml index 2d17f91..1da4d38 100644 --- a/config.yaml +++ b/config.yaml @@ -1,4 +1,4 @@ -media-user-token: "your-media-user-token" #If you need to obtain the lyrics, need to change it +media-user-token: "your-media-user-token" #If you need to obtain lyrics and aac-lc, need to change it authorization-token: "your-authorization-token" #You don't need to change it; it can automatically obtain token language: "" #supportedLanguage by each storefront --> https://gist.github.com/itouakirai/c8ba9df9dc65bd300094103b058731d0 lrc-type: "lyrics" #lyrics or syllable-lyrics @@ -19,7 +19,7 @@ get-m3u8-port: "127.0.0.1:20020" get-m3u8-from-device: true #set 'all' to retrieve all m3u8, and set 'hires' to only detect hires m3u8. get-m3u8-mode: hires # all hires -aac-type: aac # aac aac-binaural aac-downmix +aac-type: aac-lc # aac-lc aac aac-binaural aac-downmix alac-max: 192000 #192000 96000 48000 44100 atmos-max: 2768 #2768 2448 limit-max: 200 diff --git a/go.mod b/go.mod index 8e3c5a4..2613fbc 100644 --- a/go.mod +++ b/go.mod @@ -1,25 +1,98 @@ module main -go 1.17 +go 1.23.1 require ( github.com/Eyevinn/mp4ff v0.46.0 - github.com/abema/go-mp4 v1.3.0 + github.com/Sorrow446/go-mp4tag v0.0.0-20240130220823-68ce31d53e37 + github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1 + github.com/gospider007/requests v0.0.0-20250114011338-9562a203fa04 github.com/grafov/m3u8 v0.11.1 github.com/schollz/progressbar/v3 v3.14.6 github.com/spf13/pflag v1.0.5 + google.golang.org/protobuf v1.36.2 + lukechampine.com/frand v1.5.1 ) require ( - github.com/Sorrow446/go-mp4tag v0.0.0-20240130220823-68ce31d53e37 // indirect + github.com/PuerkitoBio/goquery v1.10.1 // indirect + github.com/STARRY-S/zip v0.2.1 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect + github.com/andybalholm/cascadia v1.3.3 // indirect + github.com/bodgit/plumbing v1.3.0 // indirect + github.com/bodgit/sevenzip v1.6.0 // indirect + github.com/bodgit/windows v1.0.1 // indirect + github.com/caddyserver/certmagic v0.21.5 // indirect + github.com/caddyserver/zerossl v0.1.3 // indirect + github.com/cloudflare/circl v1.5.0 // indirect + github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect + github.com/gaukas/clienthellod v0.4.2 // indirect + github.com/gaukas/godicttls v0.0.4 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/google/gopacket v1.1.19 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/gospider007/bar v0.0.0-20241205091858-06f3c7e16dd9 // indirect + github.com/gospider007/blog v0.0.0-20241205091827-6bcaf48620d4 // indirect + github.com/gospider007/bs4 v0.0.0-20241216122612-aa3f29179e6f // indirect + github.com/gospider007/gson v0.0.0-20241216122450-fb66d0ba2a07 // indirect + github.com/gospider007/gtls v0.0.0-20250107100054-2a14fa6fc9c5 // indirect + github.com/gospider007/http2 v0.0.0-20250107095809-0f8c60040d4a // indirect + github.com/gospider007/http3 v0.0.0-20250107095941-a36b210aca37 // indirect + github.com/gospider007/ja3 v0.0.0-20250107091445-e294e50de314 // indirect + github.com/gospider007/kinds v0.0.0-20240929092451-8f867acde255 // indirect + github.com/gospider007/re v0.0.0-20241216142712-efbef8d55ea2 // indirect + github.com/gospider007/tools v0.0.0-20250107090942-5b406ab8a72b // indirect + github.com/gospider007/websocket v0.0.0-20250107091829-c78035a103b2 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.17.11 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/pgzip v1.2.6 // indirect + github.com/kr/pretty v0.2.1 // indirect + github.com/libdns/libdns v0.2.2 // indirect + github.com/mholt/acmez/v3 v3.0.0 // indirect + github.com/mholt/archives v0.1.0 // indirect + github.com/miekg/dns v1.1.62 // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/nwaples/rardecode/v2 v2.0.1 // indirect + github.com/onsi/ginkgo/v2 v2.22.2 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.48.2 // indirect + github.com/refraction-networking/uquic v0.0.6 // indirect + github.com/refraction-networking/utls v1.6.7 // indirect github.com/rivo/uniseg v0.4.7 // indirect - golang.org/x/sys v0.22.0 // indirect - golang.org/x/term v0.22.0 // indirect + github.com/sorairolake/lzip-go v0.3.5 // indirect + github.com/therootcompany/xz v1.0.1 // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/sjson v1.2.5 // indirect + github.com/ulikunitz/xz v0.5.12 // indirect + github.com/zeebo/blake3 v0.2.4 // indirect + go.mongodb.org/mongo-driver v1.17.2 // indirect + go.uber.org/mock v0.5.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.uber.org/zap/exp v0.3.0 // indirect + go4.org v0.0.0-20230225012048-214862532bf5 // indirect + golang.org/x/crypto v0.32.0 // indirect + golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect + golang.org/x/image v0.23.0 // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/term v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/tools v0.29.0 // indirect ) require ( github.com/beevik/etree v1.3.0 - github.com/google/uuid v1.1.2 // indirect gopkg.in/yaml.v2 v2.2.8 ) diff --git a/go.sum b/go.sum index b48d54b..ecf206a 100644 --- a/go.sum +++ b/go.sum @@ -1,59 +1,499 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +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/Eyevinn/mp4ff v0.46.0 h1:A8oJA4A3C9fDbX38jEw/26utjNdvmRmrO37tVI5pDk0= github.com/Eyevinn/mp4ff v0.46.0/go.mod h1:hJNUUqOBryLAzUW9wpCJyw2HaI+TCd2rUPhafoS5lgg= +github.com/PuerkitoBio/goquery v1.10.1 h1:Y8JGYUkXWTGRB6Ars3+j3kN0xg1YqqlwvdTV8WTFQcU= +github.com/PuerkitoBio/goquery v1.10.1/go.mod h1:IYiHrOMps66ag56LEH7QYDDupKXyo5A8qrjIx3ZtujY= +github.com/STARRY-S/zip v0.2.1 h1:pWBd4tuSGm3wtpoqRZZ2EAwOmcHK6XFf7bU9qcJXyFg= +github.com/STARRY-S/zip v0.2.1/go.mod h1:xNvshLODWtC4EJ702g7cTYn13G53o1+X9BWnPFpcWV4= github.com/Sorrow446/go-mp4tag v0.0.0-20240130220823-68ce31d53e37 h1:6X6U2D53ITfDGiyGN+sOVm/iFveFHrFRS7icGJ+u88M= github.com/Sorrow446/go-mp4tag v0.0.0-20240130220823-68ce31d53e37/go.mod h1:l5rVvaRUrCot83416D6xggKCeFZQAXcv02tnJslG26s= -github.com/abema/go-mp4 v1.3.0 h1:vr0PX0jk3E4GO1c28fNRsyZdkLwz38R+XRVncIH1XDk= -github.com/abema/go-mp4 v1.3.0/go.mod h1:vPl9t5ZK7K0x68jh12/+ECWBCXoWuIDtNgPtU2f04ws= +github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1 h1:+JkXLHME8vLJafGhOH4aoV2Iu8bR55nU6iKMVfYVLjY= +github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1/go.mod h1:nuudZmJhzWtx2212z+pkuy7B6nkBqa+xwNXZHL1j8cg= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= +github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= github.com/beevik/etree v1.3.0 h1:hQTc+pylzIKDb23yYprodCWWTt+ojFfUZyzU09a/hmU= github.com/beevik/etree v1.3.0/go.mod h1:aiPf89g/1k3AShMVAzriilpcE4R/Vuor90y83zVZWFc= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU= +github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs= +github.com/bodgit/sevenzip v1.6.0 h1:a4R0Wu6/P1o1pP/3VV++aEOcyeBxeO/xE2Y9NSTrr6A= +github.com/bodgit/sevenzip v1.6.0/go.mod h1:zOBh9nJUof7tcrlqJFv1koWRrhz3LbDbUNngkuZxLMc= +github.com/bodgit/windows v1.0.1 h1:tF7K6KOluPYygXa3Z2594zxlkbKPAOvqr97etrGNIz4= +github.com/bodgit/windows v1.0.1/go.mod h1:a6JLwrB4KrTR5hBpp8FI9/9W9jJfeQ2h4XDXU74ZCdM= +github.com/caddyserver/certmagic v0.21.5 h1:iIga4nZRgd27EIEbX7RZmoRMul+EVBn/h7bAGL83dnY= +github.com/caddyserver/certmagic v0.21.5/go.mod h1:n1sCo7zV1Ez2j+89wrzDxo4N/T1Ws/Vx8u5NvuBFabw= +github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA= +github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys= +github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= 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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 h1:2tV76y6Q9BB+NEBasnqvs7e49aEBFI8ejC89PSnWH+4= +github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= +github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= +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/gaukas/clienthellod v0.4.2 h1:LPJ+LSeqt99pqeCV4C0cllk+pyWmERisP7w6qWr7eqE= +github.com/gaukas/clienthellod v0.4.2/go.mod h1:M57+dsu0ZScvmdnNxaxsDPM46WhSEdPYAOdNgfL7IKA= +github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk= +github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/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/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +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/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +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/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gospider007/bar v0.0.0-20241205091858-06f3c7e16dd9 h1:mKDRxvZNftY8msmyonqGLlTAbCUYTJNYbX5Ha0REwzs= +github.com/gospider007/bar v0.0.0-20241205091858-06f3c7e16dd9/go.mod h1:dZ50Fil3qVmYCGGR9hne3RwgZRfZj+NZQE7NaKBNdPI= +github.com/gospider007/blog v0.0.0-20241205091827-6bcaf48620d4 h1:MA0vcRGiy5JPlQYPU9wg7reG4dZkW3v5Q/DVtAUJ6yQ= +github.com/gospider007/blog v0.0.0-20241205091827-6bcaf48620d4/go.mod h1:y7eLYgD+hFH2v8qrlrO5KtFTGwYxQaQuWyGAuZh7QHU= +github.com/gospider007/bs4 v0.0.0-20241216122612-aa3f29179e6f h1:/pbT94pif600rZwdOKPi5VaZ6D2pdnQuBSmiqOzRkSA= +github.com/gospider007/bs4 v0.0.0-20241216122612-aa3f29179e6f/go.mod h1:M3XPdOCrwkB1UJiaF506o8KCDpRKnkzZBQ5PWitVc90= +github.com/gospider007/gson v0.0.0-20241216122450-fb66d0ba2a07 h1:cqsuxxIKxbRG/xRPNwgFUfvGKc992snPjn5WlXkCtnA= +github.com/gospider007/gson v0.0.0-20241216122450-fb66d0ba2a07/go.mod h1:XcFiXq3t2+b1x9zezQV/FbuB5Y1rdUrtvpJRbxZXef4= +github.com/gospider007/gtls v0.0.0-20250107100054-2a14fa6fc9c5 h1:c0payCC+agt1c+SK66VYXcs8eFktGlxWhK+t6V/6PPc= +github.com/gospider007/gtls v0.0.0-20250107100054-2a14fa6fc9c5/go.mod h1:qIlB6X0WLv9QVqo/LLqkml0JDKSjeL3x4tI1QCINU94= +github.com/gospider007/http2 v0.0.0-20250107095809-0f8c60040d4a h1:Gx/aemk7BFyjguVXWS9oxNHjhmcz67gtGNbNyVaahOE= +github.com/gospider007/http2 v0.0.0-20250107095809-0f8c60040d4a/go.mod h1:3uzGktvy4KnYZm+DwWNui4RsvPUQSSphJ1VTtfO1tE0= +github.com/gospider007/http3 v0.0.0-20250107095941-a36b210aca37 h1:i9WhiyjKwaU2imUof0i95WhcGCx8HHTTCnkHzEIlWq8= +github.com/gospider007/http3 v0.0.0-20250107095941-a36b210aca37/go.mod h1:6zmeD45uQFfHLWTsgAUP4FXgdj6MUTGyQar091dTDtw= +github.com/gospider007/ja3 v0.0.0-20250107091445-e294e50de314 h1:HAdIVngGI5Hj7tSF5nV0YCze+G24ck+9qGf5H/VT4hw= +github.com/gospider007/ja3 v0.0.0-20250107091445-e294e50de314/go.mod h1:LyhufzO6wrBlxeilbUJElfEdDNdD+1v9fB5p30pDAjE= +github.com/gospider007/kinds v0.0.0-20240929092451-8f867acde255 h1:X+AM/mgmh/EfyQUjKZp1VFc9TSlrhkwS0eSYeo5fMs4= +github.com/gospider007/kinds v0.0.0-20240929092451-8f867acde255/go.mod h1:yZx7Zfp1I4P6CO3TcDyDY5SuXQYr0bZjzT9zG0XrJAI= +github.com/gospider007/re v0.0.0-20241216142712-efbef8d55ea2 h1:ixXFS1DqP0NnHna+b0JKaPqMRYRmahzUADZn7PawQq0= +github.com/gospider007/re v0.0.0-20241216142712-efbef8d55ea2/go.mod h1:kr9bUaC42FS019Ak23fSctbTRB2JpfPPg/pSVjQmsws= +github.com/gospider007/requests v0.0.0-20250114011338-9562a203fa04 h1:QgWCKic6UawnAIGdfGEe2M9cjvaXKwBL/zU3LCQkki4= +github.com/gospider007/requests v0.0.0-20250114011338-9562a203fa04/go.mod h1:nWEyJT8cCQAJr+b3zPoaYuOo1z3YJT6SNz4cfi8Y1hc= +github.com/gospider007/tools v0.0.0-20250107090942-5b406ab8a72b h1:iiAxiufROgDsuQInI6dAx1CG3m7nMMj3C0SAE84oY7g= +github.com/gospider007/tools v0.0.0-20250107090942-5b406ab8a72b/go.mod h1:mTtocamaDuVtgdEXu72OGw6uOhDIOCr98zcvZyBLiro= +github.com/gospider007/websocket v0.0.0-20250107091829-c78035a103b2 h1:hp8IZHhmq4tAkJRFZ3QXRoRwwNyvAeYyqecV/JvFPYc= +github.com/gospider007/websocket v0.0.0-20250107091829-c78035a103b2/go.mod h1:0DHN5ImV48fYE0NkMKynEQLTo+CxMUMCqvIMUE8qUQI= github.com/grafov/m3u8 v0.11.1 h1:igZ7EBIB2IAsPPazKwRKdbhxcoBKO3lO1UY57PZDeNA= github.com/grafov/m3u8 v0.11.1/go.mod h1:nqzOkfBiZJENr52zTVd/Dcl03yzphIMbJqkXGu+u080= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +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.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= +github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s= +github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mholt/acmez/v3 v3.0.0 h1:r1NcjuWR0VaKP2BTjDK9LRFBw/WvURx3jlaEUl9Ht8E= +github.com/mholt/acmez/v3 v3.0.0/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ= +github.com/mholt/archives v0.1.0 h1:FacgJyrjiuyomTuNA92X5GyRBRZjE43Y/lrzKIlF35Q= +github.com/mholt/archives v0.1.0/go.mod h1:j/Ire/jm42GN7h90F5kzj6hf6ZFzEH66de+hmjEKu+I= +github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/orcaman/writerseeker v0.0.0-20200621085525-1d3f536ff85e h1:s2RNOM/IGdY0Y6qfTeUKhDawdHDpK9RGBdx80qN4Ttw= -github.com/orcaman/writerseeker v0.0.0-20200621085525-1d3f536ff85e/go.mod h1:nBdnFKj15wFbf94Rwfq4m30eAcyY9V/IyKAGQFtqkW0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +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 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nwaples/rardecode/v2 v2.0.1 h1:3MN6/R+Y4c7e+21U3yhWuUcf72sYmcmr6jtiuAVSH1A= +github.com/nwaples/rardecode/v2 v2.0.1/go.mod h1:yntwv/HfMc/Hbvtq9I19D1n58te3h6KsqCf3GxyfBGY= +github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= +github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/refraction-networking/uquic v0.0.6 h1:9ol1oOaOpHDeeDlBY7u228jK+T5oic35QrFimHVaCMM= +github.com/refraction-networking/uquic v0.0.6/go.mod h1:TFgTmV/yqVCMEXVwP7z7PMAhzye02rFHLV6cRAg59jc= +github.com/refraction-networking/utls v1.6.7 h1:zVJ7sP1dJx/WtVuITug3qYUq034cDq9B2MR1K67ULZM= +github.com/refraction-networking/utls v1.6.7/go.mod h1:BC3O4vQzye5hqpmDTWUqi4P5DDhzJfkV1tdqtawQIH0= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= github.com/schollz/progressbar/v3 v3.14.6 h1:GyjwcWBAf+GFDMLziwerKvpuS7ZF+mNTAXIB2aspiZs= github.com/schollz/progressbar/v3 v3.14.6/go.mod h1:Nrzpuw3Nl0srLY0VlTvC4V6RL50pcEymjy6qyJAaLa0= +github.com/sorairolake/lzip-go v0.3.5 h1:ms5Xri9o1JBIWvOFAorYtUNik6HI3HgBTkISiqu0Cwg= +github.com/sorairolake/lzip-go v0.3.5/go.mod h1:N0KYq5iWrMXI0ZEXKXaS9hCyOjZUQdBDEIbXfoUwbdk= 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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 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/sunfish-shogi/bufseekio v0.0.0-20210207115823-a4185644b365/go.mod h1:dEzdXgvImkQ3WLI+0KQpmEx8T/C/ma9KeS3AfmU899I= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/therootcompany/xz v1.0.1 h1:CmOtsn1CbtmyYiusbfmhmkpAAETj0wBIH6kCYaX+xzw= +github.com/therootcompany/xz v1.0.1/go.mod h1:3K3UH1yCKgBneZYhuQUvJ9HPD19UEXEI0BWbMn8qNMY= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= +github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= +github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI= +github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE= +github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= +github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= +go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM= +go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap/exp v0.3.0 h1:6JYzdifzYkGmTdRR59oYH+Ng7k49H9qVpWwNSsGJj3U= +go.uber.org/zap/exp v0.3.0/go.mod h1:5I384qq7XGxYyByIhHm6jg5CHkGY0nsTfbDLgDDlgJQ= +go4.org v0.0.0-20230225012048-214862532bf5 h1:nifaUDeh+rPaBCMPMQHZmvJf+QdpLFnuQPwx+LxVmtc= +go4.org v0.0.0-20230225012048-214862532bf5/go.mod h1:F57wTi5Lrj6WLyswp5EYV1ncrEbFGHD4hhz6S1ZYeaU= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +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/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +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/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68= +golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY= +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/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-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/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +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-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-20190524140312-2c0ae7006135/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-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/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-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +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.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU= +google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/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.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +lukechampine.com/frand v1.5.1 h1:fg0eRtdmGFIxhP5zQJzM1lFDbD6CUfu/f+7WgAZd5/w= +lukechampine.com/frand v1.5.1/go.mod h1:4VstaWc2plN4Mjr10chUD46RAVGWhpkZ5Nja8+Azp0Q= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/main.go b/main.go index 83b042e..2be97ef 100644 --- a/main.go +++ b/main.go @@ -29,6 +29,8 @@ import ( "main/utils/runv2" "main/utils/structs" + + "main/utils/runv3" ) var ( @@ -426,7 +428,7 @@ func contains(slice []string, item string) bool { func rip(albumId string, token string, storefront string, userToken string) error { var Codec string if dl_atmos { - Codec = "Atmos" + Codec = "ATMOS" } else if dl_aac { Codec = "AAC" } else { @@ -472,13 +474,17 @@ func rip(albumId string, token string, storefront string, userToken string) erro if strings.Contains(Config.AlbumFolderFormat, "Quality") { if dl_atmos { Quality = fmt.Sprintf("%dkbps", Config.AtmosMax-2000) + } else if dl_aac && Config.AacType == "aac-lc" { + Quality = "256kbps" } else { manifest1, err := getInfoFromAdam(meta.Data[0].Relationships.Tracks.Data[0].ID, token, storefront) if err != nil { fmt.Println("Failed to get manifest.\n", err) } else { if manifest1.Attributes.ExtendedAssetUrls.EnhancedHls == "" { - fmt.Println("Unavailable.\n") + Codec = "AAC" + Quality = "256kbps" + //fmt.Println("Unavailable.\n") } else { needCheck := false @@ -655,10 +661,18 @@ func rip(albumId string, token string, storefront string, userToken string) erro counter.NotSong++ continue } + needDlAacLc := false + if dl_aac && Config.AacType == "aac-lc" { + needDlAacLc = true + } if manifest.Attributes.ExtendedAssetUrls.EnhancedHls == "" { - fmt.Println("\u26A0 Unavailable.") - counter.Unavailable++ - continue + if dl_atmos { + fmt.Println("Unavailable") + counter.Unavailable++ + continue + } + fmt.Println("Unavailable, Try DL AAC-LC") + needDlAacLc = true } needCheck := false @@ -668,7 +682,7 @@ func rip(albumId string, token string, storefront string, userToken string) erro needCheck = true } var EnhancedHls_m3u8 string - if needCheck { + if needCheck && !needDlAacLc { EnhancedHls_m3u8, err = checkM3u8(track.ID, "song") if strings.HasSuffix(EnhancedHls_m3u8, ".m3u8") { manifest.Attributes.ExtendedAssetUrls.EnhancedHls = EnhancedHls_m3u8 @@ -678,6 +692,8 @@ func rip(albumId string, token string, storefront string, userToken string) erro if strings.Contains(Config.SongFileFormat, "Quality") { if dl_atmos { Quality = fmt.Sprintf("%dkbps", Config.AtmosMax-2000) + } else if needDlAacLc { + Quality = fmt.Sprintf("256kbps") } else { Quality, err = extractMediaQuality(manifest.Attributes.ExtendedAssetUrls.EnhancedHls) if err != nil { @@ -719,6 +735,8 @@ func rip(albumId string, token string, storefront string, userToken string) erro filename := fmt.Sprintf("%s.m4a", forbiddenNames.ReplaceAllString(songName, "_")) lrcFilename := fmt.Sprintf("%s.%s", forbiddenNames.ReplaceAllString(songName, "_"), Config.LrcFormat) trackPath := filepath.Join(sanAlbumFolder, filename) + + //get lrc var lrc string = "" if userToken != "your-media-user-token" && (Config.EmbedLrc || Config.SaveLrcFile) { ttml, err := getSongLyrics(track.ID, storefront, token, userToken) @@ -760,23 +778,36 @@ func rip(albumId string, token string, storefront string, userToken string) erro okDict[albumId] = append(okDict[albumId], trackNum) continue } - - trackM3u8Url, err := extractMedia(manifest.Attributes.ExtendedAssetUrls.EnhancedHls) - if err != nil { - fmt.Println("\u26A0 Failed to extract info from manifest:", err) - counter.Unavailable++ - continue - } - //边下载边解密 - err = runv2.Run(track.ID, trackM3u8Url, trackPath, Config) - if err != nil { - fmt.Println("Failed to run v2:", err) - counter.Error++ - continue + if needDlAacLc { + if userToken == "your-media-user-token" { + fmt.Println("media-user-token Unset!") + counter.Error++ + continue + } + err := runv3.Run(track.ID, trackPath, token, userToken) + if err != nil { + fmt.Println("Failed to dl aac-lc:", err) + counter.Error++ + continue + } + } else { + trackM3u8Url, err := extractMedia(manifest.Attributes.ExtendedAssetUrls.EnhancedHls) + if err != nil { + fmt.Println("\u26A0 Failed to extract info from manifest:", err) + counter.Unavailable++ + continue + } + //边下载边解密 + err = runv2.Run(track.ID, trackM3u8Url, trackPath, Config) + if err != nil { + fmt.Println("Failed to run v2:", err) + counter.Error++ + continue + } } - tags := []string{ "tool=", + fmt.Sprintf("artist=%s", meta.Data[0].Attributes.ArtistName), fmt.Sprintf("lyrics=%s", lrc), } if Config.EmbedCover { @@ -805,12 +836,16 @@ func rip(albumId string, token string, storefront string, userToken string) erro } } err = writeMP4Tags(trackPath, meta, trackNum, trackTotal) - + if err != nil { + fmt.Println("\u26A0 Failed to write tags in media:", err) + counter.Unavailable++ + continue + } counter.Success++ okDict[albumId] = append(okDict[albumId], trackNum) } } - return err + return nil } func writeMP4Tags(trackPath string, meta *structs.AutoGenerated, trackNum, trackTotal int) error { @@ -819,7 +854,7 @@ func writeMP4Tags(trackPath string, meta *structs.AutoGenerated, trackNum, track t := &mp4tag.MP4Tags{ Title: meta.Data[0].Relationships.Tracks.Data[index].Attributes.Name, TitleSort: meta.Data[0].Relationships.Tracks.Data[index].Attributes.Name, - AlbumArtist: meta.Data[0].Attributes.ArtistName, + //AlbumArtist: meta.Data[0].Attributes.ArtistName, AlbumArtistSort: meta.Data[0].Attributes.ArtistName, Artist: meta.Data[0].Relationships.Tracks.Data[index].Attributes.ArtistName, ArtistSort: meta.Data[0].Relationships.Tracks.Data[index].Attributes.ArtistName, @@ -881,14 +916,14 @@ func writeMP4Tags(trackPath string, meta *structs.AutoGenerated, trackNum, track mp4, err := mp4tag.Open(trackPath) if err != nil { - panic(err) + return err } defer mp4.Close() err = mp4.Write(t, []string{}) if err != nil { - panic(err) + return err } - return err + return nil } func main() { diff --git a/utils/runv2/runv2.go b/utils/runv2/runv2.go index 3d7b8a0..29f7dff 100644 --- a/utils/runv2/runv2.go +++ b/utils/runv2/runv2.go @@ -118,14 +118,36 @@ func Run(adamId string, playlistUrl string, outfile string, Config structs.Confi return err } defer do.Body.Close() - body = do.Body + if do.ContentLength < int64(Config.MaxMemoryLimit * 1024 * 1024) { + var buffer bytes.Buffer + bar := progressbar.NewOptions64( + do.ContentLength, + progressbar.OptionClearOnFinish(), + progressbar.OptionSetElapsedTime(false), + progressbar.OptionSetPredictTime(false), + progressbar.OptionShowElapsedTimeOnFinish(), + progressbar.OptionShowCount(), + progressbar.OptionEnableColorCodes(true), + progressbar.OptionShowBytes(true), + progressbar.OptionSetDescription("Downloading..."), + progressbar.OptionSetTheme(progressbar.Theme{ + Saucer: "", + SaucerHead: "", + SaucerPadding: "", + BarStart: "", + BarEnd: "", + }), + ) + io.Copy(io.MultiWriter(&buffer, bar), do.Body) + body = &buffer + fmt.Print("Downloaded\n") + } else { + body = do.Body + } } var totalLen int64 totalLen = do.ContentLength - - - // connect to decryptor //addr := fmt.Sprintf("127.0.0.1:10020") addr := Config.DecryptM3u8Port @@ -133,26 +155,14 @@ func Run(adamId string, playlistUrl string, outfile string, Config structs.Confi if err != nil { return err } - fmt.Print("Downloading...\n") + //fmt.Print("Decrypting...\n") defer Close(conn) err = downloadAndDecryptFile(conn, body, outfile, adamId, segments, totalLen, Config) if err != nil { return err } - fmt.Print("Decryption finished\n") - // create output file - // ofh, err := os.Create(outfile) - // if err != nil { - // return err - // } - // defer ofh.Close() - // - // _, err = ofh.Write(buffer.Bytes()) - // if err != nil { - // return err - // } - + fmt.Print("Decrypted\n") return nil } @@ -204,7 +214,7 @@ func downloadAndDecryptFile(conn io.ReadWriter, in io.Reader, outfile string, progressbar.OptionShowCount(), progressbar.OptionEnableColorCodes(true), progressbar.OptionShowBytes(true), - //progressbar.OptionSetDescription("Decrypting..."), + progressbar.OptionSetDescription("Decrypting..."), progressbar.OptionSetTheme(progressbar.Theme{ Saucer: "", SaucerHead: "", diff --git a/utils/runv3/cdm/cdm.go b/utils/runv3/cdm/cdm.go new file mode 100644 index 0000000..02e890c --- /dev/null +++ b/utils/runv3/cdm/cdm.go @@ -0,0 +1,274 @@ +package wv + +import ( + "bytes" + "crypto" + "crypto/aes" + "crypto/cipher" + "crypto/rsa" + "crypto/sha1" + "crypto/x509" + "encoding/pem" + "errors" + "github.com/aead/cmac" + "google.golang.org/protobuf/proto" + "lukechampine.com/frand" + "math" + "time" +) + +type CDM struct { + privateKey *rsa.PrivateKey + clientID []byte + sessionID [32]byte + + widevineCencHeader WidevineCencHeader + signedDeviceCertificate SignedDeviceCertificate + privacyMode bool +} + +type Key struct { + ID []byte + Type License_KeyContainer_KeyType + Value []byte +} + +// Creates a new CDM object with the specified device information. +func NewCDM(privateKey string, clientID []byte, initData []byte) (CDM, error) { + block, _ := pem.Decode([]byte(privateKey)) + if block == nil || block.Type != "RSA PRIVATE KEY" { + return CDM{}, errors.New("failed to decode device private key") + } + keyParsed, err := x509.ParsePKCS1PrivateKey(block.Bytes) + if err != nil { + return CDM{}, err + } + + var widevineCencHeader WidevineCencHeader + if len(initData) < 32 { + return CDM{}, errors.New("initData not long enough") + } + if err := proto.Unmarshal(initData[32:], &widevineCencHeader); err != nil { + return CDM{}, err + } + + sessionID := func() (s [32]byte) { + c := []byte("ABCDEF0123456789") + for i := 0; i < 16; i++ { + s[i] = c[frand.Intn(len(c))] + } + s[16] = '0' + s[17] = '1' + for i := 18; i < 32; i++ { + s[i] = '0' + } + return s + }() + + return CDM{ + privateKey: keyParsed, + clientID: clientID, + + widevineCencHeader: widevineCencHeader, + + sessionID: sessionID, + }, nil +} + +// Creates a new CDM object using the default device configuration. +func NewDefaultCDM(initData []byte) (CDM, error) { + return NewCDM(DefaultPrivateKey, DefaultClientID, initData) +} + +// Sets a device certificate. This is makes generating the license request +// more complicated but is supported. This is usually not necessary for most +// Widevine applications. +func (c *CDM) SetServiceCertificate(certData []byte) error { + var message SignedMessage + if err := proto.Unmarshal(certData, &message); err != nil { + return err + } + if err := proto.Unmarshal(message.Msg, &c.signedDeviceCertificate); err != nil { + return err + } + c.privacyMode = true + return nil +} + +func (c *CDM) GetServiceCertificate() *SignedDeviceCertificate { + + return &c.signedDeviceCertificate +} + +// Generates the license request data. This is sent to the license server via +// HTTP POST and the server in turn returns the license response. +func (c *CDM) GetLicenseRequest() ([]byte, error) { + var licenseRequest SignedLicenseRequest + licenseRequest.Msg = new(LicenseRequest) + licenseRequest.Msg.ContentId = new(LicenseRequest_ContentIdentification) + licenseRequest.Msg.ContentId.CencId = new(LicenseRequest_ContentIdentification_CENC) + + // this is probably really bad for the GC but protobuf uses pointers for optional + // fields so it is necessary and this is not a long running program + { + v := SignedLicenseRequest_LICENSE_REQUEST + licenseRequest.Type = &v + } + + licenseRequest.Msg.ContentId.CencId.Pssh = &c.widevineCencHeader + + { + v := LicenseType_DEFAULT + licenseRequest.Msg.ContentId.CencId.LicenseType = &v + } + + licenseRequest.Msg.ContentId.CencId.RequestId = c.sessionID[:] + + { + v := LicenseRequest_NEW + licenseRequest.Msg.Type = &v + } + + { + v := uint32(time.Now().Unix()) + licenseRequest.Msg.RequestTime = &v + } + + { + v := ProtocolVersion_CURRENT + licenseRequest.Msg.ProtocolVersion = &v + } + + { + v := uint32(frand.Uint64n(math.MaxUint32)) + licenseRequest.Msg.KeyControlNonce = &v + } + + if c.privacyMode { + pad := func(data []byte, blockSize int) []byte { + padlen := blockSize - (len(data) % blockSize) + if padlen == 0 { + padlen = blockSize + } + return append(data, bytes.Repeat([]byte{byte(padlen)}, padlen)...) + } + const blockSize = 16 + + var cidKey, cidIV [blockSize]byte + frand.Read(cidKey[:]) + frand.Read(cidIV[:]) + + block, err := aes.NewCipher(cidKey[:]) + if err != nil { + return nil, err + } + + paddedClientID := pad(c.clientID, blockSize) + encryptedClientID := make([]byte, len(paddedClientID)) + cipher.NewCBCEncrypter(block, cidIV[:]).CryptBlocks(encryptedClientID, paddedClientID) + + servicePublicKey, err := x509.ParsePKCS1PublicKey(c.signedDeviceCertificate.XDeviceCertificate.PublicKey) + if err != nil { + return nil, err + } + + encryptedCIDKey, err := rsa.EncryptOAEP(sha1.New(), frand.Reader, servicePublicKey, cidKey[:], nil) + if err != nil { + return nil, err + } + + licenseRequest.Msg.EncryptedClientId = new(EncryptedClientIdentification) + { + v := string(c.signedDeviceCertificate.XDeviceCertificate.ServiceId) + licenseRequest.Msg.EncryptedClientId.ServiceId = &v + } + licenseRequest.Msg.EncryptedClientId.ServiceCertificateSerialNumber = c.signedDeviceCertificate.XDeviceCertificate.SerialNumber + licenseRequest.Msg.EncryptedClientId.EncryptedClientId = encryptedClientID + licenseRequest.Msg.EncryptedClientId.EncryptedClientIdIv = cidIV[:] + licenseRequest.Msg.EncryptedClientId.EncryptedPrivacyKey = encryptedCIDKey + } else { + licenseRequest.Msg.ClientId = new(ClientIdentification) + if err := proto.Unmarshal(c.clientID, licenseRequest.Msg.ClientId); err != nil { + return nil, err + } + } + + { + data, err := proto.Marshal(licenseRequest.Msg) + if err != nil { + return nil, err + } + hash := sha1.Sum(data) + if licenseRequest.Signature, err = rsa.SignPSS(frand.Reader, c.privateKey, crypto.SHA1, hash[:], &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash}); err != nil { + return nil, err + } + } + + return proto.Marshal(&licenseRequest) +} + +// Retrieves the keys from the license response data. These keys can be +// used to decrypt the DASH-MP4. +func (c *CDM) GetLicenseKeys(licenseRequest []byte, licenseResponse []byte) (keys []Key, err error) { + var license SignedLicense + if err = proto.Unmarshal(licenseResponse, &license); err != nil { + return + } + + var licenseRequestParsed SignedLicenseRequest + if err = proto.Unmarshal(licenseRequest, &licenseRequestParsed); err != nil { + return + } + licenseRequestMsg, err := proto.Marshal(licenseRequestParsed.Msg) + if err != nil { + return + } + + sessionKey, err := rsa.DecryptOAEP(sha1.New(), frand.Reader, c.privateKey, license.SessionKey, nil) + if err != nil { + return + } + + sessionKeyBlock, err := aes.NewCipher(sessionKey) + if err != nil { + return + } + + encryptionKey := []byte{1, 'E', 'N', 'C', 'R', 'Y', 'P', 'T', 'I', 'O', 'N', 0} + encryptionKey = append(encryptionKey, licenseRequestMsg...) + encryptionKey = append(encryptionKey, []byte{0, 0, 0, 0x80}...) + encryptionKeyCmac, err := cmac.Sum(encryptionKey, sessionKeyBlock, sessionKeyBlock.BlockSize()) + if err != nil { + return + } + encryptionKeyCipher, err := aes.NewCipher(encryptionKeyCmac) + if err != nil { + return + } + + unpad := func(b []byte) []byte { + if len(b) == 0 { + return b + } + // pks padding is designed so that the value of all the padding bytes is + // the number of padding bytes repeated so to figure out how many + // padding bytes there are we can just look at the value of the last + // byte + // i.e if there are 6 padding bytes then it will look at like + // 0x6 0x6 0x6 0x6 0x6 0x6 + count := int(b[len(b)-1]) + return b[0 : len(b)-count] + } + for _, key := range license.Msg.Key { + decrypter := cipher.NewCBCDecrypter(encryptionKeyCipher, key.Iv) + decryptedKey := make([]byte, len(key.Key)) + decrypter.CryptBlocks(decryptedKey, key.Key) + keys = append(keys, Key{ + ID: key.Id, + Type: *key.Type, + Value: unpad(decryptedKey), + }) + } + + return +} diff --git a/utils/runv3/cdm/consts.go b/utils/runv3/cdm/consts.go new file mode 100644 index 0000000..dd927ce --- /dev/null +++ b/utils/runv3/cdm/consts.go @@ -0,0 +1,24 @@ +package wv + +import "encoding/base64" + +var DefaultPrivateKey string +var DefaultClientID []byte + +func InitConstants() { + + DefaultPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA2bO3yvFwNnIHsbDl3MTjKdDsiBWsuZWOGVxInFWAVMp+nffG\nYlquTKpJurEry95yprcRB3hYhvA5ghsACidcWPDEPVqqRZ7YXLevyUA+Sn2Jxpvt\nOcwyFHbSwruNxprWOkHCT774O4L/wJUt5x2C4iFCrJByjw0omN8u+EHdavvH7ZPn\nb3/EZp/cpZa9/+HOkutvBHBvaPp18F8JQhzUQ9MwLuDFTr+QLDB5+Y57Je2tNYDK\nxD1K+Ed5Ja0A4OKhPKIwPwPre0nt5scjLba3LSAKtKxiGqFtWO4U7Tf1YrdjJv2o\n9o8Sf8qcnbpzvQ4KwFqehuJnB7+W7mdJJw12PQIDAQABAoIBACE32wOMc6LbI3Fp\nnKljIYZv6qeZJxHqUBRukGXKZhqKC2fvNsYrMA1irn1eK2CgQL5PkLmjE18DqMLB\ne/AQsXagxlDWVMTqx/jdzmTW+KpFHZDAmiIHllypBN/R3oA/gBDDl/KzIQ1zn7Kz\nEJ4DUsVObe4G3HQXfepVo8Udx7tbB7X6wHe2kEgFyY3lPdvubik0C4t4ipSD79y7\nSfW7XVA5XUQmqN4U2kWM0uSwzd4BA7hqyScJsygf6KgpMWPS2xFZEZQRUpYcBH48\nE7YqNrrlYP3yaQ+9Jx56kKS0mvv3vUXS7AfUbU8CiHwD9I3BGwswEUueOGGVeXbx\ntFF8s8ECgYEA97BDcL/bt+r3qJF0dxtMB5ZngJbFx9RdsblYepVpblr2UfxnFttO\nPoNSKa4W36HuDsun49dkaoABJWdtZs2Hy6q+xvEgozvhMaBVE3spnWnzCT1yTMYL\nG02uDEl0dPiTg116bVElaswtqMXvnnpbOTMTe7Ig9sWiUW/GH9RM+N8CgYEA4QHb\n+OA0BfczbVQP9B+plt4mAuu4BDm4GPwq1yXOWo3Ct8Ik+HeY1hqOObpfyQMAza+E\ne/kP6W8vXpiElGrmiUbTXK4Rzmf+yYeOrvl3D80bFq4GtDNAIQD3jpj6zjlT+Gzw\nI501gRx5iPl4fSccRSdpoeri7F9ANtc6EEGFyGMCgYEAjMznWYXHGkL47BtbkIW0\n769BQSj0X4dKh8gsEusylugglDSeSbD7RrASGd175T7A/CorU2rTC3OesyubVlBJ\n/K4gaykRe5mDh1l0Y3GlE3XyEXObsSb3k1rSMOvkxsWz3X5bJR923MIaxpFWiMlX\naCmvzqZQ9NceUZrvjpJ5+xMCgYAJa8KCESEcftUwZqykVA8Nug9tX+E8jA4hPa2t\nhG+3augUOZTCsn87t7Dsydjo2a9W7Vpmtm7sHzOkik5CyJcOeGCxKLimI8SPO5XF\nzbwmdTgFIxQ0x1CQETJMTityJwRVCnqjgxmSZlbQXWGmG9UbMCNEHEmUDAjsQuaz\nd4racQKBgQDR1Y2kalvleYGrhwcA8LTnIh0rYEfAt9YxNmTi5qDKf5QPvUP2v+WO\nfSB5coUqR8LBweHE5V8JgFt74fdLBqZV/k2z/dI0r+EQWmpZ2uPEC0Khk/Sb9iRD\nfH7at3PMusrkwZCGZ8beFEAr6icXclV08nPCNGB6WckacfzpAj8Azg==\n-----END RSA PRIVATE KEY-----" + DefaultClientdIDBase64 := "CAESmgsK3QMIAhIQeeRrycR5oAnVvSCrdzFrTxivgsKlBiKOAjCCAQoCggEBANmzt8rxcDZyB7Gw5dzE4ynQ7IgVrLmVjhlcSJxVgFTKfp33xmJarkyqSbqxK8vecqa3EQd4WIbwOYIbAAonXFjwxD1aqkWe2Fy3r8lAPkp9icab7TnMMhR20sK7jcaa1jpBwk+++DuC/8CVLecdguIhQqyQco8NKJjfLvhB3Wr7x+2T529/xGaf3KWWvf/hzpLrbwRwb2j6dfBfCUIc1EPTMC7gxU6/kCwwefmOeyXtrTWAysQ9SvhHeSWtAODioTyiMD8D63tJ7ebHIy22ty0gCrSsYhqhbVjuFO039WK3Yyb9qPaPEn/KnJ26c70OCsBanobiZwe/lu5nSScNdj0CAwEAASjwIkgBUqoBCAEQABqBAQQZhh0LPs5wmuuobaJofVK1k0DjvnNhqvOMfGw0Zlzum4aTAvasMiyWfhjo/+xmHtsRvK3ek9EOdIB1e2c5azFuScAMS2n7ZGzqA8XBb+UPM46FUeGt7o1jDm/AysaZt4U6Ji8wXl41dWA9kF/iIK7uThSmb+mhspLLYo3AUiu2hiIgFm8idU4+UvSfVB4JveJ+hqeNbpYuNWkrxlbj9DDjWgYSgAIemDQcy+RKUwwGq59NhaxYSH3hxSHGCkhcXnjNC0OeV5gBdJQl7uqN90lkF3JxnlvYF3mhux7pZR5jii4KaNG6+vZXEq21irNMnoSxwIlzvpMov7xOvQWVm00K+xDkO20ncTC1ClXpmAAHyDXmMeTrzvCLo7tc3USbaImlIWAX92saZojzJ3n9gc+cjBKGqz2AgcsFCigSZ5vpLtz/wEk5PxIGKJ6OWjEy4D5HZG0p2MYyhM84fUh3TOfuexK1ceWrOfPxCbxSPRi9w0BEaDmixt/K4mIalUFTBJsWxtE6ww38UmFLktWoMM8+QLnhxe6jmuVpuchdLtnMPnkAs6XjGrQFCq4CCAESEGnj6Ji7LD+4o7MoHYT4jBQYjtW+kQUijgIwggEKAoIBAQDY9um1ifBRIOmkPtDZTqH+CZUBbb0eK0Cn3NHFf8MFUDzPEz+emK/OTub/hNxCJCao//pP5L8tRNUPFDrrvCBMo7Rn+iUb+mA/2yXiJ6ivqcN9Cu9i5qOU1ygon9SWZRsujFFB8nxVreY5Lzeq0283zn1Cg1stcX4tOHT7utPzFG/ReDFQt0O/GLlzVwB0d1sn3SKMO4XLjhZdncrtF9jljpg7xjMIlnWJUqxDo7TQkTytJmUl0kcM7bndBLerAdJFGaXc6oSY4eNy/IGDluLCQR3KZEQsy/mLeV1ggQ44MFr7XOM+rd+4/314q/deQbjHqjWFuVr8iIaKbq+R63ShAgMBAAEo8CISgAMii2Mw6z+Qs1bvvxGStie9tpcgoO2uAt5Zvv0CDXvrFlwnSbo+qR71Ru2IlZWVSbN5XYSIDwcwBzHjY8rNr3fgsXtSJty425djNQtF5+J2jrAhf3Q2m7EI5aohZGpD2E0cr+dVj9o8x0uJR2NWR8FVoVQSXZpad3M/4QzBLNto/tz+UKyZwa7Sc/eTQc2+ZcDS3ZEO3lGRsH864Kf/cEGvJRBBqcpJXKfG+ItqEW1AAPptjuggzmZEzRq5xTGf6or+bXrKjCpBS9G1SOyvCNF1k5z6lG8KsXhgQxL6ADHMoulxvUIihyPY5MpimdXfUdEQ5HA2EqNiNVNIO4qP007jW51yAeThOry4J22xs8RdkIClOGAauLIl0lLA4flMzW+VfQl5xYxP0E5tuhn0h+844DslU8ZF7U1dU2QprIApffXD9wgAACk26Rggy8e96z8i86/+YYyZQkc9hIdCAERrgEYCEbByzONrdRDs1MrS/ch1moV5pJv63BIKvQHGvLkaFgoMY29tcGFueV9uYW1lEgZHb29nbGUaIQoKbW9kZWxfbmFtZRITQU9TUCBvbiBJQSBFbXVsYXRvchoYChFhcmNoaXRlY3R1cmVfbmFtZRIDeDg2Gh4KC2RldmljZV9uYW1lEg9nZW5lcmljX3g4Nl9hcm0aIgoMcHJvZHVjdF9uYW1lEhJzZGtfZ3Bob25lX3g4Nl9hcm0aZAoKYnVpbGRfaW5mbxJWZ29vZ2xlL3Nka19ncGhvbmVfeDg2X2FybS9nZW5lcmljX3g4Nl9hcm06OS9QU1IxLjE4MDcyMC4xMjIvNjczNjc0Mjp1c2VyZGVidWcvZGV2LWtleXMaHgoUd2lkZXZpbmVfY2RtX3ZlcnNpb24SBjE0LjAuMBokCh9vZW1fY3J5cHRvX3NlY3VyaXR5X3BhdGNoX2xldmVsEgEwMg4QASAAKA0wAEAASABQAA==" + DefaultClientID, _ = base64.StdEncoding.DecodeString(DefaultClientdIDBase64) + + // DefaultPrivateKeyBuffer, err := ioutil.ReadFile("device_private_key") + // if err != nil { + // panic(err) + // } + // DefaultPrivateKey = string(DefaultPrivateKeyBuffer) + // + // DefaultClientID, err = ioutil.ReadFile("device_client_id_blob") + // if err != nil { + // panic(err) + // } +} diff --git a/utils/runv3/cdm/pssh.go b/utils/runv3/cdm/pssh.go new file mode 100644 index 0000000..a48852f --- /dev/null +++ b/utils/runv3/cdm/pssh.go @@ -0,0 +1,16 @@ +package wv + +import ( + "bytes" + "io" + "net/http" +) + +func GetCertData(client *http.Client, licenseURL string) ([]byte, error) { + response, err := client.Post(licenseURL, "application/x-www-form-urlencoded", bytes.NewReader([]byte{0x08, 0x04})) + if err != nil { + return nil, err + } + defer response.Body.Close() + return io.ReadAll(response.Body) +} diff --git a/utils/runv3/cdm/wv_proto2.pb.go b/utils/runv3/cdm/wv_proto2.pb.go new file mode 100644 index 0000000..dd2d5ac --- /dev/null +++ b/utils/runv3/cdm/wv_proto2.pb.go @@ -0,0 +1,5729 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0-devel +// protoc v3.12.4 +// source: wv_proto2.proto + +package wv + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// todo: fill (for this top-level type, it might be impossible/difficult) +type LicenseType int32 + +const ( + LicenseType_ZERO LicenseType = 0 + LicenseType_DEFAULT LicenseType = 1 // 1 is STREAMING/temporary license; on recent versions may go up to 3 (latest x86); it might be persist/don't persist type, unconfirmed + LicenseType_OFFLINE LicenseType = 2 +) + +// Enum value maps for LicenseType. +var ( + LicenseType_name = map[int32]string{ + 0: "ZERO", + 1: "DEFAULT", + 2: "OFFLINE", + } + LicenseType_value = map[string]int32{ + "ZERO": 0, + "DEFAULT": 1, + "OFFLINE": 2, + } +) + +func (x LicenseType) Enum() *LicenseType { + p := new(LicenseType) + *p = x + return p +} + +func (x LicenseType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LicenseType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[0].Descriptor() +} + +func (LicenseType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[0] +} + +func (x LicenseType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *LicenseType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = LicenseType(num) + return nil +} + +// Deprecated: Use LicenseType.Descriptor instead. +func (LicenseType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{0} +} + +// todo: fill (for this top-level type, it might be impossible/difficult) +// this is just a guess because these globals got lost, but really, do we need more? +type ProtocolVersion int32 + +const ( + ProtocolVersion_CURRENT ProtocolVersion = 21 // don't have symbols for this +) + +// Enum value maps for ProtocolVersion. +var ( + ProtocolVersion_name = map[int32]string{ + 21: "CURRENT", + } + ProtocolVersion_value = map[string]int32{ + "CURRENT": 21, + } +) + +func (x ProtocolVersion) Enum() *ProtocolVersion { + p := new(ProtocolVersion) + *p = x + return p +} + +func (x ProtocolVersion) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ProtocolVersion) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[1].Descriptor() +} + +func (ProtocolVersion) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[1] +} + +func (x ProtocolVersion) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ProtocolVersion) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ProtocolVersion(num) + return nil +} + +// Deprecated: Use ProtocolVersion.Descriptor instead. +func (ProtocolVersion) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{1} +} + +type ClientIdentification_TokenType int32 + +const ( + ClientIdentification_KEYBOX ClientIdentification_TokenType = 0 + ClientIdentification_DEVICE_CERTIFICATE ClientIdentification_TokenType = 1 + ClientIdentification_REMOTE_ATTESTATION_CERTIFICATE ClientIdentification_TokenType = 2 +) + +// Enum value maps for ClientIdentification_TokenType. +var ( + ClientIdentification_TokenType_name = map[int32]string{ + 0: "KEYBOX", + 1: "DEVICE_CERTIFICATE", + 2: "REMOTE_ATTESTATION_CERTIFICATE", + } + ClientIdentification_TokenType_value = map[string]int32{ + "KEYBOX": 0, + "DEVICE_CERTIFICATE": 1, + "REMOTE_ATTESTATION_CERTIFICATE": 2, + } +) + +func (x ClientIdentification_TokenType) Enum() *ClientIdentification_TokenType { + p := new(ClientIdentification_TokenType) + *p = x + return p +} + +func (x ClientIdentification_TokenType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ClientIdentification_TokenType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[2].Descriptor() +} + +func (ClientIdentification_TokenType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[2] +} + +func (x ClientIdentification_TokenType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ClientIdentification_TokenType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ClientIdentification_TokenType(num) + return nil +} + +// Deprecated: Use ClientIdentification_TokenType.Descriptor instead. +func (ClientIdentification_TokenType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{0, 0} +} + +type ClientIdentification_ClientCapabilities_HdcpVersion int32 + +const ( + ClientIdentification_ClientCapabilities_HDCP_NONE ClientIdentification_ClientCapabilities_HdcpVersion = 0 + ClientIdentification_ClientCapabilities_HDCP_V1 ClientIdentification_ClientCapabilities_HdcpVersion = 1 + ClientIdentification_ClientCapabilities_HDCP_V2 ClientIdentification_ClientCapabilities_HdcpVersion = 2 + ClientIdentification_ClientCapabilities_HDCP_V2_1 ClientIdentification_ClientCapabilities_HdcpVersion = 3 + ClientIdentification_ClientCapabilities_HDCP_V2_2 ClientIdentification_ClientCapabilities_HdcpVersion = 4 +) + +// Enum value maps for ClientIdentification_ClientCapabilities_HdcpVersion. +var ( + ClientIdentification_ClientCapabilities_HdcpVersion_name = map[int32]string{ + 0: "HDCP_NONE", + 1: "HDCP_V1", + 2: "HDCP_V2", + 3: "HDCP_V2_1", + 4: "HDCP_V2_2", + } + ClientIdentification_ClientCapabilities_HdcpVersion_value = map[string]int32{ + "HDCP_NONE": 0, + "HDCP_V1": 1, + "HDCP_V2": 2, + "HDCP_V2_1": 3, + "HDCP_V2_2": 4, + } +) + +func (x ClientIdentification_ClientCapabilities_HdcpVersion) Enum() *ClientIdentification_ClientCapabilities_HdcpVersion { + p := new(ClientIdentification_ClientCapabilities_HdcpVersion) + *p = x + return p +} + +func (x ClientIdentification_ClientCapabilities_HdcpVersion) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ClientIdentification_ClientCapabilities_HdcpVersion) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[3].Descriptor() +} + +func (ClientIdentification_ClientCapabilities_HdcpVersion) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[3] +} + +func (x ClientIdentification_ClientCapabilities_HdcpVersion) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ClientIdentification_ClientCapabilities_HdcpVersion) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ClientIdentification_ClientCapabilities_HdcpVersion(num) + return nil +} + +// Deprecated: Use ClientIdentification_ClientCapabilities_HdcpVersion.Descriptor instead. +func (ClientIdentification_ClientCapabilities_HdcpVersion) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{0, 1, 0} +} + +type DeviceCertificate_CertificateType int32 + +const ( + DeviceCertificate_ROOT DeviceCertificate_CertificateType = 0 + DeviceCertificate_INTERMEDIATE DeviceCertificate_CertificateType = 1 + DeviceCertificate_USER_DEVICE DeviceCertificate_CertificateType = 2 + DeviceCertificate_SERVICE DeviceCertificate_CertificateType = 3 +) + +// Enum value maps for DeviceCertificate_CertificateType. +var ( + DeviceCertificate_CertificateType_name = map[int32]string{ + 0: "ROOT", + 1: "INTERMEDIATE", + 2: "USER_DEVICE", + 3: "SERVICE", + } + DeviceCertificate_CertificateType_value = map[string]int32{ + "ROOT": 0, + "INTERMEDIATE": 1, + "USER_DEVICE": 2, + "SERVICE": 3, + } +) + +func (x DeviceCertificate_CertificateType) Enum() *DeviceCertificate_CertificateType { + p := new(DeviceCertificate_CertificateType) + *p = x + return p +} + +func (x DeviceCertificate_CertificateType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DeviceCertificate_CertificateType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[4].Descriptor() +} + +func (DeviceCertificate_CertificateType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[4] +} + +func (x DeviceCertificate_CertificateType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *DeviceCertificate_CertificateType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = DeviceCertificate_CertificateType(num) + return nil +} + +// Deprecated: Use DeviceCertificate_CertificateType.Descriptor instead. +func (DeviceCertificate_CertificateType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{1, 0} +} + +type DeviceCertificateStatus_CertificateStatus int32 + +const ( + DeviceCertificateStatus_VALID DeviceCertificateStatus_CertificateStatus = 0 + DeviceCertificateStatus_REVOKED DeviceCertificateStatus_CertificateStatus = 1 +) + +// Enum value maps for DeviceCertificateStatus_CertificateStatus. +var ( + DeviceCertificateStatus_CertificateStatus_name = map[int32]string{ + 0: "VALID", + 1: "REVOKED", + } + DeviceCertificateStatus_CertificateStatus_value = map[string]int32{ + "VALID": 0, + "REVOKED": 1, + } +) + +func (x DeviceCertificateStatus_CertificateStatus) Enum() *DeviceCertificateStatus_CertificateStatus { + p := new(DeviceCertificateStatus_CertificateStatus) + *p = x + return p +} + +func (x DeviceCertificateStatus_CertificateStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DeviceCertificateStatus_CertificateStatus) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[5].Descriptor() +} + +func (DeviceCertificateStatus_CertificateStatus) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[5] +} + +func (x DeviceCertificateStatus_CertificateStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *DeviceCertificateStatus_CertificateStatus) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = DeviceCertificateStatus_CertificateStatus(num) + return nil +} + +// Deprecated: Use DeviceCertificateStatus_CertificateStatus.Descriptor instead. +func (DeviceCertificateStatus_CertificateStatus) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{2, 0} +} + +type License_KeyContainer_KeyType int32 + +const ( + License_KeyContainer_SIGNING License_KeyContainer_KeyType = 1 + License_KeyContainer_CONTENT License_KeyContainer_KeyType = 2 + License_KeyContainer_KEY_CONTROL License_KeyContainer_KeyType = 3 + License_KeyContainer_OPERATOR_SESSION License_KeyContainer_KeyType = 4 +) + +// Enum value maps for License_KeyContainer_KeyType. +var ( + License_KeyContainer_KeyType_name = map[int32]string{ + 1: "SIGNING", + 2: "CONTENT", + 3: "KEY_CONTROL", + 4: "OPERATOR_SESSION", + } + License_KeyContainer_KeyType_value = map[string]int32{ + "SIGNING": 1, + "CONTENT": 2, + "KEY_CONTROL": 3, + "OPERATOR_SESSION": 4, + } +) + +func (x License_KeyContainer_KeyType) Enum() *License_KeyContainer_KeyType { + p := new(License_KeyContainer_KeyType) + *p = x + return p +} + +func (x License_KeyContainer_KeyType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (License_KeyContainer_KeyType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[6].Descriptor() +} + +func (License_KeyContainer_KeyType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[6] +} + +func (x License_KeyContainer_KeyType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *License_KeyContainer_KeyType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = License_KeyContainer_KeyType(num) + return nil +} + +// Deprecated: Use License_KeyContainer_KeyType.Descriptor instead. +func (License_KeyContainer_KeyType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6, 1, 0} +} + +type License_KeyContainer_SecurityLevel int32 + +const ( + License_KeyContainer_SW_SECURE_CRYPTO License_KeyContainer_SecurityLevel = 1 + License_KeyContainer_SW_SECURE_DECODE License_KeyContainer_SecurityLevel = 2 + License_KeyContainer_HW_SECURE_CRYPTO License_KeyContainer_SecurityLevel = 3 + License_KeyContainer_HW_SECURE_DECODE License_KeyContainer_SecurityLevel = 4 + License_KeyContainer_HW_SECURE_ALL License_KeyContainer_SecurityLevel = 5 +) + +// Enum value maps for License_KeyContainer_SecurityLevel. +var ( + License_KeyContainer_SecurityLevel_name = map[int32]string{ + 1: "SW_SECURE_CRYPTO", + 2: "SW_SECURE_DECODE", + 3: "HW_SECURE_CRYPTO", + 4: "HW_SECURE_DECODE", + 5: "HW_SECURE_ALL", + } + License_KeyContainer_SecurityLevel_value = map[string]int32{ + "SW_SECURE_CRYPTO": 1, + "SW_SECURE_DECODE": 2, + "HW_SECURE_CRYPTO": 3, + "HW_SECURE_DECODE": 4, + "HW_SECURE_ALL": 5, + } +) + +func (x License_KeyContainer_SecurityLevel) Enum() *License_KeyContainer_SecurityLevel { + p := new(License_KeyContainer_SecurityLevel) + *p = x + return p +} + +func (x License_KeyContainer_SecurityLevel) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (License_KeyContainer_SecurityLevel) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[7].Descriptor() +} + +func (License_KeyContainer_SecurityLevel) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[7] +} + +func (x License_KeyContainer_SecurityLevel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *License_KeyContainer_SecurityLevel) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = License_KeyContainer_SecurityLevel(num) + return nil +} + +// Deprecated: Use License_KeyContainer_SecurityLevel.Descriptor instead. +func (License_KeyContainer_SecurityLevel) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6, 1, 1} +} + +type License_KeyContainer_OutputProtection_CGMS int32 + +const ( + License_KeyContainer_OutputProtection_COPY_FREE License_KeyContainer_OutputProtection_CGMS = 0 + License_KeyContainer_OutputProtection_COPY_ONCE License_KeyContainer_OutputProtection_CGMS = 2 + License_KeyContainer_OutputProtection_COPY_NEVER License_KeyContainer_OutputProtection_CGMS = 3 + License_KeyContainer_OutputProtection_CGMS_NONE License_KeyContainer_OutputProtection_CGMS = 42 // PC default! +) + +// Enum value maps for License_KeyContainer_OutputProtection_CGMS. +var ( + License_KeyContainer_OutputProtection_CGMS_name = map[int32]string{ + 0: "COPY_FREE", + 2: "COPY_ONCE", + 3: "COPY_NEVER", + 42: "CGMS_NONE", + } + License_KeyContainer_OutputProtection_CGMS_value = map[string]int32{ + "COPY_FREE": 0, + "COPY_ONCE": 2, + "COPY_NEVER": 3, + "CGMS_NONE": 42, + } +) + +func (x License_KeyContainer_OutputProtection_CGMS) Enum() *License_KeyContainer_OutputProtection_CGMS { + p := new(License_KeyContainer_OutputProtection_CGMS) + *p = x + return p +} + +func (x License_KeyContainer_OutputProtection_CGMS) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (License_KeyContainer_OutputProtection_CGMS) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[8].Descriptor() +} + +func (License_KeyContainer_OutputProtection_CGMS) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[8] +} + +func (x License_KeyContainer_OutputProtection_CGMS) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *License_KeyContainer_OutputProtection_CGMS) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = License_KeyContainer_OutputProtection_CGMS(num) + return nil +} + +// Deprecated: Use License_KeyContainer_OutputProtection_CGMS.Descriptor instead. +func (License_KeyContainer_OutputProtection_CGMS) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6, 1, 0, 0} +} + +type LicenseError_Error int32 + +const ( + LicenseError_INVALID_DEVICE_CERTIFICATE LicenseError_Error = 1 + LicenseError_REVOKED_DEVICE_CERTIFICATE LicenseError_Error = 2 + LicenseError_SERVICE_UNAVAILABLE LicenseError_Error = 3 +) + +// Enum value maps for LicenseError_Error. +var ( + LicenseError_Error_name = map[int32]string{ + 1: "INVALID_DEVICE_CERTIFICATE", + 2: "REVOKED_DEVICE_CERTIFICATE", + 3: "SERVICE_UNAVAILABLE", + } + LicenseError_Error_value = map[string]int32{ + "INVALID_DEVICE_CERTIFICATE": 1, + "REVOKED_DEVICE_CERTIFICATE": 2, + "SERVICE_UNAVAILABLE": 3, + } +) + +func (x LicenseError_Error) Enum() *LicenseError_Error { + p := new(LicenseError_Error) + *p = x + return p +} + +func (x LicenseError_Error) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LicenseError_Error) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[9].Descriptor() +} + +func (LicenseError_Error) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[9] +} + +func (x LicenseError_Error) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *LicenseError_Error) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = LicenseError_Error(num) + return nil +} + +// Deprecated: Use LicenseError_Error.Descriptor instead. +func (LicenseError_Error) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{7, 0} +} + +type LicenseRequest_RequestType int32 + +const ( + LicenseRequest_NEW LicenseRequest_RequestType = 1 + LicenseRequest_RENEWAL LicenseRequest_RequestType = 2 + LicenseRequest_RELEASE LicenseRequest_RequestType = 3 +) + +// Enum value maps for LicenseRequest_RequestType. +var ( + LicenseRequest_RequestType_name = map[int32]string{ + 1: "NEW", + 2: "RENEWAL", + 3: "RELEASE", + } + LicenseRequest_RequestType_value = map[string]int32{ + "NEW": 1, + "RENEWAL": 2, + "RELEASE": 3, + } +) + +func (x LicenseRequest_RequestType) Enum() *LicenseRequest_RequestType { + p := new(LicenseRequest_RequestType) + *p = x + return p +} + +func (x LicenseRequest_RequestType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LicenseRequest_RequestType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[10].Descriptor() +} + +func (LicenseRequest_RequestType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[10] +} + +func (x LicenseRequest_RequestType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *LicenseRequest_RequestType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = LicenseRequest_RequestType(num) + return nil +} + +// Deprecated: Use LicenseRequest_RequestType.Descriptor instead. +func (LicenseRequest_RequestType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{8, 0} +} + +type LicenseRequestRaw_RequestType int32 + +const ( + LicenseRequestRaw_NEW LicenseRequestRaw_RequestType = 1 + LicenseRequestRaw_RENEWAL LicenseRequestRaw_RequestType = 2 + LicenseRequestRaw_RELEASE LicenseRequestRaw_RequestType = 3 +) + +// Enum value maps for LicenseRequestRaw_RequestType. +var ( + LicenseRequestRaw_RequestType_name = map[int32]string{ + 1: "NEW", + 2: "RENEWAL", + 3: "RELEASE", + } + LicenseRequestRaw_RequestType_value = map[string]int32{ + "NEW": 1, + "RENEWAL": 2, + "RELEASE": 3, + } +) + +func (x LicenseRequestRaw_RequestType) Enum() *LicenseRequestRaw_RequestType { + p := new(LicenseRequestRaw_RequestType) + *p = x + return p +} + +func (x LicenseRequestRaw_RequestType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LicenseRequestRaw_RequestType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[11].Descriptor() +} + +func (LicenseRequestRaw_RequestType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[11] +} + +func (x LicenseRequestRaw_RequestType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *LicenseRequestRaw_RequestType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = LicenseRequestRaw_RequestType(num) + return nil +} + +// Deprecated: Use LicenseRequestRaw_RequestType.Descriptor instead. +func (LicenseRequestRaw_RequestType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{9, 0} +} + +type ProvisionedDeviceInfo_WvSecurityLevel int32 + +const ( + ProvisionedDeviceInfo_LEVEL_UNSPECIFIED ProvisionedDeviceInfo_WvSecurityLevel = 0 + ProvisionedDeviceInfo_LEVEL_1 ProvisionedDeviceInfo_WvSecurityLevel = 1 + ProvisionedDeviceInfo_LEVEL_2 ProvisionedDeviceInfo_WvSecurityLevel = 2 + ProvisionedDeviceInfo_LEVEL_3 ProvisionedDeviceInfo_WvSecurityLevel = 3 +) + +// Enum value maps for ProvisionedDeviceInfo_WvSecurityLevel. +var ( + ProvisionedDeviceInfo_WvSecurityLevel_name = map[int32]string{ + 0: "LEVEL_UNSPECIFIED", + 1: "LEVEL_1", + 2: "LEVEL_2", + 3: "LEVEL_3", + } + ProvisionedDeviceInfo_WvSecurityLevel_value = map[string]int32{ + "LEVEL_UNSPECIFIED": 0, + "LEVEL_1": 1, + "LEVEL_2": 2, + "LEVEL_3": 3, + } +) + +func (x ProvisionedDeviceInfo_WvSecurityLevel) Enum() *ProvisionedDeviceInfo_WvSecurityLevel { + p := new(ProvisionedDeviceInfo_WvSecurityLevel) + *p = x + return p +} + +func (x ProvisionedDeviceInfo_WvSecurityLevel) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ProvisionedDeviceInfo_WvSecurityLevel) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[12].Descriptor() +} + +func (ProvisionedDeviceInfo_WvSecurityLevel) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[12] +} + +func (x ProvisionedDeviceInfo_WvSecurityLevel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *ProvisionedDeviceInfo_WvSecurityLevel) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = ProvisionedDeviceInfo_WvSecurityLevel(num) + return nil +} + +// Deprecated: Use ProvisionedDeviceInfo_WvSecurityLevel.Descriptor instead. +func (ProvisionedDeviceInfo_WvSecurityLevel) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{10, 0} +} + +type SignedMessage_MessageType int32 + +const ( + SignedMessage_LICENSE_REQUEST SignedMessage_MessageType = 1 + SignedMessage_LICENSE SignedMessage_MessageType = 2 + SignedMessage_ERROR_RESPONSE SignedMessage_MessageType = 3 + SignedMessage_SERVICE_CERTIFICATE_REQUEST SignedMessage_MessageType = 4 + SignedMessage_SERVICE_CERTIFICATE SignedMessage_MessageType = 5 +) + +// Enum value maps for SignedMessage_MessageType. +var ( + SignedMessage_MessageType_name = map[int32]string{ + 1: "LICENSE_REQUEST", + 2: "LICENSE", + 3: "ERROR_RESPONSE", + 4: "SERVICE_CERTIFICATE_REQUEST", + 5: "SERVICE_CERTIFICATE", + } + SignedMessage_MessageType_value = map[string]int32{ + "LICENSE_REQUEST": 1, + "LICENSE": 2, + "ERROR_RESPONSE": 3, + "SERVICE_CERTIFICATE_REQUEST": 4, + "SERVICE_CERTIFICATE": 5, + } +) + +func (x SignedMessage_MessageType) Enum() *SignedMessage_MessageType { + p := new(SignedMessage_MessageType) + *p = x + return p +} + +func (x SignedMessage_MessageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SignedMessage_MessageType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[13].Descriptor() +} + +func (SignedMessage_MessageType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[13] +} + +func (x SignedMessage_MessageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *SignedMessage_MessageType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = SignedMessage_MessageType(num) + return nil +} + +// Deprecated: Use SignedMessage_MessageType.Descriptor instead. +func (SignedMessage_MessageType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{20, 0} +} + +type WidevineCencHeader_Algorithm int32 + +const ( + WidevineCencHeader_UNENCRYPTED WidevineCencHeader_Algorithm = 0 + WidevineCencHeader_AESCTR WidevineCencHeader_Algorithm = 1 +) + +// Enum value maps for WidevineCencHeader_Algorithm. +var ( + WidevineCencHeader_Algorithm_name = map[int32]string{ + 0: "UNENCRYPTED", + 1: "AESCTR", + } + WidevineCencHeader_Algorithm_value = map[string]int32{ + "UNENCRYPTED": 0, + "AESCTR": 1, + } +) + +func (x WidevineCencHeader_Algorithm) Enum() *WidevineCencHeader_Algorithm { + p := new(WidevineCencHeader_Algorithm) + *p = x + return p +} + +func (x WidevineCencHeader_Algorithm) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (WidevineCencHeader_Algorithm) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[14].Descriptor() +} + +func (WidevineCencHeader_Algorithm) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[14] +} + +func (x WidevineCencHeader_Algorithm) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *WidevineCencHeader_Algorithm) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = WidevineCencHeader_Algorithm(num) + return nil +} + +// Deprecated: Use WidevineCencHeader_Algorithm.Descriptor instead. +func (WidevineCencHeader_Algorithm) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{21, 0} +} + +type SignedLicenseRequest_MessageType int32 + +const ( + SignedLicenseRequest_LICENSE_REQUEST SignedLicenseRequest_MessageType = 1 + SignedLicenseRequest_LICENSE SignedLicenseRequest_MessageType = 2 + SignedLicenseRequest_ERROR_RESPONSE SignedLicenseRequest_MessageType = 3 + SignedLicenseRequest_SERVICE_CERTIFICATE_REQUEST SignedLicenseRequest_MessageType = 4 + SignedLicenseRequest_SERVICE_CERTIFICATE SignedLicenseRequest_MessageType = 5 +) + +// Enum value maps for SignedLicenseRequest_MessageType. +var ( + SignedLicenseRequest_MessageType_name = map[int32]string{ + 1: "LICENSE_REQUEST", + 2: "LICENSE", + 3: "ERROR_RESPONSE", + 4: "SERVICE_CERTIFICATE_REQUEST", + 5: "SERVICE_CERTIFICATE", + } + SignedLicenseRequest_MessageType_value = map[string]int32{ + "LICENSE_REQUEST": 1, + "LICENSE": 2, + "ERROR_RESPONSE": 3, + "SERVICE_CERTIFICATE_REQUEST": 4, + "SERVICE_CERTIFICATE": 5, + } +) + +func (x SignedLicenseRequest_MessageType) Enum() *SignedLicenseRequest_MessageType { + p := new(SignedLicenseRequest_MessageType) + *p = x + return p +} + +func (x SignedLicenseRequest_MessageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SignedLicenseRequest_MessageType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[15].Descriptor() +} + +func (SignedLicenseRequest_MessageType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[15] +} + +func (x SignedLicenseRequest_MessageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *SignedLicenseRequest_MessageType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = SignedLicenseRequest_MessageType(num) + return nil +} + +// Deprecated: Use SignedLicenseRequest_MessageType.Descriptor instead. +func (SignedLicenseRequest_MessageType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{22, 0} +} + +type SignedLicenseRequestRaw_MessageType int32 + +const ( + SignedLicenseRequestRaw_LICENSE_REQUEST SignedLicenseRequestRaw_MessageType = 1 + SignedLicenseRequestRaw_LICENSE SignedLicenseRequestRaw_MessageType = 2 + SignedLicenseRequestRaw_ERROR_RESPONSE SignedLicenseRequestRaw_MessageType = 3 + SignedLicenseRequestRaw_SERVICE_CERTIFICATE_REQUEST SignedLicenseRequestRaw_MessageType = 4 + SignedLicenseRequestRaw_SERVICE_CERTIFICATE SignedLicenseRequestRaw_MessageType = 5 +) + +// Enum value maps for SignedLicenseRequestRaw_MessageType. +var ( + SignedLicenseRequestRaw_MessageType_name = map[int32]string{ + 1: "LICENSE_REQUEST", + 2: "LICENSE", + 3: "ERROR_RESPONSE", + 4: "SERVICE_CERTIFICATE_REQUEST", + 5: "SERVICE_CERTIFICATE", + } + SignedLicenseRequestRaw_MessageType_value = map[string]int32{ + "LICENSE_REQUEST": 1, + "LICENSE": 2, + "ERROR_RESPONSE": 3, + "SERVICE_CERTIFICATE_REQUEST": 4, + "SERVICE_CERTIFICATE": 5, + } +) + +func (x SignedLicenseRequestRaw_MessageType) Enum() *SignedLicenseRequestRaw_MessageType { + p := new(SignedLicenseRequestRaw_MessageType) + *p = x + return p +} + +func (x SignedLicenseRequestRaw_MessageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SignedLicenseRequestRaw_MessageType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[16].Descriptor() +} + +func (SignedLicenseRequestRaw_MessageType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[16] +} + +func (x SignedLicenseRequestRaw_MessageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *SignedLicenseRequestRaw_MessageType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = SignedLicenseRequestRaw_MessageType(num) + return nil +} + +// Deprecated: Use SignedLicenseRequestRaw_MessageType.Descriptor instead. +func (SignedLicenseRequestRaw_MessageType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{23, 0} +} + +type SignedLicense_MessageType int32 + +const ( + SignedLicense_LICENSE_REQUEST SignedLicense_MessageType = 1 + SignedLicense_LICENSE SignedLicense_MessageType = 2 + SignedLicense_ERROR_RESPONSE SignedLicense_MessageType = 3 + SignedLicense_SERVICE_CERTIFICATE_REQUEST SignedLicense_MessageType = 4 + SignedLicense_SERVICE_CERTIFICATE SignedLicense_MessageType = 5 +) + +// Enum value maps for SignedLicense_MessageType. +var ( + SignedLicense_MessageType_name = map[int32]string{ + 1: "LICENSE_REQUEST", + 2: "LICENSE", + 3: "ERROR_RESPONSE", + 4: "SERVICE_CERTIFICATE_REQUEST", + 5: "SERVICE_CERTIFICATE", + } + SignedLicense_MessageType_value = map[string]int32{ + "LICENSE_REQUEST": 1, + "LICENSE": 2, + "ERROR_RESPONSE": 3, + "SERVICE_CERTIFICATE_REQUEST": 4, + "SERVICE_CERTIFICATE": 5, + } +) + +func (x SignedLicense_MessageType) Enum() *SignedLicense_MessageType { + p := new(SignedLicense_MessageType) + *p = x + return p +} + +func (x SignedLicense_MessageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SignedLicense_MessageType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[17].Descriptor() +} + +func (SignedLicense_MessageType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[17] +} + +func (x SignedLicense_MessageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *SignedLicense_MessageType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = SignedLicense_MessageType(num) + return nil +} + +// Deprecated: Use SignedLicense_MessageType.Descriptor instead. +func (SignedLicense_MessageType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{24, 0} +} + +type SignedServiceCertificate_MessageType int32 + +const ( + SignedServiceCertificate_LICENSE_REQUEST SignedServiceCertificate_MessageType = 1 + SignedServiceCertificate_LICENSE SignedServiceCertificate_MessageType = 2 + SignedServiceCertificate_ERROR_RESPONSE SignedServiceCertificate_MessageType = 3 + SignedServiceCertificate_SERVICE_CERTIFICATE_REQUEST SignedServiceCertificate_MessageType = 4 + SignedServiceCertificate_SERVICE_CERTIFICATE SignedServiceCertificate_MessageType = 5 +) + +// Enum value maps for SignedServiceCertificate_MessageType. +var ( + SignedServiceCertificate_MessageType_name = map[int32]string{ + 1: "LICENSE_REQUEST", + 2: "LICENSE", + 3: "ERROR_RESPONSE", + 4: "SERVICE_CERTIFICATE_REQUEST", + 5: "SERVICE_CERTIFICATE", + } + SignedServiceCertificate_MessageType_value = map[string]int32{ + "LICENSE_REQUEST": 1, + "LICENSE": 2, + "ERROR_RESPONSE": 3, + "SERVICE_CERTIFICATE_REQUEST": 4, + "SERVICE_CERTIFICATE": 5, + } +) + +func (x SignedServiceCertificate_MessageType) Enum() *SignedServiceCertificate_MessageType { + p := new(SignedServiceCertificate_MessageType) + *p = x + return p +} + +func (x SignedServiceCertificate_MessageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SignedServiceCertificate_MessageType) Descriptor() protoreflect.EnumDescriptor { + return file_wv_proto2_proto_enumTypes[18].Descriptor() +} + +func (SignedServiceCertificate_MessageType) Type() protoreflect.EnumType { + return &file_wv_proto2_proto_enumTypes[18] +} + +func (x SignedServiceCertificate_MessageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *SignedServiceCertificate_MessageType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = SignedServiceCertificate_MessageType(num) + return nil +} + +// Deprecated: Use SignedServiceCertificate_MessageType.Descriptor instead. +func (SignedServiceCertificate_MessageType) EnumDescriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{25, 0} +} + +// from x86 (partial), most of it from the ARM version: +type ClientIdentification struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *ClientIdentification_TokenType `protobuf:"varint,1,req,name=Type,enum=ClientIdentification_TokenType" json:"Type,omitempty"` + //optional bytes Token = 2; // by default the client treats this as blob, but it's usually a DeviceCertificate, so for usefulness sake, I'm replacing it with this one: + Token *SignedDeviceCertificate `protobuf:"bytes,2,opt,name=Token" json:"Token,omitempty"` // use this when parsing, "bytes" when building a client id blob + ClientInfo []*ClientIdentification_NameValue `protobuf:"bytes,3,rep,name=ClientInfo" json:"ClientInfo,omitempty"` + ProviderClientToken []byte `protobuf:"bytes,4,opt,name=ProviderClientToken" json:"ProviderClientToken,omitempty"` + LicenseCounter *uint32 `protobuf:"varint,5,opt,name=LicenseCounter" json:"LicenseCounter,omitempty"` + XClientCapabilities *ClientIdentification_ClientCapabilities `protobuf:"bytes,6,opt,name=_ClientCapabilities,json=ClientCapabilities" json:"_ClientCapabilities,omitempty"` // how should we deal with duped names? will have to look at proto docs later + XFileHashes *FileHashes `protobuf:"bytes,7,opt,name=_FileHashes,json=FileHashes" json:"_FileHashes,omitempty"` // vmp blob goes here +} + +func (x *ClientIdentification) Reset() { + *x = ClientIdentification{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientIdentification) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientIdentification) ProtoMessage() {} + +func (x *ClientIdentification) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientIdentification.ProtoReflect.Descriptor instead. +func (*ClientIdentification) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{0} +} + +func (x *ClientIdentification) GetType() ClientIdentification_TokenType { + if x != nil && x.Type != nil { + return *x.Type + } + return ClientIdentification_KEYBOX +} + +func (x *ClientIdentification) GetToken() *SignedDeviceCertificate { + if x != nil { + return x.Token + } + return nil +} + +func (x *ClientIdentification) GetClientInfo() []*ClientIdentification_NameValue { + if x != nil { + return x.ClientInfo + } + return nil +} + +func (x *ClientIdentification) GetProviderClientToken() []byte { + if x != nil { + return x.ProviderClientToken + } + return nil +} + +func (x *ClientIdentification) GetLicenseCounter() uint32 { + if x != nil && x.LicenseCounter != nil { + return *x.LicenseCounter + } + return 0 +} + +func (x *ClientIdentification) GetXClientCapabilities() *ClientIdentification_ClientCapabilities { + if x != nil { + return x.XClientCapabilities + } + return nil +} + +func (x *ClientIdentification) GetXFileHashes() *FileHashes { + if x != nil { + return x.XFileHashes + } + return nil +} + +type DeviceCertificate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *DeviceCertificate_CertificateType `protobuf:"varint,1,req,name=Type,enum=DeviceCertificate_CertificateType" json:"Type,omitempty"` // the compiled code reused this as ProvisionedDeviceInfo.WvSecurityLevel, however that is incorrect (compiler aliased it as they're both identical as a structure) + SerialNumber []byte `protobuf:"bytes,2,opt,name=SerialNumber" json:"SerialNumber,omitempty"` + CreationTimeSeconds *uint32 `protobuf:"varint,3,opt,name=CreationTimeSeconds" json:"CreationTimeSeconds,omitempty"` + PublicKey []byte `protobuf:"bytes,4,opt,name=PublicKey" json:"PublicKey,omitempty"` + SystemId *uint32 `protobuf:"varint,5,opt,name=SystemId" json:"SystemId,omitempty"` + TestDeviceDeprecated *uint32 `protobuf:"varint,6,opt,name=TestDeviceDeprecated" json:"TestDeviceDeprecated,omitempty"` // is it bool or int? + ServiceId []byte `protobuf:"bytes,7,opt,name=ServiceId" json:"ServiceId,omitempty"` // service URL for service certificates +} + +func (x *DeviceCertificate) Reset() { + *x = DeviceCertificate{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeviceCertificate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeviceCertificate) ProtoMessage() {} + +func (x *DeviceCertificate) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeviceCertificate.ProtoReflect.Descriptor instead. +func (*DeviceCertificate) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{1} +} + +func (x *DeviceCertificate) GetType() DeviceCertificate_CertificateType { + if x != nil && x.Type != nil { + return *x.Type + } + return DeviceCertificate_ROOT +} + +func (x *DeviceCertificate) GetSerialNumber() []byte { + if x != nil { + return x.SerialNumber + } + return nil +} + +func (x *DeviceCertificate) GetCreationTimeSeconds() uint32 { + if x != nil && x.CreationTimeSeconds != nil { + return *x.CreationTimeSeconds + } + return 0 +} + +func (x *DeviceCertificate) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *DeviceCertificate) GetSystemId() uint32 { + if x != nil && x.SystemId != nil { + return *x.SystemId + } + return 0 +} + +func (x *DeviceCertificate) GetTestDeviceDeprecated() uint32 { + if x != nil && x.TestDeviceDeprecated != nil { + return *x.TestDeviceDeprecated + } + return 0 +} + +func (x *DeviceCertificate) GetServiceId() []byte { + if x != nil { + return x.ServiceId + } + return nil +} + +// missing some references, +type DeviceCertificateStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SerialNumber []byte `protobuf:"bytes,1,opt,name=SerialNumber" json:"SerialNumber,omitempty"` + Status *DeviceCertificateStatus_CertificateStatus `protobuf:"varint,2,opt,name=Status,enum=DeviceCertificateStatus_CertificateStatus" json:"Status,omitempty"` + DeviceInfo *ProvisionedDeviceInfo `protobuf:"bytes,4,opt,name=DeviceInfo" json:"DeviceInfo,omitempty"` // where is 3? is it deprecated? +} + +func (x *DeviceCertificateStatus) Reset() { + *x = DeviceCertificateStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeviceCertificateStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeviceCertificateStatus) ProtoMessage() {} + +func (x *DeviceCertificateStatus) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeviceCertificateStatus.ProtoReflect.Descriptor instead. +func (*DeviceCertificateStatus) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{2} +} + +func (x *DeviceCertificateStatus) GetSerialNumber() []byte { + if x != nil { + return x.SerialNumber + } + return nil +} + +func (x *DeviceCertificateStatus) GetStatus() DeviceCertificateStatus_CertificateStatus { + if x != nil && x.Status != nil { + return *x.Status + } + return DeviceCertificateStatus_VALID +} + +func (x *DeviceCertificateStatus) GetDeviceInfo() *ProvisionedDeviceInfo { + if x != nil { + return x.DeviceInfo + } + return nil +} + +type DeviceCertificateStatusList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CreationTimeSeconds *uint32 `protobuf:"varint,1,opt,name=CreationTimeSeconds" json:"CreationTimeSeconds,omitempty"` + CertificateStatus []*DeviceCertificateStatus `protobuf:"bytes,2,rep,name=CertificateStatus" json:"CertificateStatus,omitempty"` +} + +func (x *DeviceCertificateStatusList) Reset() { + *x = DeviceCertificateStatusList{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeviceCertificateStatusList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeviceCertificateStatusList) ProtoMessage() {} + +func (x *DeviceCertificateStatusList) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeviceCertificateStatusList.ProtoReflect.Descriptor instead. +func (*DeviceCertificateStatusList) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{3} +} + +func (x *DeviceCertificateStatusList) GetCreationTimeSeconds() uint32 { + if x != nil && x.CreationTimeSeconds != nil { + return *x.CreationTimeSeconds + } + return 0 +} + +func (x *DeviceCertificateStatusList) GetCertificateStatus() []*DeviceCertificateStatus { + if x != nil { + return x.CertificateStatus + } + return nil +} + +type EncryptedClientIdentification struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ServiceId *string `protobuf:"bytes,1,req,name=ServiceId" json:"ServiceId,omitempty"` + ServiceCertificateSerialNumber []byte `protobuf:"bytes,2,opt,name=ServiceCertificateSerialNumber" json:"ServiceCertificateSerialNumber,omitempty"` + EncryptedClientId []byte `protobuf:"bytes,3,req,name=EncryptedClientId" json:"EncryptedClientId,omitempty"` + EncryptedClientIdIv []byte `protobuf:"bytes,4,req,name=EncryptedClientIdIv" json:"EncryptedClientIdIv,omitempty"` + EncryptedPrivacyKey []byte `protobuf:"bytes,5,req,name=EncryptedPrivacyKey" json:"EncryptedPrivacyKey,omitempty"` +} + +func (x *EncryptedClientIdentification) Reset() { + *x = EncryptedClientIdentification{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EncryptedClientIdentification) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EncryptedClientIdentification) ProtoMessage() {} + +func (x *EncryptedClientIdentification) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EncryptedClientIdentification.ProtoReflect.Descriptor instead. +func (*EncryptedClientIdentification) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{4} +} + +func (x *EncryptedClientIdentification) GetServiceId() string { + if x != nil && x.ServiceId != nil { + return *x.ServiceId + } + return "" +} + +func (x *EncryptedClientIdentification) GetServiceCertificateSerialNumber() []byte { + if x != nil { + return x.ServiceCertificateSerialNumber + } + return nil +} + +func (x *EncryptedClientIdentification) GetEncryptedClientId() []byte { + if x != nil { + return x.EncryptedClientId + } + return nil +} + +func (x *EncryptedClientIdentification) GetEncryptedClientIdIv() []byte { + if x != nil { + return x.EncryptedClientIdIv + } + return nil +} + +func (x *EncryptedClientIdentification) GetEncryptedPrivacyKey() []byte { + if x != nil { + return x.EncryptedPrivacyKey + } + return nil +} + +type LicenseIdentification struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RequestId []byte `protobuf:"bytes,1,opt,name=RequestId" json:"RequestId,omitempty"` + SessionId []byte `protobuf:"bytes,2,opt,name=SessionId" json:"SessionId,omitempty"` + PurchaseId []byte `protobuf:"bytes,3,opt,name=PurchaseId" json:"PurchaseId,omitempty"` + Type *LicenseType `protobuf:"varint,4,opt,name=Type,enum=LicenseType" json:"Type,omitempty"` + Version *uint32 `protobuf:"varint,5,opt,name=Version" json:"Version,omitempty"` + ProviderSessionToken []byte `protobuf:"bytes,6,opt,name=ProviderSessionToken" json:"ProviderSessionToken,omitempty"` +} + +func (x *LicenseIdentification) Reset() { + *x = LicenseIdentification{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseIdentification) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseIdentification) ProtoMessage() {} + +func (x *LicenseIdentification) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseIdentification.ProtoReflect.Descriptor instead. +func (*LicenseIdentification) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{5} +} + +func (x *LicenseIdentification) GetRequestId() []byte { + if x != nil { + return x.RequestId + } + return nil +} + +func (x *LicenseIdentification) GetSessionId() []byte { + if x != nil { + return x.SessionId + } + return nil +} + +func (x *LicenseIdentification) GetPurchaseId() []byte { + if x != nil { + return x.PurchaseId + } + return nil +} + +func (x *LicenseIdentification) GetType() LicenseType { + if x != nil && x.Type != nil { + return *x.Type + } + return LicenseType_ZERO +} + +func (x *LicenseIdentification) GetVersion() uint32 { + if x != nil && x.Version != nil { + return *x.Version + } + return 0 +} + +func (x *LicenseIdentification) GetProviderSessionToken() []byte { + if x != nil { + return x.ProviderSessionToken + } + return nil +} + +type License struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id *LicenseIdentification `protobuf:"bytes,1,opt,name=Id" json:"Id,omitempty"` + XPolicy *License_Policy `protobuf:"bytes,2,opt,name=_Policy,json=Policy" json:"_Policy,omitempty"` // duped names, etc + Key []*License_KeyContainer `protobuf:"bytes,3,rep,name=Key" json:"Key,omitempty"` + LicenseStartTime *uint32 `protobuf:"varint,4,opt,name=LicenseStartTime" json:"LicenseStartTime,omitempty"` + RemoteAttestationVerified *uint32 `protobuf:"varint,5,opt,name=RemoteAttestationVerified" json:"RemoteAttestationVerified,omitempty"` // bool? + ProviderClientToken []byte `protobuf:"bytes,6,opt,name=ProviderClientToken" json:"ProviderClientToken,omitempty"` + // there might be more, check with newer versions (I see field 7-8 in a lic) + // this appeared in latest x86: + ProtectionScheme *uint32 `protobuf:"varint,7,opt,name=ProtectionScheme" json:"ProtectionScheme,omitempty"` // type unconfirmed fully, but it's likely as WidevineCencHeader describesit (fourcc) +} + +func (x *License) Reset() { + *x = License{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *License) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License) ProtoMessage() {} + +func (x *License) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use License.ProtoReflect.Descriptor instead. +func (*License) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6} +} + +func (x *License) GetId() *LicenseIdentification { + if x != nil { + return x.Id + } + return nil +} + +func (x *License) GetXPolicy() *License_Policy { + if x != nil { + return x.XPolicy + } + return nil +} + +func (x *License) GetKey() []*License_KeyContainer { + if x != nil { + return x.Key + } + return nil +} + +func (x *License) GetLicenseStartTime() uint32 { + if x != nil && x.LicenseStartTime != nil { + return *x.LicenseStartTime + } + return 0 +} + +func (x *License) GetRemoteAttestationVerified() uint32 { + if x != nil && x.RemoteAttestationVerified != nil { + return *x.RemoteAttestationVerified + } + return 0 +} + +func (x *License) GetProviderClientToken() []byte { + if x != nil { + return x.ProviderClientToken + } + return nil +} + +func (x *License) GetProtectionScheme() uint32 { + if x != nil && x.ProtectionScheme != nil { + return *x.ProtectionScheme + } + return 0 +} + +type LicenseError struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + //LicenseRequest.RequestType ErrorCode; // clang mismatch + ErrorCode *LicenseError_Error `protobuf:"varint,1,opt,name=ErrorCode,enum=LicenseError_Error" json:"ErrorCode,omitempty"` +} + +func (x *LicenseError) Reset() { + *x = LicenseError{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseError) ProtoMessage() {} + +func (x *LicenseError) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseError.ProtoReflect.Descriptor instead. +func (*LicenseError) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{7} +} + +func (x *LicenseError) GetErrorCode() LicenseError_Error { + if x != nil && x.ErrorCode != nil { + return *x.ErrorCode + } + return LicenseError_INVALID_DEVICE_CERTIFICATE +} + +type LicenseRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientId *ClientIdentification `protobuf:"bytes,1,opt,name=ClientId" json:"ClientId,omitempty"` + ContentId *LicenseRequest_ContentIdentification `protobuf:"bytes,2,opt,name=ContentId" json:"ContentId,omitempty"` + Type *LicenseRequest_RequestType `protobuf:"varint,3,opt,name=Type,enum=LicenseRequest_RequestType" json:"Type,omitempty"` + RequestTime *uint32 `protobuf:"varint,4,opt,name=RequestTime" json:"RequestTime,omitempty"` + KeyControlNonceDeprecated []byte `protobuf:"bytes,5,opt,name=KeyControlNonceDeprecated" json:"KeyControlNonceDeprecated,omitempty"` + ProtocolVersion *ProtocolVersion `protobuf:"varint,6,opt,name=ProtocolVersion,enum=ProtocolVersion" json:"ProtocolVersion,omitempty"` // lacking symbols for this + KeyControlNonce *uint32 `protobuf:"varint,7,opt,name=KeyControlNonce" json:"KeyControlNonce,omitempty"` + EncryptedClientId *EncryptedClientIdentification `protobuf:"bytes,8,opt,name=EncryptedClientId" json:"EncryptedClientId,omitempty"` +} + +func (x *LicenseRequest) Reset() { + *x = LicenseRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequest) ProtoMessage() {} + +func (x *LicenseRequest) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequest.ProtoReflect.Descriptor instead. +func (*LicenseRequest) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{8} +} + +func (x *LicenseRequest) GetClientId() *ClientIdentification { + if x != nil { + return x.ClientId + } + return nil +} + +func (x *LicenseRequest) GetContentId() *LicenseRequest_ContentIdentification { + if x != nil { + return x.ContentId + } + return nil +} + +func (x *LicenseRequest) GetType() LicenseRequest_RequestType { + if x != nil && x.Type != nil { + return *x.Type + } + return LicenseRequest_NEW +} + +func (x *LicenseRequest) GetRequestTime() uint32 { + if x != nil && x.RequestTime != nil { + return *x.RequestTime + } + return 0 +} + +func (x *LicenseRequest) GetKeyControlNonceDeprecated() []byte { + if x != nil { + return x.KeyControlNonceDeprecated + } + return nil +} + +func (x *LicenseRequest) GetProtocolVersion() ProtocolVersion { + if x != nil && x.ProtocolVersion != nil { + return *x.ProtocolVersion + } + return ProtocolVersion_CURRENT +} + +func (x *LicenseRequest) GetKeyControlNonce() uint32 { + if x != nil && x.KeyControlNonce != nil { + return *x.KeyControlNonce + } + return 0 +} + +func (x *LicenseRequest) GetEncryptedClientId() *EncryptedClientIdentification { + if x != nil { + return x.EncryptedClientId + } + return nil +} + +// raw pssh hack +type LicenseRequestRaw struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientId *ClientIdentification `protobuf:"bytes,1,opt,name=ClientId" json:"ClientId,omitempty"` + ContentId *LicenseRequestRaw_ContentIdentification `protobuf:"bytes,2,opt,name=ContentId" json:"ContentId,omitempty"` + Type *LicenseRequestRaw_RequestType `protobuf:"varint,3,opt,name=Type,enum=LicenseRequestRaw_RequestType" json:"Type,omitempty"` + RequestTime *uint32 `protobuf:"varint,4,opt,name=RequestTime" json:"RequestTime,omitempty"` + KeyControlNonceDeprecated []byte `protobuf:"bytes,5,opt,name=KeyControlNonceDeprecated" json:"KeyControlNonceDeprecated,omitempty"` + ProtocolVersion *ProtocolVersion `protobuf:"varint,6,opt,name=ProtocolVersion,enum=ProtocolVersion" json:"ProtocolVersion,omitempty"` // lacking symbols for this + KeyControlNonce *uint32 `protobuf:"varint,7,opt,name=KeyControlNonce" json:"KeyControlNonce,omitempty"` + EncryptedClientId *EncryptedClientIdentification `protobuf:"bytes,8,opt,name=EncryptedClientId" json:"EncryptedClientId,omitempty"` +} + +func (x *LicenseRequestRaw) Reset() { + *x = LicenseRequestRaw{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequestRaw) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequestRaw) ProtoMessage() {} + +func (x *LicenseRequestRaw) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequestRaw.ProtoReflect.Descriptor instead. +func (*LicenseRequestRaw) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{9} +} + +func (x *LicenseRequestRaw) GetClientId() *ClientIdentification { + if x != nil { + return x.ClientId + } + return nil +} + +func (x *LicenseRequestRaw) GetContentId() *LicenseRequestRaw_ContentIdentification { + if x != nil { + return x.ContentId + } + return nil +} + +func (x *LicenseRequestRaw) GetType() LicenseRequestRaw_RequestType { + if x != nil && x.Type != nil { + return *x.Type + } + return LicenseRequestRaw_NEW +} + +func (x *LicenseRequestRaw) GetRequestTime() uint32 { + if x != nil && x.RequestTime != nil { + return *x.RequestTime + } + return 0 +} + +func (x *LicenseRequestRaw) GetKeyControlNonceDeprecated() []byte { + if x != nil { + return x.KeyControlNonceDeprecated + } + return nil +} + +func (x *LicenseRequestRaw) GetProtocolVersion() ProtocolVersion { + if x != nil && x.ProtocolVersion != nil { + return *x.ProtocolVersion + } + return ProtocolVersion_CURRENT +} + +func (x *LicenseRequestRaw) GetKeyControlNonce() uint32 { + if x != nil && x.KeyControlNonce != nil { + return *x.KeyControlNonce + } + return 0 +} + +func (x *LicenseRequestRaw) GetEncryptedClientId() *EncryptedClientIdentification { + if x != nil { + return x.EncryptedClientId + } + return nil +} + +type ProvisionedDeviceInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SystemId *uint32 `protobuf:"varint,1,opt,name=SystemId" json:"SystemId,omitempty"` + Soc *string `protobuf:"bytes,2,opt,name=Soc" json:"Soc,omitempty"` + Manufacturer *string `protobuf:"bytes,3,opt,name=Manufacturer" json:"Manufacturer,omitempty"` + Model *string `protobuf:"bytes,4,opt,name=Model" json:"Model,omitempty"` + DeviceType *string `protobuf:"bytes,5,opt,name=DeviceType" json:"DeviceType,omitempty"` + ModelYear *uint32 `protobuf:"varint,6,opt,name=ModelYear" json:"ModelYear,omitempty"` + SecurityLevel *ProvisionedDeviceInfo_WvSecurityLevel `protobuf:"varint,7,opt,name=SecurityLevel,enum=ProvisionedDeviceInfo_WvSecurityLevel" json:"SecurityLevel,omitempty"` + TestDevice *uint32 `protobuf:"varint,8,opt,name=TestDevice" json:"TestDevice,omitempty"` // bool? +} + +func (x *ProvisionedDeviceInfo) Reset() { + *x = ProvisionedDeviceInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisionedDeviceInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisionedDeviceInfo) ProtoMessage() {} + +func (x *ProvisionedDeviceInfo) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisionedDeviceInfo.ProtoReflect.Descriptor instead. +func (*ProvisionedDeviceInfo) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{10} +} + +func (x *ProvisionedDeviceInfo) GetSystemId() uint32 { + if x != nil && x.SystemId != nil { + return *x.SystemId + } + return 0 +} + +func (x *ProvisionedDeviceInfo) GetSoc() string { + if x != nil && x.Soc != nil { + return *x.Soc + } + return "" +} + +func (x *ProvisionedDeviceInfo) GetManufacturer() string { + if x != nil && x.Manufacturer != nil { + return *x.Manufacturer + } + return "" +} + +func (x *ProvisionedDeviceInfo) GetModel() string { + if x != nil && x.Model != nil { + return *x.Model + } + return "" +} + +func (x *ProvisionedDeviceInfo) GetDeviceType() string { + if x != nil && x.DeviceType != nil { + return *x.DeviceType + } + return "" +} + +func (x *ProvisionedDeviceInfo) GetModelYear() uint32 { + if x != nil && x.ModelYear != nil { + return *x.ModelYear + } + return 0 +} + +func (x *ProvisionedDeviceInfo) GetSecurityLevel() ProvisionedDeviceInfo_WvSecurityLevel { + if x != nil && x.SecurityLevel != nil { + return *x.SecurityLevel + } + return ProvisionedDeviceInfo_LEVEL_UNSPECIFIED +} + +func (x *ProvisionedDeviceInfo) GetTestDevice() uint32 { + if x != nil && x.TestDevice != nil { + return *x.TestDevice + } + return 0 +} + +// todo: fill +type ProvisioningOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ProvisioningOptions) Reset() { + *x = ProvisioningOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisioningOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisioningOptions) ProtoMessage() {} + +func (x *ProvisioningOptions) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisioningOptions.ProtoReflect.Descriptor instead. +func (*ProvisioningOptions) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{11} +} + +// todo: fill +type ProvisioningRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ProvisioningRequest) Reset() { + *x = ProvisioningRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisioningRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisioningRequest) ProtoMessage() {} + +func (x *ProvisioningRequest) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisioningRequest.ProtoReflect.Descriptor instead. +func (*ProvisioningRequest) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{12} +} + +// todo: fill +type ProvisioningResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ProvisioningResponse) Reset() { + *x = ProvisioningResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProvisioningResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProvisioningResponse) ProtoMessage() {} + +func (x *ProvisioningResponse) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProvisioningResponse.ProtoReflect.Descriptor instead. +func (*ProvisioningResponse) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{13} +} + +type RemoteAttestation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Certificate *EncryptedClientIdentification `protobuf:"bytes,1,opt,name=Certificate" json:"Certificate,omitempty"` + Salt *string `protobuf:"bytes,2,opt,name=Salt" json:"Salt,omitempty"` + Signature *string `protobuf:"bytes,3,opt,name=Signature" json:"Signature,omitempty"` +} + +func (x *RemoteAttestation) Reset() { + *x = RemoteAttestation{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RemoteAttestation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoteAttestation) ProtoMessage() {} + +func (x *RemoteAttestation) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RemoteAttestation.ProtoReflect.Descriptor instead. +func (*RemoteAttestation) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{14} +} + +func (x *RemoteAttestation) GetCertificate() *EncryptedClientIdentification { + if x != nil { + return x.Certificate + } + return nil +} + +func (x *RemoteAttestation) GetSalt() string { + if x != nil && x.Salt != nil { + return *x.Salt + } + return "" +} + +func (x *RemoteAttestation) GetSignature() string { + if x != nil && x.Signature != nil { + return *x.Signature + } + return "" +} + +// todo: fill +type SessionInit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SessionInit) Reset() { + *x = SessionInit{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SessionInit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SessionInit) ProtoMessage() {} + +func (x *SessionInit) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SessionInit.ProtoReflect.Descriptor instead. +func (*SessionInit) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{15} +} + +// todo: fill +type SessionState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SessionState) Reset() { + *x = SessionState{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SessionState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SessionState) ProtoMessage() {} + +func (x *SessionState) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SessionState.ProtoReflect.Descriptor instead. +func (*SessionState) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{16} +} + +// todo: fill +type SignedCertificateStatusList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SignedCertificateStatusList) Reset() { + *x = SignedCertificateStatusList{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedCertificateStatusList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedCertificateStatusList) ProtoMessage() {} + +func (x *SignedCertificateStatusList) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedCertificateStatusList.ProtoReflect.Descriptor instead. +func (*SignedCertificateStatusList) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{17} +} + +type SignedDeviceCertificate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + //optional bytes DeviceCertificate = 1; // again, they use a buffer where it's supposed to be a message, so we'll replace it with what it really is: + XDeviceCertificate *DeviceCertificate `protobuf:"bytes,1,opt,name=_DeviceCertificate,json=DeviceCertificate" json:"_DeviceCertificate,omitempty"` // how should we deal with duped names? will have to look at proto docs later + Signature []byte `protobuf:"bytes,2,opt,name=Signature" json:"Signature,omitempty"` + Signer *SignedDeviceCertificate `protobuf:"bytes,3,opt,name=Signer" json:"Signer,omitempty"` +} + +func (x *SignedDeviceCertificate) Reset() { + *x = SignedDeviceCertificate{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedDeviceCertificate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedDeviceCertificate) ProtoMessage() {} + +func (x *SignedDeviceCertificate) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedDeviceCertificate.ProtoReflect.Descriptor instead. +func (*SignedDeviceCertificate) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{18} +} + +func (x *SignedDeviceCertificate) GetXDeviceCertificate() *DeviceCertificate { + if x != nil { + return x.XDeviceCertificate + } + return nil +} + +func (x *SignedDeviceCertificate) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedDeviceCertificate) GetSigner() *SignedDeviceCertificate { + if x != nil { + return x.Signer + } + return nil +} + +// todo: fill +type SignedProvisioningMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SignedProvisioningMessage) Reset() { + *x = SignedProvisioningMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedProvisioningMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedProvisioningMessage) ProtoMessage() {} + +func (x *SignedProvisioningMessage) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedProvisioningMessage.ProtoReflect.Descriptor instead. +func (*SignedProvisioningMessage) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{19} +} + +// the root of all messages, from either server or client +type SignedMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *SignedMessage_MessageType `protobuf:"varint,1,opt,name=Type,enum=SignedMessage_MessageType" json:"Type,omitempty"` // has in incorrect overlap with License_KeyContainer_SecurityLevel + Msg []byte `protobuf:"bytes,2,opt,name=Msg" json:"Msg,omitempty"` // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + Signature []byte `protobuf:"bytes,3,opt,name=Signature" json:"Signature,omitempty"` // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + SessionKey []byte `protobuf:"bytes,4,opt,name=SessionKey" json:"SessionKey,omitempty"` // often RSA wrapped for licenses + RemoteAttestation *RemoteAttestation `protobuf:"bytes,5,opt,name=RemoteAttestation" json:"RemoteAttestation,omitempty"` +} + +func (x *SignedMessage) Reset() { + *x = SignedMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedMessage) ProtoMessage() {} + +func (x *SignedMessage) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedMessage.ProtoReflect.Descriptor instead. +func (*SignedMessage) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{20} +} + +func (x *SignedMessage) GetType() SignedMessage_MessageType { + if x != nil && x.Type != nil { + return *x.Type + } + return SignedMessage_LICENSE_REQUEST +} + +func (x *SignedMessage) GetMsg() []byte { + if x != nil { + return x.Msg + } + return nil +} + +func (x *SignedMessage) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedMessage) GetSessionKey() []byte { + if x != nil { + return x.SessionKey + } + return nil +} + +func (x *SignedMessage) GetRemoteAttestation() *RemoteAttestation { + if x != nil { + return x.RemoteAttestation + } + return nil +} + +// This message is copied from google's docs, not reversed: +type WidevineCencHeader struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Algorithm *WidevineCencHeader_Algorithm `protobuf:"varint,1,opt,name=algorithm,enum=WidevineCencHeader_Algorithm" json:"algorithm,omitempty"` + KeyId [][]byte `protobuf:"bytes,2,rep,name=key_id,json=keyId" json:"key_id,omitempty"` + // Content provider name. + Provider *string `protobuf:"bytes,3,opt,name=provider" json:"provider,omitempty"` + // A content identifier, specified by content provider. + ContentId []byte `protobuf:"bytes,4,opt,name=content_id,json=contentId" json:"content_id,omitempty"` + // Track type. Acceptable values are SD, HD and AUDIO. Used to + // differentiate content keys used by an asset. + TrackTypeDeprecated *string `protobuf:"bytes,5,opt,name=track_type_deprecated,json=trackTypeDeprecated" json:"track_type_deprecated,omitempty"` + // The name of a registered policy to be used for this asset. + Policy *string `protobuf:"bytes,6,opt,name=policy" json:"policy,omitempty"` + // Crypto period index, for media using key rotation. + CryptoPeriodIndex *uint32 `protobuf:"varint,7,opt,name=crypto_period_index,json=cryptoPeriodIndex" json:"crypto_period_index,omitempty"` + // Optional protected context for group content. The grouped_license is a + // serialized SignedMessage. + GroupedLicense []byte `protobuf:"bytes,8,opt,name=grouped_license,json=groupedLicense" json:"grouped_license,omitempty"` + // Protection scheme identifying the encryption algorithm. + // Represented as one of the following 4CC values: + // 'cenc' (AESCTR), 'cbc1' (AESCBC), + // 'cens' (AESCTR subsample), 'cbcs' (AESCBC subsample). + ProtectionScheme *uint32 `protobuf:"varint,9,opt,name=protection_scheme,json=protectionScheme" json:"protection_scheme,omitempty"` + // Optional. For media using key rotation, this represents the duration + // of each crypto period in seconds. + CryptoPeriodSeconds *uint32 `protobuf:"varint,10,opt,name=crypto_period_seconds,json=cryptoPeriodSeconds" json:"crypto_period_seconds,omitempty"` +} + +func (x *WidevineCencHeader) Reset() { + *x = WidevineCencHeader{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WidevineCencHeader) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WidevineCencHeader) ProtoMessage() {} + +func (x *WidevineCencHeader) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WidevineCencHeader.ProtoReflect.Descriptor instead. +func (*WidevineCencHeader) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{21} +} + +func (x *WidevineCencHeader) GetAlgorithm() WidevineCencHeader_Algorithm { + if x != nil && x.Algorithm != nil { + return *x.Algorithm + } + return WidevineCencHeader_UNENCRYPTED +} + +func (x *WidevineCencHeader) GetKeyId() [][]byte { + if x != nil { + return x.KeyId + } + return nil +} + +func (x *WidevineCencHeader) GetProvider() string { + if x != nil && x.Provider != nil { + return *x.Provider + } + return "" +} + +func (x *WidevineCencHeader) GetContentId() []byte { + if x != nil { + return x.ContentId + } + return nil +} + +func (x *WidevineCencHeader) GetTrackTypeDeprecated() string { + if x != nil && x.TrackTypeDeprecated != nil { + return *x.TrackTypeDeprecated + } + return "" +} + +func (x *WidevineCencHeader) GetPolicy() string { + if x != nil && x.Policy != nil { + return *x.Policy + } + return "" +} + +func (x *WidevineCencHeader) GetCryptoPeriodIndex() uint32 { + if x != nil && x.CryptoPeriodIndex != nil { + return *x.CryptoPeriodIndex + } + return 0 +} + +func (x *WidevineCencHeader) GetGroupedLicense() []byte { + if x != nil { + return x.GroupedLicense + } + return nil +} + +func (x *WidevineCencHeader) GetProtectionScheme() uint32 { + if x != nil && x.ProtectionScheme != nil { + return *x.ProtectionScheme + } + return 0 +} + +func (x *WidevineCencHeader) GetCryptoPeriodSeconds() uint32 { + if x != nil && x.CryptoPeriodSeconds != nil { + return *x.CryptoPeriodSeconds + } + return 0 +} + +// from here on, it's just for testing, these messages don't exist in the binaries, I'm adding them to avoid detecting type programmatically +type SignedLicenseRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *SignedLicenseRequest_MessageType `protobuf:"varint,1,opt,name=Type,enum=SignedLicenseRequest_MessageType" json:"Type,omitempty"` // has in incorrect overlap with License_KeyContainer_SecurityLevel + Msg *LicenseRequest `protobuf:"bytes,2,opt,name=Msg" json:"Msg,omitempty"` // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + Signature []byte `protobuf:"bytes,3,opt,name=Signature" json:"Signature,omitempty"` // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + SessionKey []byte `protobuf:"bytes,4,opt,name=SessionKey" json:"SessionKey,omitempty"` // often RSA wrapped for licenses + RemoteAttestation *RemoteAttestation `protobuf:"bytes,5,opt,name=RemoteAttestation" json:"RemoteAttestation,omitempty"` +} + +func (x *SignedLicenseRequest) Reset() { + *x = SignedLicenseRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedLicenseRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedLicenseRequest) ProtoMessage() {} + +func (x *SignedLicenseRequest) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedLicenseRequest.ProtoReflect.Descriptor instead. +func (*SignedLicenseRequest) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{22} +} + +func (x *SignedLicenseRequest) GetType() SignedLicenseRequest_MessageType { + if x != nil && x.Type != nil { + return *x.Type + } + return SignedLicenseRequest_LICENSE_REQUEST +} + +func (x *SignedLicenseRequest) GetMsg() *LicenseRequest { + if x != nil { + return x.Msg + } + return nil +} + +func (x *SignedLicenseRequest) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedLicenseRequest) GetSessionKey() []byte { + if x != nil { + return x.SessionKey + } + return nil +} + +func (x *SignedLicenseRequest) GetRemoteAttestation() *RemoteAttestation { + if x != nil { + return x.RemoteAttestation + } + return nil +} + +// hack +type SignedLicenseRequestRaw struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *SignedLicenseRequestRaw_MessageType `protobuf:"varint,1,opt,name=Type,enum=SignedLicenseRequestRaw_MessageType" json:"Type,omitempty"` // has in incorrect overlap with License_KeyContainer_SecurityLevel + Msg *LicenseRequestRaw `protobuf:"bytes,2,opt,name=Msg" json:"Msg,omitempty"` // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + Signature []byte `protobuf:"bytes,3,opt,name=Signature" json:"Signature,omitempty"` // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + SessionKey []byte `protobuf:"bytes,4,opt,name=SessionKey" json:"SessionKey,omitempty"` // often RSA wrapped for licenses + RemoteAttestation *RemoteAttestation `protobuf:"bytes,5,opt,name=RemoteAttestation" json:"RemoteAttestation,omitempty"` +} + +func (x *SignedLicenseRequestRaw) Reset() { + *x = SignedLicenseRequestRaw{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedLicenseRequestRaw) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedLicenseRequestRaw) ProtoMessage() {} + +func (x *SignedLicenseRequestRaw) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedLicenseRequestRaw.ProtoReflect.Descriptor instead. +func (*SignedLicenseRequestRaw) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{23} +} + +func (x *SignedLicenseRequestRaw) GetType() SignedLicenseRequestRaw_MessageType { + if x != nil && x.Type != nil { + return *x.Type + } + return SignedLicenseRequestRaw_LICENSE_REQUEST +} + +func (x *SignedLicenseRequestRaw) GetMsg() *LicenseRequestRaw { + if x != nil { + return x.Msg + } + return nil +} + +func (x *SignedLicenseRequestRaw) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedLicenseRequestRaw) GetSessionKey() []byte { + if x != nil { + return x.SessionKey + } + return nil +} + +func (x *SignedLicenseRequestRaw) GetRemoteAttestation() *RemoteAttestation { + if x != nil { + return x.RemoteAttestation + } + return nil +} + +type SignedLicense struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *SignedLicense_MessageType `protobuf:"varint,1,opt,name=Type,enum=SignedLicense_MessageType" json:"Type,omitempty"` // has in incorrect overlap with License_KeyContainer_SecurityLevel + Msg *License `protobuf:"bytes,2,opt,name=Msg" json:"Msg,omitempty"` // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + Signature []byte `protobuf:"bytes,3,opt,name=Signature" json:"Signature,omitempty"` // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + SessionKey []byte `protobuf:"bytes,4,opt,name=SessionKey" json:"SessionKey,omitempty"` // often RSA wrapped for licenses + RemoteAttestation *RemoteAttestation `protobuf:"bytes,5,opt,name=RemoteAttestation" json:"RemoteAttestation,omitempty"` +} + +func (x *SignedLicense) Reset() { + *x = SignedLicense{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedLicense) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedLicense) ProtoMessage() {} + +func (x *SignedLicense) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedLicense.ProtoReflect.Descriptor instead. +func (*SignedLicense) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{24} +} + +func (x *SignedLicense) GetType() SignedLicense_MessageType { + if x != nil && x.Type != nil { + return *x.Type + } + return SignedLicense_LICENSE_REQUEST +} + +func (x *SignedLicense) GetMsg() *License { + if x != nil { + return x.Msg + } + return nil +} + +func (x *SignedLicense) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedLicense) GetSessionKey() []byte { + if x != nil { + return x.SessionKey + } + return nil +} + +func (x *SignedLicense) GetRemoteAttestation() *RemoteAttestation { + if x != nil { + return x.RemoteAttestation + } + return nil +} + +type SignedServiceCertificate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type *SignedServiceCertificate_MessageType `protobuf:"varint,1,opt,name=Type,enum=SignedServiceCertificate_MessageType" json:"Type,omitempty"` // has in incorrect overlap with License_KeyContainer_SecurityLevel + Msg *SignedDeviceCertificate `protobuf:"bytes,2,opt,name=Msg" json:"Msg,omitempty"` // this has to be casted dynamically, to LicenseRequest, License or LicenseError (? unconfirmed), for Request, no other fields but Type need to be present + // for SERVICE_CERTIFICATE, only Type and Msg are present, and it's just a DeviceCertificate with CertificateType set to SERVICE + Signature []byte `protobuf:"bytes,3,opt,name=Signature" json:"Signature,omitempty"` // might be different type of signatures (ex. RSA vs AES CMAC(??), unconfirmed for now) + SessionKey []byte `protobuf:"bytes,4,opt,name=SessionKey" json:"SessionKey,omitempty"` // often RSA wrapped for licenses + RemoteAttestation *RemoteAttestation `protobuf:"bytes,5,opt,name=RemoteAttestation" json:"RemoteAttestation,omitempty"` +} + +func (x *SignedServiceCertificate) Reset() { + *x = SignedServiceCertificate{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SignedServiceCertificate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignedServiceCertificate) ProtoMessage() {} + +func (x *SignedServiceCertificate) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SignedServiceCertificate.ProtoReflect.Descriptor instead. +func (*SignedServiceCertificate) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{25} +} + +func (x *SignedServiceCertificate) GetType() SignedServiceCertificate_MessageType { + if x != nil && x.Type != nil { + return *x.Type + } + return SignedServiceCertificate_LICENSE_REQUEST +} + +func (x *SignedServiceCertificate) GetMsg() *SignedDeviceCertificate { + if x != nil { + return x.Msg + } + return nil +} + +func (x *SignedServiceCertificate) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +func (x *SignedServiceCertificate) GetSessionKey() []byte { + if x != nil { + return x.SessionKey + } + return nil +} + +func (x *SignedServiceCertificate) GetRemoteAttestation() *RemoteAttestation { + if x != nil { + return x.RemoteAttestation + } + return nil +} + +//vmp support +type FileHashes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Signer []byte `protobuf:"bytes,1,opt,name=signer" json:"signer,omitempty"` + Signatures []*FileHashes_Signature `protobuf:"bytes,2,rep,name=signatures" json:"signatures,omitempty"` +} + +func (x *FileHashes) Reset() { + *x = FileHashes{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileHashes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileHashes) ProtoMessage() {} + +func (x *FileHashes) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FileHashes.ProtoReflect.Descriptor instead. +func (*FileHashes) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{26} +} + +func (x *FileHashes) GetSigner() []byte { + if x != nil { + return x.Signer + } + return nil +} + +func (x *FileHashes) GetSignatures() []*FileHashes_Signature { + if x != nil { + return x.Signatures + } + return nil +} + +type ClientIdentification_NameValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name *string `protobuf:"bytes,1,req,name=Name" json:"Name,omitempty"` + Value *string `protobuf:"bytes,2,req,name=Value" json:"Value,omitempty"` +} + +func (x *ClientIdentification_NameValue) Reset() { + *x = ClientIdentification_NameValue{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientIdentification_NameValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientIdentification_NameValue) ProtoMessage() {} + +func (x *ClientIdentification_NameValue) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientIdentification_NameValue.ProtoReflect.Descriptor instead. +func (*ClientIdentification_NameValue) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *ClientIdentification_NameValue) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + +func (x *ClientIdentification_NameValue) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value + } + return "" +} + +type ClientIdentification_ClientCapabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientToken *uint32 `protobuf:"varint,1,opt,name=ClientToken" json:"ClientToken,omitempty"` + SessionToken *uint32 `protobuf:"varint,2,opt,name=SessionToken" json:"SessionToken,omitempty"` + VideoResolutionConstraints *uint32 `protobuf:"varint,3,opt,name=VideoResolutionConstraints" json:"VideoResolutionConstraints,omitempty"` + MaxHdcpVersion *ClientIdentification_ClientCapabilities_HdcpVersion `protobuf:"varint,4,opt,name=MaxHdcpVersion,enum=ClientIdentification_ClientCapabilities_HdcpVersion" json:"MaxHdcpVersion,omitempty"` + OemCryptoApiVersion *uint32 `protobuf:"varint,5,opt,name=OemCryptoApiVersion" json:"OemCryptoApiVersion,omitempty"` +} + +func (x *ClientIdentification_ClientCapabilities) Reset() { + *x = ClientIdentification_ClientCapabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClientIdentification_ClientCapabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClientIdentification_ClientCapabilities) ProtoMessage() {} + +func (x *ClientIdentification_ClientCapabilities) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClientIdentification_ClientCapabilities.ProtoReflect.Descriptor instead. +func (*ClientIdentification_ClientCapabilities) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{0, 1} +} + +func (x *ClientIdentification_ClientCapabilities) GetClientToken() uint32 { + if x != nil && x.ClientToken != nil { + return *x.ClientToken + } + return 0 +} + +func (x *ClientIdentification_ClientCapabilities) GetSessionToken() uint32 { + if x != nil && x.SessionToken != nil { + return *x.SessionToken + } + return 0 +} + +func (x *ClientIdentification_ClientCapabilities) GetVideoResolutionConstraints() uint32 { + if x != nil && x.VideoResolutionConstraints != nil { + return *x.VideoResolutionConstraints + } + return 0 +} + +func (x *ClientIdentification_ClientCapabilities) GetMaxHdcpVersion() ClientIdentification_ClientCapabilities_HdcpVersion { + if x != nil && x.MaxHdcpVersion != nil { + return *x.MaxHdcpVersion + } + return ClientIdentification_ClientCapabilities_HDCP_NONE +} + +func (x *ClientIdentification_ClientCapabilities) GetOemCryptoApiVersion() uint32 { + if x != nil && x.OemCryptoApiVersion != nil { + return *x.OemCryptoApiVersion + } + return 0 +} + +type License_Policy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CanPlay *bool `protobuf:"varint,1,opt,name=CanPlay" json:"CanPlay,omitempty"` // changed from uint32 to bool + CanPersist *bool `protobuf:"varint,2,opt,name=CanPersist" json:"CanPersist,omitempty"` + CanRenew *bool `protobuf:"varint,3,opt,name=CanRenew" json:"CanRenew,omitempty"` + RentalDurationSeconds *uint32 `protobuf:"varint,4,opt,name=RentalDurationSeconds" json:"RentalDurationSeconds,omitempty"` + PlaybackDurationSeconds *uint32 `protobuf:"varint,5,opt,name=PlaybackDurationSeconds" json:"PlaybackDurationSeconds,omitempty"` + LicenseDurationSeconds *uint32 `protobuf:"varint,6,opt,name=LicenseDurationSeconds" json:"LicenseDurationSeconds,omitempty"` + RenewalRecoveryDurationSeconds *uint32 `protobuf:"varint,7,opt,name=RenewalRecoveryDurationSeconds" json:"RenewalRecoveryDurationSeconds,omitempty"` + RenewalServerUrl *string `protobuf:"bytes,8,opt,name=RenewalServerUrl" json:"RenewalServerUrl,omitempty"` + RenewalDelaySeconds *uint32 `protobuf:"varint,9,opt,name=RenewalDelaySeconds" json:"RenewalDelaySeconds,omitempty"` + RenewalRetryIntervalSeconds *uint32 `protobuf:"varint,10,opt,name=RenewalRetryIntervalSeconds" json:"RenewalRetryIntervalSeconds,omitempty"` + RenewWithUsage *bool `protobuf:"varint,11,opt,name=RenewWithUsage" json:"RenewWithUsage,omitempty"` // was uint32 +} + +func (x *License_Policy) Reset() { + *x = License_Policy{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *License_Policy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License_Policy) ProtoMessage() {} + +func (x *License_Policy) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use License_Policy.ProtoReflect.Descriptor instead. +func (*License_Policy) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6, 0} +} + +func (x *License_Policy) GetCanPlay() bool { + if x != nil && x.CanPlay != nil { + return *x.CanPlay + } + return false +} + +func (x *License_Policy) GetCanPersist() bool { + if x != nil && x.CanPersist != nil { + return *x.CanPersist + } + return false +} + +func (x *License_Policy) GetCanRenew() bool { + if x != nil && x.CanRenew != nil { + return *x.CanRenew + } + return false +} + +func (x *License_Policy) GetRentalDurationSeconds() uint32 { + if x != nil && x.RentalDurationSeconds != nil { + return *x.RentalDurationSeconds + } + return 0 +} + +func (x *License_Policy) GetPlaybackDurationSeconds() uint32 { + if x != nil && x.PlaybackDurationSeconds != nil { + return *x.PlaybackDurationSeconds + } + return 0 +} + +func (x *License_Policy) GetLicenseDurationSeconds() uint32 { + if x != nil && x.LicenseDurationSeconds != nil { + return *x.LicenseDurationSeconds + } + return 0 +} + +func (x *License_Policy) GetRenewalRecoveryDurationSeconds() uint32 { + if x != nil && x.RenewalRecoveryDurationSeconds != nil { + return *x.RenewalRecoveryDurationSeconds + } + return 0 +} + +func (x *License_Policy) GetRenewalServerUrl() string { + if x != nil && x.RenewalServerUrl != nil { + return *x.RenewalServerUrl + } + return "" +} + +func (x *License_Policy) GetRenewalDelaySeconds() uint32 { + if x != nil && x.RenewalDelaySeconds != nil { + return *x.RenewalDelaySeconds + } + return 0 +} + +func (x *License_Policy) GetRenewalRetryIntervalSeconds() uint32 { + if x != nil && x.RenewalRetryIntervalSeconds != nil { + return *x.RenewalRetryIntervalSeconds + } + return 0 +} + +func (x *License_Policy) GetRenewWithUsage() bool { + if x != nil && x.RenewWithUsage != nil { + return *x.RenewWithUsage + } + return false +} + +type License_KeyContainer struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id []byte `protobuf:"bytes,1,opt,name=Id" json:"Id,omitempty"` + Iv []byte `protobuf:"bytes,2,opt,name=Iv" json:"Iv,omitempty"` + Key []byte `protobuf:"bytes,3,opt,name=Key" json:"Key,omitempty"` + Type *License_KeyContainer_KeyType `protobuf:"varint,4,opt,name=Type,enum=License_KeyContainer_KeyType" json:"Type,omitempty"` + Level *License_KeyContainer_SecurityLevel `protobuf:"varint,5,opt,name=Level,enum=License_KeyContainer_SecurityLevel" json:"Level,omitempty"` + RequiredProtection *License_KeyContainer_OutputProtection `protobuf:"bytes,6,opt,name=RequiredProtection" json:"RequiredProtection,omitempty"` + RequestedProtection *License_KeyContainer_OutputProtection `protobuf:"bytes,7,opt,name=RequestedProtection" json:"RequestedProtection,omitempty"` + XKeyControl *License_KeyContainer_KeyControl `protobuf:"bytes,8,opt,name=_KeyControl,json=KeyControl" json:"_KeyControl,omitempty"` // duped names, etc + XOperatorSessionKeyPermissions *License_KeyContainer_OperatorSessionKeyPermissions `protobuf:"bytes,9,opt,name=_OperatorSessionKeyPermissions,json=OperatorSessionKeyPermissions" json:"_OperatorSessionKeyPermissions,omitempty"` // duped names, etc + VideoResolutionConstraints []*License_KeyContainer_VideoResolutionConstraint `protobuf:"bytes,10,rep,name=VideoResolutionConstraints" json:"VideoResolutionConstraints,omitempty"` +} + +func (x *License_KeyContainer) Reset() { + *x = License_KeyContainer{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *License_KeyContainer) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License_KeyContainer) ProtoMessage() {} + +func (x *License_KeyContainer) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use License_KeyContainer.ProtoReflect.Descriptor instead. +func (*License_KeyContainer) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6, 1} +} + +func (x *License_KeyContainer) GetId() []byte { + if x != nil { + return x.Id + } + return nil +} + +func (x *License_KeyContainer) GetIv() []byte { + if x != nil { + return x.Iv + } + return nil +} + +func (x *License_KeyContainer) GetKey() []byte { + if x != nil { + return x.Key + } + return nil +} + +func (x *License_KeyContainer) GetType() License_KeyContainer_KeyType { + if x != nil && x.Type != nil { + return *x.Type + } + return License_KeyContainer_SIGNING +} + +func (x *License_KeyContainer) GetLevel() License_KeyContainer_SecurityLevel { + if x != nil && x.Level != nil { + return *x.Level + } + return License_KeyContainer_SW_SECURE_CRYPTO +} + +func (x *License_KeyContainer) GetRequiredProtection() *License_KeyContainer_OutputProtection { + if x != nil { + return x.RequiredProtection + } + return nil +} + +func (x *License_KeyContainer) GetRequestedProtection() *License_KeyContainer_OutputProtection { + if x != nil { + return x.RequestedProtection + } + return nil +} + +func (x *License_KeyContainer) GetXKeyControl() *License_KeyContainer_KeyControl { + if x != nil { + return x.XKeyControl + } + return nil +} + +func (x *License_KeyContainer) GetXOperatorSessionKeyPermissions() *License_KeyContainer_OperatorSessionKeyPermissions { + if x != nil { + return x.XOperatorSessionKeyPermissions + } + return nil +} + +func (x *License_KeyContainer) GetVideoResolutionConstraints() []*License_KeyContainer_VideoResolutionConstraint { + if x != nil { + return x.VideoResolutionConstraints + } + return nil +} + +type License_KeyContainer_OutputProtection struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hdcp *ClientIdentification_ClientCapabilities_HdcpVersion `protobuf:"varint,1,opt,name=Hdcp,enum=ClientIdentification_ClientCapabilities_HdcpVersion" json:"Hdcp,omitempty"` // it's most likely a copy of Hdcp version available here, but compiler optimized it away + CgmsFlags *License_KeyContainer_OutputProtection_CGMS `protobuf:"varint,2,opt,name=CgmsFlags,enum=License_KeyContainer_OutputProtection_CGMS" json:"CgmsFlags,omitempty"` +} + +func (x *License_KeyContainer_OutputProtection) Reset() { + *x = License_KeyContainer_OutputProtection{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *License_KeyContainer_OutputProtection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License_KeyContainer_OutputProtection) ProtoMessage() {} + +func (x *License_KeyContainer_OutputProtection) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use License_KeyContainer_OutputProtection.ProtoReflect.Descriptor instead. +func (*License_KeyContainer_OutputProtection) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6, 1, 0} +} + +func (x *License_KeyContainer_OutputProtection) GetHdcp() ClientIdentification_ClientCapabilities_HdcpVersion { + if x != nil && x.Hdcp != nil { + return *x.Hdcp + } + return ClientIdentification_ClientCapabilities_HDCP_NONE +} + +func (x *License_KeyContainer_OutputProtection) GetCgmsFlags() License_KeyContainer_OutputProtection_CGMS { + if x != nil && x.CgmsFlags != nil { + return *x.CgmsFlags + } + return License_KeyContainer_OutputProtection_COPY_FREE +} + +type License_KeyContainer_KeyControl struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + KeyControlBlock []byte `protobuf:"bytes,1,req,name=KeyControlBlock" json:"KeyControlBlock,omitempty"` // what is this? + Iv []byte `protobuf:"bytes,2,req,name=Iv" json:"Iv,omitempty"` +} + +func (x *License_KeyContainer_KeyControl) Reset() { + *x = License_KeyContainer_KeyControl{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *License_KeyContainer_KeyControl) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License_KeyContainer_KeyControl) ProtoMessage() {} + +func (x *License_KeyContainer_KeyControl) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use License_KeyContainer_KeyControl.ProtoReflect.Descriptor instead. +func (*License_KeyContainer_KeyControl) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6, 1, 1} +} + +func (x *License_KeyContainer_KeyControl) GetKeyControlBlock() []byte { + if x != nil { + return x.KeyControlBlock + } + return nil +} + +func (x *License_KeyContainer_KeyControl) GetIv() []byte { + if x != nil { + return x.Iv + } + return nil +} + +type License_KeyContainer_OperatorSessionKeyPermissions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AllowEncrypt *uint32 `protobuf:"varint,1,opt,name=AllowEncrypt" json:"AllowEncrypt,omitempty"` + AllowDecrypt *uint32 `protobuf:"varint,2,opt,name=AllowDecrypt" json:"AllowDecrypt,omitempty"` + AllowSign *uint32 `protobuf:"varint,3,opt,name=AllowSign" json:"AllowSign,omitempty"` + AllowSignatureVerify *uint32 `protobuf:"varint,4,opt,name=AllowSignatureVerify" json:"AllowSignatureVerify,omitempty"` +} + +func (x *License_KeyContainer_OperatorSessionKeyPermissions) Reset() { + *x = License_KeyContainer_OperatorSessionKeyPermissions{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *License_KeyContainer_OperatorSessionKeyPermissions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License_KeyContainer_OperatorSessionKeyPermissions) ProtoMessage() {} + +func (x *License_KeyContainer_OperatorSessionKeyPermissions) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use License_KeyContainer_OperatorSessionKeyPermissions.ProtoReflect.Descriptor instead. +func (*License_KeyContainer_OperatorSessionKeyPermissions) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6, 1, 2} +} + +func (x *License_KeyContainer_OperatorSessionKeyPermissions) GetAllowEncrypt() uint32 { + if x != nil && x.AllowEncrypt != nil { + return *x.AllowEncrypt + } + return 0 +} + +func (x *License_KeyContainer_OperatorSessionKeyPermissions) GetAllowDecrypt() uint32 { + if x != nil && x.AllowDecrypt != nil { + return *x.AllowDecrypt + } + return 0 +} + +func (x *License_KeyContainer_OperatorSessionKeyPermissions) GetAllowSign() uint32 { + if x != nil && x.AllowSign != nil { + return *x.AllowSign + } + return 0 +} + +func (x *License_KeyContainer_OperatorSessionKeyPermissions) GetAllowSignatureVerify() uint32 { + if x != nil && x.AllowSignatureVerify != nil { + return *x.AllowSignatureVerify + } + return 0 +} + +type License_KeyContainer_VideoResolutionConstraint struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MinResolutionPixels *uint32 `protobuf:"varint,1,opt,name=MinResolutionPixels" json:"MinResolutionPixels,omitempty"` + MaxResolutionPixels *uint32 `protobuf:"varint,2,opt,name=MaxResolutionPixels" json:"MaxResolutionPixels,omitempty"` + RequiredProtection *License_KeyContainer_OutputProtection `protobuf:"bytes,3,opt,name=RequiredProtection" json:"RequiredProtection,omitempty"` +} + +func (x *License_KeyContainer_VideoResolutionConstraint) Reset() { + *x = License_KeyContainer_VideoResolutionConstraint{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *License_KeyContainer_VideoResolutionConstraint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License_KeyContainer_VideoResolutionConstraint) ProtoMessage() {} + +func (x *License_KeyContainer_VideoResolutionConstraint) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use License_KeyContainer_VideoResolutionConstraint.ProtoReflect.Descriptor instead. +func (*License_KeyContainer_VideoResolutionConstraint) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{6, 1, 3} +} + +func (x *License_KeyContainer_VideoResolutionConstraint) GetMinResolutionPixels() uint32 { + if x != nil && x.MinResolutionPixels != nil { + return *x.MinResolutionPixels + } + return 0 +} + +func (x *License_KeyContainer_VideoResolutionConstraint) GetMaxResolutionPixels() uint32 { + if x != nil && x.MaxResolutionPixels != nil { + return *x.MaxResolutionPixels + } + return 0 +} + +func (x *License_KeyContainer_VideoResolutionConstraint) GetRequiredProtection() *License_KeyContainer_OutputProtection { + if x != nil { + return x.RequiredProtection + } + return nil +} + +type LicenseRequest_ContentIdentification struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CencId *LicenseRequest_ContentIdentification_CENC `protobuf:"bytes,1,opt,name=CencId" json:"CencId,omitempty"` + WebmId *LicenseRequest_ContentIdentification_WebM `protobuf:"bytes,2,opt,name=WebmId" json:"WebmId,omitempty"` + License *LicenseRequest_ContentIdentification_ExistingLicense `protobuf:"bytes,3,opt,name=License" json:"License,omitempty"` +} + +func (x *LicenseRequest_ContentIdentification) Reset() { + *x = LicenseRequest_ContentIdentification{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequest_ContentIdentification) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequest_ContentIdentification) ProtoMessage() {} + +func (x *LicenseRequest_ContentIdentification) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequest_ContentIdentification.ProtoReflect.Descriptor instead. +func (*LicenseRequest_ContentIdentification) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{8, 0} +} + +func (x *LicenseRequest_ContentIdentification) GetCencId() *LicenseRequest_ContentIdentification_CENC { + if x != nil { + return x.CencId + } + return nil +} + +func (x *LicenseRequest_ContentIdentification) GetWebmId() *LicenseRequest_ContentIdentification_WebM { + if x != nil { + return x.WebmId + } + return nil +} + +func (x *LicenseRequest_ContentIdentification) GetLicense() *LicenseRequest_ContentIdentification_ExistingLicense { + if x != nil { + return x.License + } + return nil +} + +type LicenseRequest_ContentIdentification_CENC struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + //optional bytes Pssh = 1; // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + Pssh *WidevineCencHeader `protobuf:"bytes,1,opt,name=Pssh" json:"Pssh,omitempty"` + LicenseType *LicenseType `protobuf:"varint,2,opt,name=LicenseType,enum=LicenseType" json:"LicenseType,omitempty"` // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) + RequestId []byte `protobuf:"bytes,3,opt,name=RequestId" json:"RequestId,omitempty"` +} + +func (x *LicenseRequest_ContentIdentification_CENC) Reset() { + *x = LicenseRequest_ContentIdentification_CENC{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequest_ContentIdentification_CENC) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequest_ContentIdentification_CENC) ProtoMessage() {} + +func (x *LicenseRequest_ContentIdentification_CENC) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequest_ContentIdentification_CENC.ProtoReflect.Descriptor instead. +func (*LicenseRequest_ContentIdentification_CENC) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{8, 0, 0} +} + +func (x *LicenseRequest_ContentIdentification_CENC) GetPssh() *WidevineCencHeader { + if x != nil { + return x.Pssh + } + return nil +} + +func (x *LicenseRequest_ContentIdentification_CENC) GetLicenseType() LicenseType { + if x != nil && x.LicenseType != nil { + return *x.LicenseType + } + return LicenseType_ZERO +} + +func (x *LicenseRequest_ContentIdentification_CENC) GetRequestId() []byte { + if x != nil { + return x.RequestId + } + return nil +} + +type LicenseRequest_ContentIdentification_WebM struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header []byte `protobuf:"bytes,1,opt,name=Header" json:"Header,omitempty"` // identical to CENC, aside from PSSH and the parent field number used + LicenseType *LicenseType `protobuf:"varint,2,opt,name=LicenseType,enum=LicenseType" json:"LicenseType,omitempty"` + RequestId []byte `protobuf:"bytes,3,opt,name=RequestId" json:"RequestId,omitempty"` +} + +func (x *LicenseRequest_ContentIdentification_WebM) Reset() { + *x = LicenseRequest_ContentIdentification_WebM{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequest_ContentIdentification_WebM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequest_ContentIdentification_WebM) ProtoMessage() {} + +func (x *LicenseRequest_ContentIdentification_WebM) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequest_ContentIdentification_WebM.ProtoReflect.Descriptor instead. +func (*LicenseRequest_ContentIdentification_WebM) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{8, 0, 1} +} + +func (x *LicenseRequest_ContentIdentification_WebM) GetHeader() []byte { + if x != nil { + return x.Header + } + return nil +} + +func (x *LicenseRequest_ContentIdentification_WebM) GetLicenseType() LicenseType { + if x != nil && x.LicenseType != nil { + return *x.LicenseType + } + return LicenseType_ZERO +} + +func (x *LicenseRequest_ContentIdentification_WebM) GetRequestId() []byte { + if x != nil { + return x.RequestId + } + return nil +} + +type LicenseRequest_ContentIdentification_ExistingLicense struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LicenseId *LicenseIdentification `protobuf:"bytes,1,opt,name=LicenseId" json:"LicenseId,omitempty"` + SecondsSinceStarted *uint32 `protobuf:"varint,2,opt,name=SecondsSinceStarted" json:"SecondsSinceStarted,omitempty"` + SecondsSinceLastPlayed *uint32 `protobuf:"varint,3,opt,name=SecondsSinceLastPlayed" json:"SecondsSinceLastPlayed,omitempty"` + SessionUsageTableEntry []byte `protobuf:"bytes,4,opt,name=SessionUsageTableEntry" json:"SessionUsageTableEntry,omitempty"` // interesting! try to figure out the connection between the usage table blob and KCB! +} + +func (x *LicenseRequest_ContentIdentification_ExistingLicense) Reset() { + *x = LicenseRequest_ContentIdentification_ExistingLicense{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequest_ContentIdentification_ExistingLicense) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequest_ContentIdentification_ExistingLicense) ProtoMessage() {} + +func (x *LicenseRequest_ContentIdentification_ExistingLicense) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequest_ContentIdentification_ExistingLicense.ProtoReflect.Descriptor instead. +func (*LicenseRequest_ContentIdentification_ExistingLicense) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{8, 0, 2} +} + +func (x *LicenseRequest_ContentIdentification_ExistingLicense) GetLicenseId() *LicenseIdentification { + if x != nil { + return x.LicenseId + } + return nil +} + +func (x *LicenseRequest_ContentIdentification_ExistingLicense) GetSecondsSinceStarted() uint32 { + if x != nil && x.SecondsSinceStarted != nil { + return *x.SecondsSinceStarted + } + return 0 +} + +func (x *LicenseRequest_ContentIdentification_ExistingLicense) GetSecondsSinceLastPlayed() uint32 { + if x != nil && x.SecondsSinceLastPlayed != nil { + return *x.SecondsSinceLastPlayed + } + return 0 +} + +func (x *LicenseRequest_ContentIdentification_ExistingLicense) GetSessionUsageTableEntry() []byte { + if x != nil { + return x.SessionUsageTableEntry + } + return nil +} + +type LicenseRequestRaw_ContentIdentification struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CencId *LicenseRequestRaw_ContentIdentification_CENC `protobuf:"bytes,1,opt,name=CencId" json:"CencId,omitempty"` + WebmId *LicenseRequestRaw_ContentIdentification_WebM `protobuf:"bytes,2,opt,name=WebmId" json:"WebmId,omitempty"` + License *LicenseRequestRaw_ContentIdentification_ExistingLicense `protobuf:"bytes,3,opt,name=License" json:"License,omitempty"` +} + +func (x *LicenseRequestRaw_ContentIdentification) Reset() { + *x = LicenseRequestRaw_ContentIdentification{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequestRaw_ContentIdentification) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequestRaw_ContentIdentification) ProtoMessage() {} + +func (x *LicenseRequestRaw_ContentIdentification) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequestRaw_ContentIdentification.ProtoReflect.Descriptor instead. +func (*LicenseRequestRaw_ContentIdentification) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{9, 0} +} + +func (x *LicenseRequestRaw_ContentIdentification) GetCencId() *LicenseRequestRaw_ContentIdentification_CENC { + if x != nil { + return x.CencId + } + return nil +} + +func (x *LicenseRequestRaw_ContentIdentification) GetWebmId() *LicenseRequestRaw_ContentIdentification_WebM { + if x != nil { + return x.WebmId + } + return nil +} + +func (x *LicenseRequestRaw_ContentIdentification) GetLicense() *LicenseRequestRaw_ContentIdentification_ExistingLicense { + if x != nil { + return x.License + } + return nil +} + +type LicenseRequestRaw_ContentIdentification_CENC struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Pssh []byte `protobuf:"bytes,1,opt,name=Pssh" json:"Pssh,omitempty"` // the client's definition is opaque, it doesn't care about the contents, but the PSSH has a clear definition that is understood and requested by the server, thus I'll replace it with: + //optional WidevineCencHeader Pssh = 1; + LicenseType *LicenseType `protobuf:"varint,2,opt,name=LicenseType,enum=LicenseType" json:"LicenseType,omitempty"` // unfortunately the LicenseType symbols are not present, acceptable value seems to only be 1 (is this persist/don't persist? look into it!) + RequestId []byte `protobuf:"bytes,3,opt,name=RequestId" json:"RequestId,omitempty"` +} + +func (x *LicenseRequestRaw_ContentIdentification_CENC) Reset() { + *x = LicenseRequestRaw_ContentIdentification_CENC{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequestRaw_ContentIdentification_CENC) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequestRaw_ContentIdentification_CENC) ProtoMessage() {} + +func (x *LicenseRequestRaw_ContentIdentification_CENC) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequestRaw_ContentIdentification_CENC.ProtoReflect.Descriptor instead. +func (*LicenseRequestRaw_ContentIdentification_CENC) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{9, 0, 0} +} + +func (x *LicenseRequestRaw_ContentIdentification_CENC) GetPssh() []byte { + if x != nil { + return x.Pssh + } + return nil +} + +func (x *LicenseRequestRaw_ContentIdentification_CENC) GetLicenseType() LicenseType { + if x != nil && x.LicenseType != nil { + return *x.LicenseType + } + return LicenseType_ZERO +} + +func (x *LicenseRequestRaw_ContentIdentification_CENC) GetRequestId() []byte { + if x != nil { + return x.RequestId + } + return nil +} + +type LicenseRequestRaw_ContentIdentification_WebM struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header []byte `protobuf:"bytes,1,opt,name=Header" json:"Header,omitempty"` // identical to CENC, aside from PSSH and the parent field number used + LicenseType *LicenseType `protobuf:"varint,2,opt,name=LicenseType,enum=LicenseType" json:"LicenseType,omitempty"` + RequestId []byte `protobuf:"bytes,3,opt,name=RequestId" json:"RequestId,omitempty"` +} + +func (x *LicenseRequestRaw_ContentIdentification_WebM) Reset() { + *x = LicenseRequestRaw_ContentIdentification_WebM{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequestRaw_ContentIdentification_WebM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequestRaw_ContentIdentification_WebM) ProtoMessage() {} + +func (x *LicenseRequestRaw_ContentIdentification_WebM) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequestRaw_ContentIdentification_WebM.ProtoReflect.Descriptor instead. +func (*LicenseRequestRaw_ContentIdentification_WebM) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{9, 0, 1} +} + +func (x *LicenseRequestRaw_ContentIdentification_WebM) GetHeader() []byte { + if x != nil { + return x.Header + } + return nil +} + +func (x *LicenseRequestRaw_ContentIdentification_WebM) GetLicenseType() LicenseType { + if x != nil && x.LicenseType != nil { + return *x.LicenseType + } + return LicenseType_ZERO +} + +func (x *LicenseRequestRaw_ContentIdentification_WebM) GetRequestId() []byte { + if x != nil { + return x.RequestId + } + return nil +} + +type LicenseRequestRaw_ContentIdentification_ExistingLicense struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LicenseId *LicenseIdentification `protobuf:"bytes,1,opt,name=LicenseId" json:"LicenseId,omitempty"` + SecondsSinceStarted *uint32 `protobuf:"varint,2,opt,name=SecondsSinceStarted" json:"SecondsSinceStarted,omitempty"` + SecondsSinceLastPlayed *uint32 `protobuf:"varint,3,opt,name=SecondsSinceLastPlayed" json:"SecondsSinceLastPlayed,omitempty"` + SessionUsageTableEntry []byte `protobuf:"bytes,4,opt,name=SessionUsageTableEntry" json:"SessionUsageTableEntry,omitempty"` // interesting! try to figure out the connection between the usage table blob and KCB! +} + +func (x *LicenseRequestRaw_ContentIdentification_ExistingLicense) Reset() { + *x = LicenseRequestRaw_ContentIdentification_ExistingLicense{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LicenseRequestRaw_ContentIdentification_ExistingLicense) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LicenseRequestRaw_ContentIdentification_ExistingLicense) ProtoMessage() {} + +func (x *LicenseRequestRaw_ContentIdentification_ExistingLicense) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LicenseRequestRaw_ContentIdentification_ExistingLicense.ProtoReflect.Descriptor instead. +func (*LicenseRequestRaw_ContentIdentification_ExistingLicense) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{9, 0, 2} +} + +func (x *LicenseRequestRaw_ContentIdentification_ExistingLicense) GetLicenseId() *LicenseIdentification { + if x != nil { + return x.LicenseId + } + return nil +} + +func (x *LicenseRequestRaw_ContentIdentification_ExistingLicense) GetSecondsSinceStarted() uint32 { + if x != nil && x.SecondsSinceStarted != nil { + return *x.SecondsSinceStarted + } + return 0 +} + +func (x *LicenseRequestRaw_ContentIdentification_ExistingLicense) GetSecondsSinceLastPlayed() uint32 { + if x != nil && x.SecondsSinceLastPlayed != nil { + return *x.SecondsSinceLastPlayed + } + return 0 +} + +func (x *LicenseRequestRaw_ContentIdentification_ExistingLicense) GetSessionUsageTableEntry() []byte { + if x != nil { + return x.SessionUsageTableEntry + } + return nil +} + +type FileHashes_Signature struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Filename *string `protobuf:"bytes,1,opt,name=filename" json:"filename,omitempty"` + TestSigning *bool `protobuf:"varint,2,opt,name=test_signing,json=testSigning" json:"test_signing,omitempty"` //0 - release, 1 - testing + SHA512Hash []byte `protobuf:"bytes,3,opt,name=SHA512Hash" json:"SHA512Hash,omitempty"` + MainExe *bool `protobuf:"varint,4,opt,name=main_exe,json=mainExe" json:"main_exe,omitempty"` //0 for dlls, 1 for exe, this is field 3 in file + Signature []byte `protobuf:"bytes,5,opt,name=signature" json:"signature,omitempty"` +} + +func (x *FileHashes_Signature) Reset() { + *x = FileHashes_Signature{} + if protoimpl.UnsafeEnabled { + mi := &file_wv_proto2_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileHashes_Signature) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileHashes_Signature) ProtoMessage() {} + +func (x *FileHashes_Signature) ProtoReflect() protoreflect.Message { + mi := &file_wv_proto2_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FileHashes_Signature.ProtoReflect.Descriptor instead. +func (*FileHashes_Signature) Descriptor() ([]byte, []int) { + return file_wv_proto2_proto_rawDescGZIP(), []int{26, 0} +} + +func (x *FileHashes_Signature) GetFilename() string { + if x != nil && x.Filename != nil { + return *x.Filename + } + return "" +} + +func (x *FileHashes_Signature) GetTestSigning() bool { + if x != nil && x.TestSigning != nil { + return *x.TestSigning + } + return false +} + +func (x *FileHashes_Signature) GetSHA512Hash() []byte { + if x != nil { + return x.SHA512Hash + } + return nil +} + +func (x *FileHashes_Signature) GetMainExe() bool { + if x != nil && x.MainExe != nil { + return *x.MainExe + } + return false +} + +func (x *FileHashes_Signature) GetSignature() []byte { + if x != nil { + return x.Signature + } + return nil +} + +var File_wv_proto2_proto protoreflect.FileDescriptor + +var file_wv_proto2_proto_rawDesc = []byte{ + 0x0a, 0x0f, 0x77, 0x76, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xae, 0x07, 0x0a, 0x14, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x2e, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x3f, 0x0a, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x30, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x13, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x13, 0x5f, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x0b, 0x5f, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x52, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, + 0x68, 0x65, 0x73, 0x1a, 0x35, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x02, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x80, 0x03, 0x0a, 0x12, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x3e, 0x0a, 0x1a, 0x56, 0x69, 0x64, 0x65, 0x6f, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1a, 0x56, 0x69, 0x64, + 0x65, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x5c, 0x0a, 0x0e, 0x4d, 0x61, 0x78, 0x48, 0x64, + 0x63, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x34, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x70, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x48, 0x64, 0x63, 0x70, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x4d, 0x61, 0x78, 0x48, 0x64, 0x63, 0x70, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x65, 0x6d, 0x43, 0x72, 0x79, 0x70, + 0x74, 0x6f, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x13, 0x4f, 0x65, 0x6d, 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x41, 0x70, 0x69, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x54, 0x0a, 0x0b, 0x48, 0x64, 0x63, 0x70, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x44, 0x43, 0x50, 0x5f, 0x4e, + 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x44, 0x43, 0x50, 0x5f, 0x56, 0x31, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x44, 0x43, 0x50, 0x5f, 0x56, 0x32, 0x10, 0x02, 0x12, + 0x0d, 0x0a, 0x09, 0x48, 0x44, 0x43, 0x50, 0x5f, 0x56, 0x32, 0x5f, 0x31, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x48, 0x44, 0x43, 0x50, 0x5f, 0x56, 0x32, 0x5f, 0x32, 0x10, 0x04, 0x22, 0x53, 0x0a, + 0x09, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4b, 0x45, + 0x59, 0x42, 0x4f, 0x58, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, + 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x22, + 0x0a, 0x1e, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x53, 0x54, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, + 0x10, 0x02, 0x22, 0xfa, 0x02, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x02, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x64, + 0x12, 0x32, 0x0a, 0x14, 0x54, 0x65, 0x73, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, + 0x54, 0x65, 0x73, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x0f, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x00, 0x12, + 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, 0x45, 0x10, + 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, + 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x22, + 0xe6, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x53, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x42, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2a, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x2b, 0x0a, 0x11, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x09, 0x0a, 0x05, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, + 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x44, 0x10, 0x01, 0x22, 0x97, 0x01, 0x0a, 0x1b, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x69, 0x6d, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x11, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x97, 0x02, 0x0a, 0x1d, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x46, 0x0a, 0x1e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x1e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x11, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x45, 0x6e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x49, 0x76, 0x18, + 0x04, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x13, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x49, 0x76, 0x12, 0x30, 0x0a, 0x13, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x63, 0x79, 0x4b, 0x65, + 0x79, 0x18, 0x05, 0x20, 0x02, 0x28, 0x0c, 0x52, 0x13, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x65, 0x64, 0x50, 0x72, 0x69, 0x76, 0x61, 0x63, 0x79, 0x4b, 0x65, 0x79, 0x22, 0xe3, 0x01, 0x0a, + 0x15, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, + 0x49, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x0c, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, + 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x8d, 0x13, 0x0a, 0x07, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x26, + 0x0a, 0x02, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x4c, 0x69, 0x63, + 0x65, 0x6e, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x02, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x07, 0x5f, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x27, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x4c, 0x69, 0x63, + 0x65, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, + 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x13, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x1a, 0x96, 0x04, 0x0a, 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x18, 0x0a, 0x07, + 0x43, 0x61, 0x6e, 0x50, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x43, + 0x61, 0x6e, 0x50, 0x6c, 0x61, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x61, 0x6e, 0x50, 0x65, 0x72, + 0x73, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x43, 0x61, 0x6e, 0x50, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x52, 0x65, 0x6e, + 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x52, 0x65, 0x6e, + 0x65, 0x77, 0x12, 0x34, 0x0a, 0x15, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x15, 0x52, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x50, 0x6c, 0x61, 0x79, + 0x62, 0x61, 0x63, 0x6b, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x17, 0x50, 0x6c, 0x61, 0x79, 0x62, + 0x61, 0x63, 0x6b, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x16, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x52, 0x65, + 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x1e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, + 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x30, + 0x0a, 0x13, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x52, 0x65, 0x6e, + 0x65, 0x77, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x12, 0x40, 0x0a, 0x1b, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x74, 0x72, 0x79, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1b, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x61, 0x6c, 0x52, 0x65, + 0x74, 0x72, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x53, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x6e, 0x65, 0x77, 0x57, 0x69, 0x74, 0x68, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x6e, 0x65, + 0x77, 0x57, 0x69, 0x74, 0x68, 0x55, 0x73, 0x61, 0x67, 0x65, 0x1a, 0xa5, 0x0c, 0x0a, 0x0c, 0x4b, + 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x76, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x49, 0x76, 0x12, 0x10, 0x0a, 0x03, 0x4b, + 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x31, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x2e, 0x4b, 0x65, 0x79, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x39, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x23, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x56, 0x0a, 0x12, 0x52, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x12, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, + 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, + 0x0b, 0x5f, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x0a, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x12, 0x7a, 0x0a, 0x1e, 0x5f, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, + 0x65, 0x79, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x1d, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, + 0x79, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6f, 0x0a, 0x1a, + 0x56, 0x69, 0x64, 0x65, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x52, 0x65, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, + 0x74, 0x52, 0x1a, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0xec, 0x01, + 0x0a, 0x10, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x04, 0x48, 0x64, 0x63, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x34, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x48, 0x64, 0x63, 0x70, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x48, 0x64, 0x63, 0x70, 0x12, 0x49, 0x0a, 0x09, + 0x43, 0x67, 0x6d, 0x73, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2b, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, 0x6f, + 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x47, 0x4d, 0x53, 0x52, 0x09, 0x43, 0x67, + 0x6d, 0x73, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x22, 0x43, 0x0a, 0x04, 0x43, 0x47, 0x4d, 0x53, 0x12, + 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x50, 0x59, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x43, 0x4f, 0x50, 0x59, 0x5f, 0x4f, 0x4e, 0x43, 0x45, 0x10, 0x02, 0x12, 0x0e, 0x0a, + 0x0a, 0x43, 0x4f, 0x50, 0x59, 0x5f, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x10, 0x03, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x47, 0x4d, 0x53, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x2a, 0x1a, 0x46, 0x0a, 0x0a, + 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x28, 0x0a, 0x0f, 0x4b, 0x65, + 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, + 0x02, 0x28, 0x0c, 0x52, 0x0f, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x76, 0x18, 0x02, 0x20, 0x02, 0x28, 0x0c, + 0x52, 0x02, 0x49, 0x76, 0x1a, 0xb9, 0x01, 0x0a, 0x1d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x45, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0c, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x44, 0x65, 0x63, 0x72, 0x79, 0x70, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x69, 0x67, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x69, 0x67, 0x6e, 0x12, 0x32, 0x0a, 0x14, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x1a, 0xd7, 0x01, 0x0a, 0x19, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x30, + 0x0a, 0x13, 0x4d, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x69, 0x78, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x69, 0x6e, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, + 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, + 0x61, 0x78, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x69, 0x78, 0x65, + 0x6c, 0x73, 0x12, 0x56, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x72, + 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x07, 0x4b, 0x65, + 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x49, 0x47, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, + 0x0f, 0x0a, 0x0b, 0x4b, 0x45, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x4f, 0x4c, 0x10, 0x03, + 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x53, 0x45, 0x53, + 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x22, 0x7a, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x57, 0x5f, 0x53, 0x45, + 0x43, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x10, 0x01, 0x12, 0x14, 0x0a, + 0x10, 0x53, 0x57, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, + 0x45, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x48, 0x57, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x45, + 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x48, 0x57, 0x5f, + 0x53, 0x45, 0x43, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x04, 0x12, + 0x11, 0x0a, 0x0d, 0x48, 0x57, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x45, 0x5f, 0x41, 0x4c, 0x4c, + 0x10, 0x05, 0x22, 0xa3, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x31, 0x0a, 0x09, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x09, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x60, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x1e, 0x0a, 0x1a, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, + 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, + 0x17, 0x0a, 0x13, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, + 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x22, 0xcb, 0x09, 0x0a, 0x0e, 0x4c, 0x69, 0x63, + 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x43, + 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1b, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x19, 0x4b, 0x65, 0x79, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x0f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x28, 0x0a, 0x0f, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4e, 0x6f, + 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4b, 0x65, 0x79, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x11, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, + 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0xc9, 0x05, 0x0a, 0x15, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x06, 0x43, 0x65, 0x6e, 0x63, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4e, 0x43, 0x52, 0x06, + 0x43, 0x65, 0x6e, 0x63, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x06, 0x57, 0x65, 0x62, 0x6d, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x57, 0x65, + 0x62, 0x4d, 0x52, 0x06, 0x57, 0x65, 0x62, 0x6d, 0x49, 0x64, 0x12, 0x4f, 0x0a, 0x07, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x52, 0x07, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x1a, 0x7d, 0x0a, 0x04, 0x43, + 0x45, 0x4e, 0x43, 0x12, 0x27, 0x0a, 0x04, 0x50, 0x73, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x6e, 0x63, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x04, 0x50, 0x73, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x0b, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0c, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x09, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x1a, 0x6c, 0x0a, 0x04, 0x57, 0x65, + 0x62, 0x4d, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x0b, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x0c, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x4c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x1a, 0xe9, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x13, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, + 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, + 0x63, 0x65, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x22, 0x30, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x45, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x52, 0x45, 0x4e, 0x45, 0x57, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4c, + 0x45, 0x41, 0x53, 0x45, 0x10, 0x03, 0x22, 0xc8, 0x09, 0x0a, 0x11, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x77, 0x12, 0x31, 0x0a, 0x08, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x46, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x61, 0x77, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x77, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3c, 0x0a, + 0x19, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4e, 0x6f, 0x6e, 0x63, 0x65, + 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x19, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x4b, 0x65, 0x79, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0f, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x12, 0x4c, 0x0a, 0x11, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x45, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x1a, + 0xbd, 0x05, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x06, 0x43, 0x65, 0x6e, + 0x63, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x77, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x45, 0x4e, 0x43, 0x52, 0x06, 0x43, 0x65, 0x6e, 0x63, 0x49, 0x64, + 0x12, 0x45, 0x0a, 0x06, 0x57, 0x65, 0x62, 0x6d, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x61, 0x77, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x57, 0x65, 0x62, 0x4d, 0x52, + 0x06, 0x57, 0x65, 0x62, 0x6d, 0x49, 0x64, 0x12, 0x52, 0x0a, 0x07, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x77, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x52, 0x07, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x1a, 0x68, 0x0a, 0x04, 0x43, + 0x45, 0x4e, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x73, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x50, 0x73, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x4c, + 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x49, 0x64, 0x1a, 0x6c, 0x0a, 0x04, 0x57, 0x65, 0x62, 0x4d, 0x12, 0x16, 0x0a, + 0x06, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x4c, 0x69, 0x63, + 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x49, 0x64, 0x1a, 0xe9, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x4c, 0x69, 0x63, + 0x65, 0x6e, 0x73, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x09, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, + 0x13, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, + 0x36, 0x0a, 0x16, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4c, + 0x61, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x16, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x4c, 0x61, 0x73, + 0x74, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, + 0x30, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, + 0x0a, 0x03, 0x4e, 0x45, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4e, 0x45, 0x57, + 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x10, + 0x03, 0x22, 0xfc, 0x02, 0x0a, 0x15, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x53, 0x6f, 0x63, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x53, 0x6f, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x6e, + 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x4d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x59, 0x65, 0x61, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x59, 0x65, 0x61, + 0x72, 0x12, 0x4c, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x57, 0x76, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, + 0x1e, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, + 0x4f, 0x0a, 0x0f, 0x57, 0x76, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x45, 0x56, + 0x45, 0x4c, 0x5f, 0x31, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, + 0x32, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x33, 0x10, 0x03, + 0x22, 0x15, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x16, + 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0b, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x53, 0x61, + 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x22, 0x0d, 0x0a, 0x0b, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x22, + 0x0e, 0x0a, 0x0c, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, + 0x1d, 0x0a, 0x1b, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xac, + 0x01, 0x0a, 0x17, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x12, 0x5f, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x11, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x06, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x22, 0x1b, 0x0a, + 0x19, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd0, 0x02, 0x0a, 0x0d, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x11, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7d, + 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, + 0x0f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x10, 0x02, 0x12, + 0x12, 0x0a, 0x0e, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, + 0x45, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, + 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, + 0x53, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x10, 0x05, 0x22, 0xd3, 0x03, + 0x0a, 0x12, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x43, 0x65, 0x6e, 0x63, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, + 0x6e, 0x65, 0x43, 0x65, 0x6e, 0x63, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x41, 0x6c, 0x67, + 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x52, 0x09, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, + 0x6d, 0x12, 0x15, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0c, 0x52, 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x44, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x2e, 0x0a, 0x13, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x6f, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x27, 0x0a, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x65, + 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x28, 0x0a, 0x09, 0x41, 0x6c, 0x67, + 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x45, 0x4e, 0x43, 0x52, + 0x59, 0x50, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x45, 0x53, 0x43, 0x54, + 0x52, 0x10, 0x01, 0x22, 0xef, 0x02, 0x0a, 0x14, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, + 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x74, + 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7d, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, + 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x49, + 0x43, 0x45, 0x4e, 0x53, 0x45, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x45, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, + 0x54, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, + 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, + 0x41, 0x54, 0x45, 0x10, 0x05, 0x22, 0xf8, 0x02, 0x0a, 0x17, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, + 0x77, 0x12, 0x38, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x24, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x77, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x03, 0x4d, + 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x61, 0x77, 0x52, 0x03, 0x4d, 0x73, + 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x12, + 0x40, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x7d, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, + 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, + 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x50, + 0x4f, 0x4e, 0x53, 0x45, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, + 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x52, 0x56, 0x49, + 0x43, 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x10, 0x05, + 0x22, 0xda, 0x02, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x08, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x11, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7d, + 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, + 0x0f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x10, 0x02, 0x12, + 0x12, 0x0a, 0x0e, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, + 0x45, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x43, + 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, + 0x53, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x10, 0x05, 0x22, 0x80, 0x03, + 0x0a, 0x18, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x03, 0x4d, 0x73, + 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x12, + 0x40, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x7d, 0x0a, 0x0b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, + 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, + 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x50, + 0x4f, 0x4e, 0x53, 0x45, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, + 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x45, 0x52, 0x56, 0x49, + 0x43, 0x45, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x10, 0x05, + 0x22, 0x81, 0x02, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x06, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x1a, 0xa3, + 0x01, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x65, 0x73, 0x74, + 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x53, + 0x48, 0x41, 0x35, 0x31, 0x32, 0x48, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0a, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x65, 0x78, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x6d, + 0x61, 0x69, 0x6e, 0x45, 0x78, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x2a, 0x31, 0x0a, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x46, + 0x46, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x02, 0x2a, 0x1e, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x55, + 0x52, 0x52, 0x45, 0x4e, 0x54, 0x10, 0x15, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x3b, 0x67, 0x65, 0x6e, +} + +var ( + file_wv_proto2_proto_rawDescOnce sync.Once + file_wv_proto2_proto_rawDescData = file_wv_proto2_proto_rawDesc +) + +func file_wv_proto2_proto_rawDescGZIP() []byte { + file_wv_proto2_proto_rawDescOnce.Do(func() { + file_wv_proto2_proto_rawDescData = protoimpl.X.CompressGZIP(file_wv_proto2_proto_rawDescData) + }) + return file_wv_proto2_proto_rawDescData +} + +var file_wv_proto2_proto_enumTypes = make([]protoimpl.EnumInfo, 19) +var file_wv_proto2_proto_msgTypes = make([]protoimpl.MessageInfo, 44) +var file_wv_proto2_proto_goTypes = []interface{}{ + (LicenseType)(0), // 0: LicenseType + (ProtocolVersion)(0), // 1: ProtocolVersion + (ClientIdentification_TokenType)(0), // 2: ClientIdentification.TokenType + (ClientIdentification_ClientCapabilities_HdcpVersion)(0), // 3: ClientIdentification.ClientCapabilities.HdcpVersion + (DeviceCertificate_CertificateType)(0), // 4: DeviceCertificate.CertificateType + (DeviceCertificateStatus_CertificateStatus)(0), // 5: DeviceCertificateStatus.CertificateStatus + (License_KeyContainer_KeyType)(0), // 6: License.KeyContainer.KeyType + (License_KeyContainer_SecurityLevel)(0), // 7: License.KeyContainer.SecurityLevel + (License_KeyContainer_OutputProtection_CGMS)(0), // 8: License.KeyContainer.OutputProtection.CGMS + (LicenseError_Error)(0), // 9: LicenseError.Error + (LicenseRequest_RequestType)(0), // 10: LicenseRequest.RequestType + (LicenseRequestRaw_RequestType)(0), // 11: LicenseRequestRaw.RequestType + (ProvisionedDeviceInfo_WvSecurityLevel)(0), // 12: ProvisionedDeviceInfo.WvSecurityLevel + (SignedMessage_MessageType)(0), // 13: SignedMessage.MessageType + (WidevineCencHeader_Algorithm)(0), // 14: WidevineCencHeader.Algorithm + (SignedLicenseRequest_MessageType)(0), // 15: SignedLicenseRequest.MessageType + (SignedLicenseRequestRaw_MessageType)(0), // 16: SignedLicenseRequestRaw.MessageType + (SignedLicense_MessageType)(0), // 17: SignedLicense.MessageType + (SignedServiceCertificate_MessageType)(0), // 18: SignedServiceCertificate.MessageType + (*ClientIdentification)(nil), // 19: ClientIdentification + (*DeviceCertificate)(nil), // 20: DeviceCertificate + (*DeviceCertificateStatus)(nil), // 21: DeviceCertificateStatus + (*DeviceCertificateStatusList)(nil), // 22: DeviceCertificateStatusList + (*EncryptedClientIdentification)(nil), // 23: EncryptedClientIdentification + (*LicenseIdentification)(nil), // 24: LicenseIdentification + (*License)(nil), // 25: License + (*LicenseError)(nil), // 26: LicenseError + (*LicenseRequest)(nil), // 27: LicenseRequest + (*LicenseRequestRaw)(nil), // 28: LicenseRequestRaw + (*ProvisionedDeviceInfo)(nil), // 29: ProvisionedDeviceInfo + (*ProvisioningOptions)(nil), // 30: ProvisioningOptions + (*ProvisioningRequest)(nil), // 31: ProvisioningRequest + (*ProvisioningResponse)(nil), // 32: ProvisioningResponse + (*RemoteAttestation)(nil), // 33: RemoteAttestation + (*SessionInit)(nil), // 34: SessionInit + (*SessionState)(nil), // 35: SessionState + (*SignedCertificateStatusList)(nil), // 36: SignedCertificateStatusList + (*SignedDeviceCertificate)(nil), // 37: SignedDeviceCertificate + (*SignedProvisioningMessage)(nil), // 38: SignedProvisioningMessage + (*SignedMessage)(nil), // 39: SignedMessage + (*WidevineCencHeader)(nil), // 40: WidevineCencHeader + (*SignedLicenseRequest)(nil), // 41: SignedLicenseRequest + (*SignedLicenseRequestRaw)(nil), // 42: SignedLicenseRequestRaw + (*SignedLicense)(nil), // 43: SignedLicense + (*SignedServiceCertificate)(nil), // 44: SignedServiceCertificate + (*FileHashes)(nil), // 45: FileHashes + (*ClientIdentification_NameValue)(nil), // 46: ClientIdentification.NameValue + (*ClientIdentification_ClientCapabilities)(nil), // 47: ClientIdentification.ClientCapabilities + (*License_Policy)(nil), // 48: License.Policy + (*License_KeyContainer)(nil), // 49: License.KeyContainer + (*License_KeyContainer_OutputProtection)(nil), // 50: License.KeyContainer.OutputProtection + (*License_KeyContainer_KeyControl)(nil), // 51: License.KeyContainer.KeyControl + (*License_KeyContainer_OperatorSessionKeyPermissions)(nil), // 52: License.KeyContainer.OperatorSessionKeyPermissions + (*License_KeyContainer_VideoResolutionConstraint)(nil), // 53: License.KeyContainer.VideoResolutionConstraint + (*LicenseRequest_ContentIdentification)(nil), // 54: LicenseRequest.ContentIdentification + (*LicenseRequest_ContentIdentification_CENC)(nil), // 55: LicenseRequest.ContentIdentification.CENC + (*LicenseRequest_ContentIdentification_WebM)(nil), // 56: LicenseRequest.ContentIdentification.WebM + (*LicenseRequest_ContentIdentification_ExistingLicense)(nil), // 57: LicenseRequest.ContentIdentification.ExistingLicense + (*LicenseRequestRaw_ContentIdentification)(nil), // 58: LicenseRequestRaw.ContentIdentification + (*LicenseRequestRaw_ContentIdentification_CENC)(nil), // 59: LicenseRequestRaw.ContentIdentification.CENC + (*LicenseRequestRaw_ContentIdentification_WebM)(nil), // 60: LicenseRequestRaw.ContentIdentification.WebM + (*LicenseRequestRaw_ContentIdentification_ExistingLicense)(nil), // 61: LicenseRequestRaw.ContentIdentification.ExistingLicense + (*FileHashes_Signature)(nil), // 62: FileHashes.Signature +} +var file_wv_proto2_proto_depIdxs = []int32{ + 2, // 0: ClientIdentification.Type:type_name -> ClientIdentification.TokenType + 37, // 1: ClientIdentification.Token:type_name -> SignedDeviceCertificate + 46, // 2: ClientIdentification.ClientInfo:type_name -> ClientIdentification.NameValue + 47, // 3: ClientIdentification._ClientCapabilities:type_name -> ClientIdentification.ClientCapabilities + 45, // 4: ClientIdentification._FileHashes:type_name -> FileHashes + 4, // 5: DeviceCertificate.Type:type_name -> DeviceCertificate.CertificateType + 5, // 6: DeviceCertificateStatus.Status:type_name -> DeviceCertificateStatus.CertificateStatus + 29, // 7: DeviceCertificateStatus.DeviceInfo:type_name -> ProvisionedDeviceInfo + 21, // 8: DeviceCertificateStatusList.CertificateStatus:type_name -> DeviceCertificateStatus + 0, // 9: LicenseIdentification.Type:type_name -> LicenseType + 24, // 10: License.Id:type_name -> LicenseIdentification + 48, // 11: License._Policy:type_name -> License.Policy + 49, // 12: License.Key:type_name -> License.KeyContainer + 9, // 13: LicenseError.ErrorCode:type_name -> LicenseError.Error + 19, // 14: LicenseRequest.ClientId:type_name -> ClientIdentification + 54, // 15: LicenseRequest.ContentId:type_name -> LicenseRequest.ContentIdentification + 10, // 16: LicenseRequest.Type:type_name -> LicenseRequest.RequestType + 1, // 17: LicenseRequest.ProtocolVersion:type_name -> ProtocolVersion + 23, // 18: LicenseRequest.EncryptedClientId:type_name -> EncryptedClientIdentification + 19, // 19: LicenseRequestRaw.ClientId:type_name -> ClientIdentification + 58, // 20: LicenseRequestRaw.ContentId:type_name -> LicenseRequestRaw.ContentIdentification + 11, // 21: LicenseRequestRaw.Type:type_name -> LicenseRequestRaw.RequestType + 1, // 22: LicenseRequestRaw.ProtocolVersion:type_name -> ProtocolVersion + 23, // 23: LicenseRequestRaw.EncryptedClientId:type_name -> EncryptedClientIdentification + 12, // 24: ProvisionedDeviceInfo.SecurityLevel:type_name -> ProvisionedDeviceInfo.WvSecurityLevel + 23, // 25: RemoteAttestation.Certificate:type_name -> EncryptedClientIdentification + 20, // 26: SignedDeviceCertificate._DeviceCertificate:type_name -> DeviceCertificate + 37, // 27: SignedDeviceCertificate.Signer:type_name -> SignedDeviceCertificate + 13, // 28: SignedMessage.Type:type_name -> SignedMessage.MessageType + 33, // 29: SignedMessage.RemoteAttestation:type_name -> RemoteAttestation + 14, // 30: WidevineCencHeader.algorithm:type_name -> WidevineCencHeader.Algorithm + 15, // 31: SignedLicenseRequest.Type:type_name -> SignedLicenseRequest.MessageType + 27, // 32: SignedLicenseRequest.Msg:type_name -> LicenseRequest + 33, // 33: SignedLicenseRequest.RemoteAttestation:type_name -> RemoteAttestation + 16, // 34: SignedLicenseRequestRaw.Type:type_name -> SignedLicenseRequestRaw.MessageType + 28, // 35: SignedLicenseRequestRaw.Msg:type_name -> LicenseRequestRaw + 33, // 36: SignedLicenseRequestRaw.RemoteAttestation:type_name -> RemoteAttestation + 17, // 37: SignedLicense.Type:type_name -> SignedLicense.MessageType + 25, // 38: SignedLicense.Msg:type_name -> License + 33, // 39: SignedLicense.RemoteAttestation:type_name -> RemoteAttestation + 18, // 40: SignedServiceCertificate.Type:type_name -> SignedServiceCertificate.MessageType + 37, // 41: SignedServiceCertificate.Msg:type_name -> SignedDeviceCertificate + 33, // 42: SignedServiceCertificate.RemoteAttestation:type_name -> RemoteAttestation + 62, // 43: FileHashes.signatures:type_name -> FileHashes.Signature + 3, // 44: ClientIdentification.ClientCapabilities.MaxHdcpVersion:type_name -> ClientIdentification.ClientCapabilities.HdcpVersion + 6, // 45: License.KeyContainer.Type:type_name -> License.KeyContainer.KeyType + 7, // 46: License.KeyContainer.Level:type_name -> License.KeyContainer.SecurityLevel + 50, // 47: License.KeyContainer.RequiredProtection:type_name -> License.KeyContainer.OutputProtection + 50, // 48: License.KeyContainer.RequestedProtection:type_name -> License.KeyContainer.OutputProtection + 51, // 49: License.KeyContainer._KeyControl:type_name -> License.KeyContainer.KeyControl + 52, // 50: License.KeyContainer._OperatorSessionKeyPermissions:type_name -> License.KeyContainer.OperatorSessionKeyPermissions + 53, // 51: License.KeyContainer.VideoResolutionConstraints:type_name -> License.KeyContainer.VideoResolutionConstraint + 3, // 52: License.KeyContainer.OutputProtection.Hdcp:type_name -> ClientIdentification.ClientCapabilities.HdcpVersion + 8, // 53: License.KeyContainer.OutputProtection.CgmsFlags:type_name -> License.KeyContainer.OutputProtection.CGMS + 50, // 54: License.KeyContainer.VideoResolutionConstraint.RequiredProtection:type_name -> License.KeyContainer.OutputProtection + 55, // 55: LicenseRequest.ContentIdentification.CencId:type_name -> LicenseRequest.ContentIdentification.CENC + 56, // 56: LicenseRequest.ContentIdentification.WebmId:type_name -> LicenseRequest.ContentIdentification.WebM + 57, // 57: LicenseRequest.ContentIdentification.License:type_name -> LicenseRequest.ContentIdentification.ExistingLicense + 40, // 58: LicenseRequest.ContentIdentification.CENC.Pssh:type_name -> WidevineCencHeader + 0, // 59: LicenseRequest.ContentIdentification.CENC.LicenseType:type_name -> LicenseType + 0, // 60: LicenseRequest.ContentIdentification.WebM.LicenseType:type_name -> LicenseType + 24, // 61: LicenseRequest.ContentIdentification.ExistingLicense.LicenseId:type_name -> LicenseIdentification + 59, // 62: LicenseRequestRaw.ContentIdentification.CencId:type_name -> LicenseRequestRaw.ContentIdentification.CENC + 60, // 63: LicenseRequestRaw.ContentIdentification.WebmId:type_name -> LicenseRequestRaw.ContentIdentification.WebM + 61, // 64: LicenseRequestRaw.ContentIdentification.License:type_name -> LicenseRequestRaw.ContentIdentification.ExistingLicense + 0, // 65: LicenseRequestRaw.ContentIdentification.CENC.LicenseType:type_name -> LicenseType + 0, // 66: LicenseRequestRaw.ContentIdentification.WebM.LicenseType:type_name -> LicenseType + 24, // 67: LicenseRequestRaw.ContentIdentification.ExistingLicense.LicenseId:type_name -> LicenseIdentification + 68, // [68:68] is the sub-list for method output_type + 68, // [68:68] is the sub-list for method input_type + 68, // [68:68] is the sub-list for extension type_name + 68, // [68:68] is the sub-list for extension extendee + 0, // [0:68] is the sub-list for field type_name +} + +func init() { file_wv_proto2_proto_init() } +func file_wv_proto2_proto_init() { + if File_wv_proto2_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_wv_proto2_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientIdentification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceCertificate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceCertificateStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceCertificateStatusList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EncryptedClientIdentification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseIdentification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*License); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseError); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequestRaw); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisionedDeviceInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisioningOptions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisioningRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProvisioningResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoteAttestation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SessionInit); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SessionState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedCertificateStatusList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedDeviceCertificate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedProvisioningMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WidevineCencHeader); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedLicenseRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedLicenseRequestRaw); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedLicense); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignedServiceCertificate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FileHashes); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientIdentification_NameValue); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientIdentification_ClientCapabilities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*License_Policy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*License_KeyContainer); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*License_KeyContainer_OutputProtection); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*License_KeyContainer_KeyControl); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*License_KeyContainer_OperatorSessionKeyPermissions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*License_KeyContainer_VideoResolutionConstraint); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequest_ContentIdentification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequest_ContentIdentification_CENC); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequest_ContentIdentification_WebM); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequest_ContentIdentification_ExistingLicense); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequestRaw_ContentIdentification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequestRaw_ContentIdentification_CENC); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequestRaw_ContentIdentification_WebM); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LicenseRequestRaw_ContentIdentification_ExistingLicense); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wv_proto2_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FileHashes_Signature); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_wv_proto2_proto_rawDesc, + NumEnums: 19, + NumMessages: 44, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_wv_proto2_proto_goTypes, + DependencyIndexes: file_wv_proto2_proto_depIdxs, + EnumInfos: file_wv_proto2_proto_enumTypes, + MessageInfos: file_wv_proto2_proto_msgTypes, + }.Build() + File_wv_proto2_proto = out.File + file_wv_proto2_proto_rawDesc = nil + file_wv_proto2_proto_goTypes = nil + file_wv_proto2_proto_depIdxs = nil +} diff --git a/utils/runv3/key/key.go b/utils/runv3/key/key.go new file mode 100644 index 0000000..6a4731f --- /dev/null +++ b/utils/runv3/key/key.go @@ -0,0 +1,73 @@ +package wv + +import ( + "context" + "encoding/base64" + "encoding/hex" + "github.com/gospider007/requests" + "log/slog" + "main/utils/runv3/cdm" +) + +type Key struct { + ReqCli *requests.Client + BeforeRequest func(cl *requests.Client, preCtx context.Context, method string, href string, options ...requests.RequestOption) (resp *requests.Response, err error) + AfterRequest func(*requests.Response) ([]byte, error) +} + +func (w *Key) CdmInit() { + wv.InitConstants() +} +func (w *Key) GetKey(ctx context.Context, licenseServerURL string, PSSH string, headers map[string][]string) (string, []byte, error) { + initData, err := base64.StdEncoding.DecodeString(PSSH) + var keybt []byte + if err != nil { + slog.Error("pssh decode error: %v", err) + return "", keybt, err + } + cdm, err := wv.NewDefaultCDM(initData) + if err != nil { + slog.Error("cdm init error: %v", err) + return "", keybt, err + } + licenseRequest, err := cdm.GetLicenseRequest() + if err != nil { + slog.Error("license request error: %v", err) + return "", keybt, err + } + var response *requests.Response + if w.BeforeRequest != nil { + response, err = w.BeforeRequest(w.ReqCli, ctx, "post", licenseServerURL, requests.RequestOption{ + Data: licenseRequest, + }) + } else { + response, err = w.ReqCli.Request(nil, "post", licenseServerURL, requests.RequestOption{ + Data: licenseRequest, + }) + } + + if err != nil { + slog.Error("license request error: %s", err) + return "", keybt, err + } + var licenseResponse []byte + if w.AfterRequest != nil { + licenseResponse, err = w.AfterRequest(response) + if err != nil { + return "", keybt, err + } + } else { + licenseResponse = response.Content() + } + keys, err := cdm.GetLicenseKeys(licenseRequest, licenseResponse) + command := "" + + for _, key := range keys { + if key.Type == wv.License_KeyContainer_CONTENT { + // command += "--key " + hex.EncodeToString(key.ID) + ":" + hex.EncodeToString(key.Value) + command += hex.EncodeToString(key.Value) + keybt = key.Value + } + } + return command, keybt, nil +} diff --git a/utils/runv3/runv3.go b/utils/runv3/runv3.go new file mode 100644 index 0000000..9b8d147 --- /dev/null +++ b/utils/runv3/runv3.go @@ -0,0 +1,354 @@ +package runv3 + +import ( + "context" + "encoding/base64" + "fmt" + "github.com/gospider007/requests" + "google.golang.org/protobuf/proto" + //"log/slog" + "os" + cdm "main/utils/runv3/cdm" + key "main/utils/runv3/key" + + "github.com/Eyevinn/mp4ff/mp4" + "bytes" + "io" + "errors" + + //"io/ioutil" + "net/http" + "encoding/json" + "github.com/grafov/m3u8" + "strings" + "github.com/schollz/progressbar/v3" +) + +type PlaybackLicense struct { + ErrorCode int `json:"errorCode"` + License string `json:"license"` + RenewAfter int `json:"renew-after"` + Status int `json:"status"` +} + +// func log() { +// f, err := os.OpenFile("log.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) +// if err != nil { +// slog.Error("error opening file: %s", err) +// } +// defer func(f *os.File) { +// err := f.Close() +// if err != nil { +// slog.Error("error closing file: %s", err) +// } +// }(f) +// opts := slog.HandlerOptions{ +// AddSource: true, +// Level: slog.LevelDebug, +// } +// logger := slog.New(slog.NewJSONHandler(os.Stdout, &opts)) +// slog.SetDefault(logger) +//} +func getPSSH(contentId string, kidBase64 string) (string, error) { + kidBytes, err := base64.StdEncoding.DecodeString(kidBase64) + if err != nil { + return "", fmt.Errorf("failed to decode base64 KID: %v", err) + } + contentIdEncoded := base64.StdEncoding.EncodeToString([]byte(contentId)) + algo := cdm.WidevineCencHeader_AESCTR + widevineCencHeader := &cdm.WidevineCencHeader{ + KeyId: [][]byte{kidBytes}, + Algorithm: &algo, + Provider: new(string), + ContentId: []byte(contentIdEncoded), + Policy: new(string), + } + widevineCenc, err := proto.Marshal(widevineCencHeader) + if err != nil { + return "", fmt.Errorf("failed to marshal WidevineCencHeader: %v", err) + } + //最前面添加32字节 + widevineCenc = append([]byte("0123456789abcdef0123456789abcdef"), widevineCenc...) + pssh := base64.StdEncoding.EncodeToString(widevineCenc) + return pssh, nil +} +func BeforeRequest(cl *requests.Client, preCtx context.Context, method string, href string, options ...requests.RequestOption) (resp *requests.Response, err error) { + data := options[0].Data + jsondata := map[string]interface{}{ + "challenge": base64.StdEncoding.EncodeToString(data.([]byte)), + "key-system": "com.widevine.alpha", + "uri": "data:;base64," + preCtx.Value("pssh").(string), + "adamId": preCtx.Value("adamId").(string), + "isLibrary": false, + "user-initiated": true, + } + options[0].Data = nil + options[0].Json = jsondata + resp, err = cl.Request(preCtx, method, href, options...) + if err != nil { + fmt.Println(err) + } + + return +} +func AfterRequest(Response *requests.Response) ([]byte, error) { + var ResponseData PlaybackLicense + _, err := Response.Json(&ResponseData) + if err != nil { + return nil, fmt.Errorf("failed to parse response: %v", err) + } + if ResponseData.ErrorCode != 0 || ResponseData.Status != 0 { + return nil, fmt.Errorf("error code: %d", ResponseData.ErrorCode) + } + License, err := base64.StdEncoding.DecodeString(ResponseData.License) + if err != nil { + return nil, fmt.Errorf("failed to decode license: %v", err) + } + return License, nil +} +func getWebplayback(adamId string, authtoken string, mutoken string) (string, string, error) { + url := "https://play.music.apple.com/WebObjects/MZPlay.woa/wa/webPlayback" + postData := map[string]string{ + "salableAdamId": adamId, + } + jsonData, err := json.Marshal(postData) + if err != nil { + fmt.Println("Error encoding JSON:", err) + return "", "", err + } + req, err := http.NewRequest("POST", url, bytes.NewBuffer([]byte(jsonData))) + if err != nil { + fmt.Println("Error creating request:", err) + return "", "", err + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Origin", "https://music.apple.com") + req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36") + req.Header.Set("Referer", "https://music.apple.com/") + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", authtoken)) + req.Header.Set("x-apple-music-user-token", mutoken) + // 创建 HTTP 客户端 + //client := &http.Client{} + resp, err := http.DefaultClient.Do(req) + // 发送请求 + //resp, err := client.Do(req) + if err != nil { + fmt.Println("Error sending request:", err) + return "", "", err + } + defer resp.Body.Close() + //fmt.Println("Response Status:", resp.Status) + obj := new(Songlist) + err = json.NewDecoder(resp.Body).Decode(&obj) + if err != nil { + fmt.Println("json err:", err) + return "", "", err + } + if len(obj.List) > 0 { + // 遍历 Assets + for i, _ := range obj.List[0].Assets { + if obj.List[0].Assets[i].Flavor == "28:ctrp256" { + kidBase64, fileurl, err := extractKidBase64(obj.List[0].Assets[i].URL) + if err != nil { + return "", "", err + } + return fileurl, kidBase64, nil + } + continue + } + } + return "", "", nil +} +type Songlist struct { + List []struct { + Hlsurl string `json:"hls-key-cert-url"` + Assets []struct { + Flavor string `json:"flavor"` + URL string `json:"URL"` + }`json:"assets"` + }`json:"songList"` + Status int `json:"status"` +} + +func extractKidBase64(b string) (string, string, error) { + resp, err := http.Get(b) + if err != nil { + return "", "", err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return "", "", errors.New(resp.Status) + } + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", "", err + } + masterString := string(body) + from, listType, err := m3u8.DecodeFrom(strings.NewReader(masterString), true) + if err != nil { + return "", "", err + } + var kidbase64 string + var fileurl string + if listType == m3u8.MEDIA { + mediaPlaylist := from.(*m3u8.MediaPlaylist) + if mediaPlaylist.Key != nil { + split := strings.Split(mediaPlaylist.Key.URI, ",") + kidbase64 = split[1] + lastSlashIndex := strings.LastIndex(b, "/") + // 截取最后一个斜杠之前的部分 + fileurl = b[:lastSlashIndex] + "/" + mediaPlaylist.Map.URI + //fmt.Println("Extracted URI:", mediaPlaylist.Map.URI) + } else { + fmt.Println("No key information found") + } + } else { + fmt.Println("Not a media playlist") + } + return kidbase64, fileurl, nil +} +func extsong(b string)(bytes.Buffer){ + resp, err := http.Get(b) + if err != nil { + fmt.Printf("下载文件失败: %v\n", err) + } + defer resp.Body.Close() + var buffer bytes.Buffer + bar := progressbar.NewOptions64( + resp.ContentLength, + progressbar.OptionClearOnFinish(), + progressbar.OptionSetElapsedTime(false), + progressbar.OptionSetPredictTime(false), + progressbar.OptionShowElapsedTimeOnFinish(), + progressbar.OptionShowCount(), + progressbar.OptionEnableColorCodes(true), + progressbar.OptionShowBytes(true), + progressbar.OptionSetDescription("Downloading..."), + progressbar.OptionSetTheme(progressbar.Theme{ + Saucer: "", + SaucerHead: "", + SaucerPadding: "", + BarStart: "", + BarEnd: "", + }), + ) + io.Copy(io.MultiWriter(&buffer, bar), resp.Body) + return buffer +} +func Run(adamId string, trackpath string, authtoken string, mutoken string)(error) { + + fileurl, kidBase64, err := getWebplayback(adamId, authtoken, mutoken) + if err != nil { + return err + } + ctx := context.Background() + ctx = context.WithValue(ctx, "pssh", kidBase64) + ctx = context.WithValue(ctx, "adamId", adamId) + pssh, err := getPSSH("", kidBase64) + //fmt.Println(pssh) + if err != nil { + fmt.Println(err) + return err + } + headers := map[string]interface{}{ + "authorization": "Bearer " + authtoken, + "x-apple-music-user-token": mutoken, + } + client, _ := requests.NewClient(nil, requests.ClientOption{ + Headers: headers, + }) + key := key.Key{ + ReqCli: client, + BeforeRequest: BeforeRequest, + AfterRequest: AfterRequest, + } + key.CdmInit() + _, keybt, err := key.GetKey(ctx, "https://play.itunes.apple.com/WebObjects/MZPlay.woa/wa/acquireWebPlaybackLicense", pssh, nil) + if err != nil { + fmt.Println(err) + return err + } + body := extsong(fileurl) + fmt.Print("Downloaded\n") + //bodyReader := bytes.NewReader(body) + var buffer bytes.Buffer + + err = DecryptMP4(&body, keybt, &buffer) + if err != nil { + fmt.Print("Decryption failed\n") + return err + } else { + fmt.Print("Decrypted\n") + } + // create output file + ofh, err := os.Create(trackpath) + if err != nil { + fmt.Printf("创建文件失败: %v\n", err) + return err + } + defer ofh.Close() + + _, err = ofh.Write(buffer.Bytes()) + if err != nil { + fmt.Printf("写入文件失败: %v\n", err) + return err + } + return nil +} +// DecryptMP4Auto decrypts a fragmented MP4 file with the set of keys retreived from the widevice license +// by automatically selecting the appropriate key. Supports CENC and CBCS schemes. +// func DecryptMP4Auto(r io.Reader, keys []*Key, w io.Writer) error { +// // Extract content key +// var key []byte +// for _, k := range keys { +// if k.Type == wvpb.License_KeyContainer_CONTENT { +// key = k.Key +// break +// } +// } +// if key == nil { +// return fmt.Errorf("no %s key type found in the provided key set", wvpb.License_KeyContainer_CONTENT) +// } +// // Execute decryption +// return DecryptMP4(r, key, w) +// } + +// DecryptMP4 decrypts a fragmented MP4 file with keys from widevice license. Supports CENC and CBCS schemes. +func DecryptMP4(r io.Reader, key []byte, w io.Writer) error { + // Initialization + inMp4, err := mp4.DecodeFile(r) + if err != nil { + return fmt.Errorf("failed to decode file: %w", err) + } + if !inMp4.IsFragmented() { + return errors.New("file is not fragmented") + } + // Handle init segment + if inMp4.Init == nil { + return errors.New("no init part of file") + } + decryptInfo, err := mp4.DecryptInit(inMp4.Init) + if err != nil { + return fmt.Errorf("failed to decrypt init: %w", err) + } + if err = inMp4.Init.Encode(w); err != nil { + return fmt.Errorf("failed to write init: %w", err) + } + // Decode segments + for _, seg := range inMp4.Segments { + if err = mp4.DecryptSegment(seg, decryptInfo, key); err != nil { + if err.Error() == "no senc box in traf" { + // No SENC box, skip decryption for this segment as samples can have + // unencrypted segments followed by encrypted segments. See: + // https://github.com/iyear/gowidevine/pull/26#issuecomment-2385960551 + err = nil + } else { + return fmt.Errorf("failed to decrypt segment: %w", err) + } + } + if err = seg.Encode(w); err != nil { + return fmt.Errorf("failed to encode segment: %w", err) + } + } + return nil +}