diff --git a/.env b/.env index 33bc1ff7..4855d5b5 100644 --- a/.env +++ b/.env @@ -7,4 +7,4 @@ APNS_P8_FILE_PATH=/secrets/AuthKey_XXXX.p8 ENVIRONMENT=dev -SENTRY_DSN= \ No newline at end of file +SENTRY_DSN= diff --git a/.github/workflows/ci.yml b/.github/workflows/lint.yml similarity index 76% rename from .github/workflows/ci.yml rename to .github/workflows/lint.yml index 92b0e5a9..1689fa86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/lint.yml @@ -1,14 +1,12 @@ -name: CI +name: lint on: - push: - branches: [ main ] pull_request: permissions: contents: read jobs: - ci: + lint: name: lint runs-on: ubuntu-latest steps: @@ -29,3 +27,7 @@ jobs: version: v1.54 working-directory: client args: --timeout=30m + - run: go install golang.org/x/tools/cmd/goimports@latest + - run: bash server/api/installBuf.bash + - name: pre-commit + uses: pre-commit/action@v3.0.0 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3a06b89a..48d0b6b6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,8 +5,21 @@ on: pull_request: branches: [ main ] jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: '1.21' + cache-dependency-path: | + server/go.sum + - name: run tests + run: go test -v ./... + working-directory: ./server build: runs-on: ubuntu-latest + needs: [test] steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.gitignore b/.gitignore index 9f278687..57fd5fe6 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,4 @@ __debug_bin .env.local apns_auth_key.p8 - +venv diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..d6fc231d --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,39 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-json + exclude: vscode/launch.json + - id: check-yaml + exclude: deployment/.* + - id: check-added-large-files + - repo: https://github.com/dnephin/pre-commit-golang + rev: v0.5.0 + hooks: + - id: go-fmt + - id: go-imports + - repo: local + hooks: + - id: regen-protobuf + name: Regenerate protobuf files + files: server/api/ + entry: bash server/api/generate.bash + language: system + pass_filenames: false + stages: [commit] + - id: go-mod-tidy-server + name: Check if go.mod and go.sum are up to date for server + files: server/ + entry: sh -c "(cd server && go mod tidy)" + language: system + pass_filenames: false + stages: [commit] + - id: go-mod-tidy-client + name: Check if go.mod and go.sum are up to date for server + files: server/ + entry: sh -c "(cd client && go get github.com/TUM-Dev/Campus-Backend/server && go mod tidy)" + language: system + pass_filenames: false + stages: [commit] diff --git a/.vscode/launch.json b/.vscode/launch.json index f4211857..ec27b2c2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -29,4 +29,4 @@ "program": "${workspaceFolder}/client/publicServer/client.go", } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index 2c29a84b..9617731c 100644 --- a/README.md +++ b/README.md @@ -122,3 +122,18 @@ Take a look at the [`lauch.json`](.vscode/launch.json) file for more details. Please be respectful with its usage! + +## pre-commit + +To ensure that that common pitfalls which can be automated are not done, we recommend you to install `pre-commit`. +You can do so via + +```bash +python -m venv venv +source venv/bin/activate +pip install pre-commit +pre-commit install +``` + +Certain `pre-commit` hooks will now be run on every commit where you change specific files. +If you want to run all files instead, run `pre-commit run -a` diff --git a/client/README.md b/client/README.md index fb333780..0a487f6b 100644 --- a/client/README.md +++ b/client/README.md @@ -6,4 +6,4 @@ standard system TLS CA's configured to securely connect via `api-grpc.tum.app` t Alternatively you can also test the API using [grpcurl](https://github.com/fullstorydev/grpcurl) (also located in the `testLiveApi.sh`): ``` grpcurl -protoset <(buf build -o -) -H "x-device-id:grpc-tests" api-grpc.tum.app:443 api.Campus/GetNewsSources -``` \ No newline at end of file +``` diff --git a/client/go.mod b/client/go.mod index 2dd88216..7915adde 100644 --- a/client/go.mod +++ b/client/go.mod @@ -3,19 +3,19 @@ module github.com/TUM-Dev/Campus-Backend/client go 1.21 require ( - github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230913203125-6bbe13013fa5 + github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230919162132-71bec88330f7 github.com/sirupsen/logrus v1.9.3 - google.golang.org/grpc v1.58.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/grpc v1.58.1 ) require ( github.com/golang/protobuf v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect + golang.org/x/net v0.15.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect + google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb // indirect + google.golang.org/protobuf v1.31.0 // indirect ) diff --git a/client/go.sum b/client/go.sum index 128161a1..a8611e9f 100644 --- a/client/go.sum +++ b/client/go.sum @@ -1,5 +1,5 @@ -github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230913203125-6bbe13013fa5 h1:/yMB5hJjFjEPB/HVP6wLTJWGqoCqQksXke+DiV2xUWY= -github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230913203125-6bbe13013fa5/go.mod h1:7XoRdXmxK852GxcyraiovgyS5z/eZ9wsofV9on7wvGQ= +github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230919162132-71bec88330f7 h1:TDgiN5Z1vi3V0Qo94MIXURiD9+U7TGiRtiUIqN/rulo= +github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230919162132-71bec88330f7/go.mod h1:fjoLL3rbdY6wTRJIksekT2p3OUp5ocFfXjB/avV/TVI= 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= @@ -11,8 +11,8 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 h1:LSsiG61v9IzzxMkqEr6nrix4miJI62xlRjwT7BYD2SM= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= @@ -21,22 +21,22 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= -google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb h1:XFBgcDwm7irdHTbz4Zk2h7Mh+eis4nfJEFQFYzJzuIA= +google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb h1:Isk1sSH7bovx8Rti2wZK0UZF6oraBDK74uoyLEEVFN0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230913181813-007df8e322eb/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.58.1 h1:OL+Vz23DTtrrldqHK49FUOPHyY75rvFqJfXC84NYW58= +google.golang.org/grpc v1.58.1/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= diff --git a/client/localServer/client.go b/client/localServer/client.go index 813c8ae7..eb6e03d6 100644 --- a/client/localServer/client.go +++ b/client/localServer/client.go @@ -22,7 +22,7 @@ const ( testImage = "./localServer/images/sampleimage.jpeg" ) -// main connects to a seperatly started local server and creates ratings for both, cafeterias and dishes. +// main connects to a seperatly started local server and creates ratings for both, canteens and dishes. // Afterwards, they are queried and displayed on the console func main() { // Set up a connection to the local server. @@ -38,7 +38,7 @@ func main() { canteenHeadCount(c, ctx) - cafeteriaRatingTools(c, ctx) + canteenRatingTools(c, ctx) } @@ -54,28 +54,28 @@ func canteenHeadCount(c pb.CampusClient, ctx context.Context) { } } -func cafeteriaRatingTools(c pb.CampusClient, ctx context.Context) { +func canteenRatingTools(c pb.CampusClient, ctx context.Context) { - currentCafeteria := "MENSA_GARCHING" + currentCanteen := "MENSA_GARCHING" currentDish := "Vegane rote Grütze mit Soja-Vanillesauce" //must be in the dish table - generateDishRating(c, ctx, currentCafeteria, currentDish, 3) - generateCafeteriaRating(c, ctx, currentCafeteria, 2) - queryCafeteria(currentCafeteria, c, ctx, true) - queryDish(currentCafeteria, currentDish, c, ctx, false) - generateCafeteriaRating(c, ctx, currentCafeteria, 2) - generateCafeteriaRating(c, ctx, currentCafeteria, 2) - generateDishRating(c, ctx, currentCafeteria, currentDish, 1) + generateDishRating(c, ctx, currentCanteen, currentDish, 3) + generateCanteenRating(c, ctx, currentCanteen, 2) + queryCanteen(currentCanteen, c, ctx, true) + queryDish(currentCanteen, currentDish, c, ctx, false) + generateCanteenRating(c, ctx, currentCanteen, 2) + generateCanteenRating(c, ctx, currentCanteen, 2) + generateDishRating(c, ctx, currentCanteen, currentDish, 1) - queryCafeteria(currentCafeteria, c, ctx, false) - queryDish(currentCafeteria, currentDish, c, ctx, false) + queryCanteen(currentCanteen, c, ctx, false) + queryDish(currentCanteen, currentDish, c, ctx, false) } -func queryDish(cafeteria string, dish string, c pb.CampusClient, ctx context.Context, imageShouldBeStored bool) { - res, err := c.GetDishRatings(ctx, &pb.DishRatingRequest{ - Dish: dish, - CafeteriaId: cafeteria, - Limit: 3, +func queryDish(canteen string, dish string, c pb.CampusClient, ctx context.Context, imageShouldBeStored bool) { + res, err := c.GetDishRatings(ctx, &pb.GetDishRatingsRequest{ + Dish: dish, + CanteenId: canteen, + Limit: 3, }) if err != nil { @@ -129,10 +129,10 @@ func queryDish(cafeteria string, dish string, c pb.CampusClient, ctx context.Con } } -func queryCafeteria(s string, c pb.CampusClient, ctx context.Context, imageShouldBeStored bool) { - res, err := c.GetCafeteriaRatings(ctx, &pb.CafeteriaRatingRequest{ - CafeteriaId: s, - Limit: 3, +func queryCanteen(s string, c pb.CampusClient, ctx context.Context, imageShouldBeStored bool) { + res, err := c.GetCanteenRatings(ctx, &pb.GetCanteenRatingsRequest{ + CanteenId: s, + Limit: 3, // From: timestamppb.New(time.Date(2022, 7, 8, 16, 0, 0, 0, time.Local)), // To: timestamppb.New(time.Date(2022, 7, 8, 17, 0, 0, 0, time.Local)), }) @@ -178,7 +178,7 @@ func queryCafeteria(s string, c pb.CampusClient, ctx context.Context, imageShoul } } -func generateCafeteriaRating(c pb.CampusClient, ctx context.Context, cafeteria string, rating int32) { +func generateCanteenRating(c pb.CampusClient, ctx context.Context, canteen string, rating int32) { y := make([]*pb.RatingTag, 2) y[0] = &pb.RatingTag{ Points: float64(1 + rating), @@ -189,12 +189,12 @@ func generateCafeteriaRating(c pb.CampusClient, ctx context.Context, cafeteria s TagId: 2, } - _, err := c.NewCafeteriaRating(ctx, &pb.NewCafeteriaRatingRequest{ - Points: rating, - CafeteriaId: cafeteria, - Comment: "Alles super, 2 Sterne", - RatingTags: y, - Image: getImageToBytes(testImage), + _, err := c.NewCanteenRating(ctx, &pb.NewCanteenRatingRequest{ + Points: rating, + CanteenId: canteen, + Comment: "Alles super, 2 Sterne", + RatingTags: y, + Image: getImageToBytes(testImage), }) if err != nil { @@ -204,7 +204,7 @@ func generateCafeteriaRating(c pb.CampusClient, ctx context.Context, cafeteria s } } -func generateDishRating(c pb.CampusClient, ctx context.Context, cafeteria string, dish string, rating int32) { +func generateDishRating(c pb.CampusClient, ctx context.Context, canteen string, dish string, rating int32) { y := make([]*pb.RatingTag, 3) y[0] = &pb.RatingTag{ Points: float64(1 + rating), @@ -220,12 +220,12 @@ func generateDishRating(c pb.CampusClient, ctx context.Context, cafeteria string } _, err := c.NewDishRating(ctx, &pb.NewDishRatingRequest{ - Points: rating, - CafeteriaId: cafeteria, - Dish: dish, - Comment: "Alles Hähnchen", - RatingTags: y, - Image: getImageToBytes(testImage), + Points: rating, + CanteenId: canteen, + Dish: dish, + Comment: "Alles Hähnchen", + RatingTags: y, + Image: getImageToBytes(testImage), }) if err != nil { diff --git a/client/publicServer/client.go b/client/publicServer/client.go index cc5a0fbd..069bf010 100644 --- a/client/publicServer/client.go +++ b/client/publicServer/client.go @@ -3,13 +3,13 @@ package main import ( "context" "crypto/x509" + "time" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" log "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" - "google.golang.org/protobuf/types/known/emptypb" - "time" ) const ( @@ -42,7 +42,7 @@ func main() { ctx = metadata.NewOutgoingContext(ctx, md) log.Info("Trying to fetch top news") - if r, err := c.GetTopNews(ctx, &emptypb.Empty{}); err != nil { + if r, err := c.GetTopNews(ctx, &pb.GetTopNewsRequest{}); err != nil { log.WithError(err).Fatal("could not greet") } else { log.WithField("topNewsResponse", r.String()).Info("fetched top news successfully") diff --git a/client/testLiveApi.sh b/client/testLiveApi.sh index 5dcac3b8..9a798bc6 100755 --- a/client/testLiveApi.sh +++ b/client/testLiveApi.sh @@ -1,3 +1,3 @@ #!/bin/bash -grpcurl -protoset <(buf build -o -) -plaintext -H "x-device-id:grpc-tests" api.tum.app:50052 api.Campus/GetNewsSources \ No newline at end of file +grpcurl -protoset <(buf build -o -) -plaintext -H "x-device-id:grpc-tests" api.tum.app:50052 api.Campus/GetNewsSources diff --git a/deployment/charts/backend/Chart.yaml b/deployment/charts/backend/Chart.yaml index cbc0eb46..b09fbeb3 100644 --- a/deployment/charts/backend/Chart.yaml +++ b/deployment/charts/backend/Chart.yaml @@ -13,4 +13,4 @@ dependencies: - condition: mariadb.enabled name: mariadb repository: https://charts.bitnami.com/bitnami - version: 12.x.x \ No newline at end of file + version: 12.x.x diff --git a/deployment/charts/backend/templates/deployments/backend-v1.yaml b/deployment/charts/backend/templates/deployments/backend-v1.yaml index 4f1cb86e..5d572c7e 100644 --- a/deployment/charts/backend/templates/deployments/backend-v1.yaml +++ b/deployment/charts/backend/templates/deployments/backend-v1.yaml @@ -40,6 +40,18 @@ spec: - name: logs emptyDir: { } containers: + - name: access-legacybackend + image: busybox:1.36 + args: [/bin/sh, -c, 'tail -n+1 -F /var/log/apache2/access.log'] + volumeMounts: + - name: logs + mountPath: /var/log + - name: error-legacybackend + image: busybox:1.36 + args: [/bin/sh, -c, 'tail -n+1 -F /var/log/apache2/error.log'] + volumeMounts: + - name: logs + mountPath: /var/log - name: tca-legacybackend image: ghcr.io/kordianbruck/tca-backend/tca-server:{{ $.Values.tag }} imagePullPolicy: Always diff --git a/deployment/charts/backend/templates/deployments/hpas.yaml b/deployment/charts/backend/templates/deployments/hpas.yaml index deb358c6..950f7480 100644 --- a/deployment/charts/backend/templates/deployments/hpas.yaml +++ b/deployment/charts/backend/templates/deployments/hpas.yaml @@ -21,4 +21,4 @@ spec: target: type: Utilization averageUtilization: 75 -{{ end }} \ No newline at end of file +{{ end }} diff --git a/docker-compose.yaml b/docker-compose.yaml index 4a4a9174..a7d45018 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -46,4 +46,4 @@ volumes: campus-db-data: driver: local backend-storage: - driver: local \ No newline at end of file + driver: local diff --git a/server/api/README.md b/server/api/README.md index e32ff757..8686f585 100644 --- a/server/api/README.md +++ b/server/api/README.md @@ -51,12 +51,12 @@ Follow the installation instructions detailed here: https://docs.buf.build/insta Alternatively, we have prepared this installation script: ```shell -sh installBuf.sh +sh installBuf.bash ``` ## Generating -Once you have installed all dependencies, run `./generate.sh` to update the client and server `Protocol Buffers` definitions. +Once you have installed all dependencies, run `./generate.bash` to update the client and server `Protocol Buffers` definitions. # Common Issues diff --git a/server/api/generate.bash b/server/api/generate.bash new file mode 100755 index 00000000..3877b37e --- /dev/null +++ b/server/api/generate.bash @@ -0,0 +1,26 @@ +#!/bin/bash + +# needs buf: https://docs.buf.build/installation#github-releases +BASEDIR=$(dirname "$0") +echo making sure that this script is run from $BASEDIR +pushd $BASEDIR > /dev/null + +echo updating the generated files +export PATH="$PATH:$(go env GOPATH)/bin" +buf mod update || exit 1 +buf generate || exit 1 + +echo making sure the openapi document points to the valid api +grep -q '"basePath": "/v1"' ./tumdev/campus_backend.swagger.json || sed -i '1 a "basePath": "/v1",' ./tumdev/campus_backend.swagger.json + +echo making sure that all artifacts we don\'t need are cleaned up +rm -f google/api/*.go +rm -f google/api/*.swagger.json + +echo maing sure that the generated files are formatted +go fmt tumdev/*.go || exit 1 +goimports -w tumdev/*.go || exit 1 +buf format -w --path tumdev || exit 1 + +# clean up the stack +popd > /dev/null diff --git a/server/api/generate.sh b/server/api/generate.sh deleted file mode 100755 index 7c0505b1..00000000 --- a/server/api/generate.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - -# needs buf: https://docs.buf.build/installation#github-releases - -echo updating the generated files -buf mod update -buf generate - -echo making sure the openapi document points to the valid api -sed -i '1 a "basePath": "/v1",' ./tumdev/campus_backend.swagger.json - -echo making sure that all artifacts we don\'t need are cleaned up -rm -f google/api/*.go -rm -f google/api/*.swagger.json - diff --git a/server/api/installBuf.sh b/server/api/installBuf.bash similarity index 58% rename from server/api/installBuf.sh rename to server/api/installBuf.bash index dcd6f597..4c0712bc 100755 --- a/server/api/installBuf.sh +++ b/server/api/installBuf.bash @@ -1,9 +1,17 @@ #!/bin/bash +BASEDIR=$(dirname "$0") +echo making sure that this script is run from $BASEDIR +pushd $BASEDIR > /dev/null + +echo downloading... go get github.com/bufbuild/buf/cmd/buf \ + github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway \ + github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 \ google.golang.org/protobuf/cmd/protoc-gen-go \ google.golang.org/grpc/cmd/protoc-gen-go-grpc +echo installing... go install \ github.com/bufbuild/buf/cmd/buf \ github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway \ @@ -11,4 +19,8 @@ go install \ google.golang.org/protobuf/cmd/protoc-gen-go \ google.golang.org/grpc/cmd/protoc-gen-go-grpc -go mod tidy \ No newline at end of file + +echo tidiing up +go mod tidy + +popd diff --git a/server/api/tumdev/campus_backend.pb.go b/server/api/tumdev/campus_backend.pb.go index de451d26..49017bf5 100644 --- a/server/api/tumdev/campus_backend.pb.go +++ b/server/api/tumdev/campus_backend.pb.go @@ -7,13 +7,13 @@ package api import ( + reflect "reflect" + sync "sync" + _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( @@ -77,9 +77,9 @@ type RegisterDeviceRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` - PublicKey *string `protobuf:"bytes,2,opt,name=publicKey,proto3,oneof" json:"publicKey,omitempty"` - DeviceType DeviceType `protobuf:"varint,3,opt,name=deviceType,proto3,enum=api.DeviceType" json:"deviceType,omitempty"` + DeviceId string `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + PublicKey *string `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3,oneof" json:"public_key,omitempty"` + DeviceType DeviceType `protobuf:"varint,3,opt,name=device_type,json=deviceType,proto3,enum=api.DeviceType" json:"device_type,omitempty"` } func (x *RegisterDeviceRequest) Reset() { @@ -140,7 +140,7 @@ type RegisterDeviceReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` + DeviceId string `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` } func (x *RegisterDeviceReply) Reset() { @@ -187,8 +187,8 @@ type RemoveDeviceRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` - DeviceType DeviceType `protobuf:"varint,2,opt,name=deviceType,proto3,enum=api.DeviceType" json:"deviceType,omitempty"` + DeviceId string `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` + DeviceType DeviceType `protobuf:"varint,2,opt,name=device_type,json=deviceType,proto3,enum=api.DeviceType" json:"device_type,omitempty"` } func (x *RemoveDeviceRequest) Reset() { @@ -242,7 +242,7 @@ type RemoveDeviceReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` + DeviceId string `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"` } func (x *RemoveDeviceReply) Reset() { @@ -289,7 +289,7 @@ type IOSDeviceRequestResponseRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` } @@ -386,18 +386,22 @@ func (x *IOSDeviceRequestResponseReply) GetMessage() string { return "" } -type GetRoomScheduleRequest struct { +type NewsItem struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Room int32 `protobuf:"varint,1,opt,name=room,proto3" json:"room,omitempty"` - Start *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start,proto3" json:"start,omitempty"` - End *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=end,proto3" json:"end,omitempty"` + Id int64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Text string `protobuf:"bytes,3,opt,name=text,proto3" json:"text,omitempty"` + Link string `protobuf:"bytes,4,opt,name=link,proto3" json:"link,omitempty"` + ImageUrl string `protobuf:"bytes,5,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"` + Source string `protobuf:"bytes,6,opt,name=source,proto3" json:"source,omitempty"` + Created *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=created,proto3" json:"created,omitempty"` } -func (x *GetRoomScheduleRequest) Reset() { - *x = GetRoomScheduleRequest{} +func (x *NewsItem) Reset() { + *x = NewsItem{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -405,13 +409,13 @@ func (x *GetRoomScheduleRequest) Reset() { } } -func (x *GetRoomScheduleRequest) String() string { +func (x *NewsItem) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRoomScheduleRequest) ProtoMessage() {} +func (*NewsItem) ProtoMessage() {} -func (x *GetRoomScheduleRequest) ProtoReflect() protoreflect.Message { +func (x *NewsItem) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -423,42 +427,70 @@ func (x *GetRoomScheduleRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRoomScheduleRequest.ProtoReflect.Descriptor instead. -func (*GetRoomScheduleRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use NewsItem.ProtoReflect.Descriptor instead. +func (*NewsItem) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{6} } -func (x *GetRoomScheduleRequest) GetRoom() int32 { +func (x *NewsItem) GetId() int64 { if x != nil { - return x.Room + return x.Id } return 0 } -func (x *GetRoomScheduleRequest) GetStart() *timestamppb.Timestamp { +func (x *NewsItem) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *NewsItem) GetText() string { if x != nil { - return x.Start + return x.Text } - return nil + return "" +} + +func (x *NewsItem) GetLink() string { + if x != nil { + return x.Link + } + return "" +} + +func (x *NewsItem) GetImageUrl() string { + if x != nil { + return x.ImageUrl + } + return "" +} + +func (x *NewsItem) GetSource() string { + if x != nil { + return x.Source + } + return "" } -func (x *GetRoomScheduleRequest) GetEnd() *timestamppb.Timestamp { +func (x *NewsItem) GetCreated() *timestamppb.Timestamp { if x != nil { - return x.End + return x.Created } return nil } -type GetRoomScheduleReply struct { +type GetNewsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Events []*GetRoomScheduleReply_RoomScheduleEvent `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + News []*NewsItem `protobuf:"bytes,1,rep,name=news,proto3" json:"news,omitempty"` } -func (x *GetRoomScheduleReply) Reset() { - *x = GetRoomScheduleReply{} +func (x *GetNewsReply) Reset() { + *x = GetNewsReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -466,13 +498,13 @@ func (x *GetRoomScheduleReply) Reset() { } } -func (x *GetRoomScheduleReply) String() string { +func (x *GetNewsReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRoomScheduleReply) ProtoMessage() {} +func (*GetNewsReply) ProtoMessage() {} -func (x *GetRoomScheduleReply) ProtoReflect() protoreflect.Message { +func (x *GetNewsReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -484,28 +516,31 @@ func (x *GetRoomScheduleReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRoomScheduleReply.ProtoReflect.Descriptor instead. -func (*GetRoomScheduleReply) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNewsReply.ProtoReflect.Descriptor instead. +func (*GetNewsReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{7} } -func (x *GetRoomScheduleReply) GetEvents() []*GetRoomScheduleReply_RoomScheduleEvent { +func (x *GetNewsReply) GetNews() []*NewsItem { if x != nil { - return x.Events + return x.News } return nil } -type GetRoomCoordinatesRequest struct { +type GetNewsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ArchId string `protobuf:"bytes,1,opt,name=arch_id,json=archId,proto3" json:"arch_id,omitempty"` + // the last id of the news item received. 0 to get all news items + LastNewsId int32 `protobuf:"varint,1,opt,name=last_news_id,json=lastNewsId,proto3" json:"last_news_id,omitempty"` + // filter by news source id. 0 to get all news items + NewsSource int32 `protobuf:"varint,2,opt,name=news_source,json=newsSource,proto3" json:"news_source,omitempty"` } -func (x *GetRoomCoordinatesRequest) Reset() { - *x = GetRoomCoordinatesRequest{} +func (x *GetNewsRequest) Reset() { + *x = GetNewsRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -513,13 +548,13 @@ func (x *GetRoomCoordinatesRequest) Reset() { } } -func (x *GetRoomCoordinatesRequest) String() string { +func (x *GetNewsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRoomCoordinatesRequest) ProtoMessage() {} +func (*GetNewsRequest) ProtoMessage() {} -func (x *GetRoomCoordinatesRequest) ProtoReflect() protoreflect.Message { +func (x *GetNewsRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -531,30 +566,33 @@ func (x *GetRoomCoordinatesRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRoomCoordinatesRequest.ProtoReflect.Descriptor instead. -func (*GetRoomCoordinatesRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNewsRequest.ProtoReflect.Descriptor instead. +func (*GetNewsRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{8} } -func (x *GetRoomCoordinatesRequest) GetArchId() string { +func (x *GetNewsRequest) GetLastNewsId() int32 { if x != nil { - return x.ArchId + return x.LastNewsId } - return "" + return 0 +} + +func (x *GetNewsRequest) GetNewsSource() int32 { + if x != nil { + return x.NewsSource + } + return 0 } -type GetRoomCoordinatesReply struct { +type GetNewsSourcesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - UtmZone string `protobuf:"bytes,1,opt,name=utm_zone,json=utmZone,proto3" json:"utm_zone,omitempty"` - UtmEasting float32 `protobuf:"fixed32,2,opt,name=utm_easting,json=utmEasting,proto3" json:"utm_easting,omitempty"` - UtmNorthing float32 `protobuf:"fixed32,3,opt,name=utm_northing,json=utmNorthing,proto3" json:"utm_northing,omitempty"` } -func (x *GetRoomCoordinatesReply) Reset() { - *x = GetRoomCoordinatesReply{} +func (x *GetNewsSourcesRequest) Reset() { + *x = GetNewsSourcesRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -562,13 +600,13 @@ func (x *GetRoomCoordinatesReply) Reset() { } } -func (x *GetRoomCoordinatesReply) String() string { +func (x *GetNewsSourcesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRoomCoordinatesReply) ProtoMessage() {} +func (*GetNewsSourcesRequest) ProtoMessage() {} -func (x *GetRoomCoordinatesReply) ProtoReflect() protoreflect.Message { +func (x *GetNewsSourcesRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -580,42 +618,21 @@ func (x *GetRoomCoordinatesReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRoomCoordinatesReply.ProtoReflect.Descriptor instead. -func (*GetRoomCoordinatesReply) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNewsSourcesRequest.ProtoReflect.Descriptor instead. +func (*GetNewsSourcesRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{9} } -func (x *GetRoomCoordinatesReply) GetUtmZone() string { - if x != nil { - return x.UtmZone - } - return "" -} - -func (x *GetRoomCoordinatesReply) GetUtmEasting() float32 { - if x != nil { - return x.UtmEasting - } - return 0 -} - -func (x *GetRoomCoordinatesReply) GetUtmNorthing() float32 { - if x != nil { - return x.UtmNorthing - } - return 0 -} - -type GetRoomMapsRequest struct { +type GetNewsSourcesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ArchId string `protobuf:"bytes,1,opt,name=arch_id,json=archId,proto3" json:"arch_id,omitempty"` + Sources []*NewsSource `protobuf:"bytes,1,rep,name=sources,proto3" json:"sources,omitempty"` } -func (x *GetRoomMapsRequest) Reset() { - *x = GetRoomMapsRequest{} +func (x *GetNewsSourcesReply) Reset() { + *x = GetNewsSourcesReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -623,13 +640,13 @@ func (x *GetRoomMapsRequest) Reset() { } } -func (x *GetRoomMapsRequest) String() string { +func (x *GetNewsSourcesReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRoomMapsRequest) ProtoMessage() {} +func (*GetNewsSourcesReply) ProtoMessage() {} -func (x *GetRoomMapsRequest) ProtoReflect() protoreflect.Message { +func (x *GetNewsSourcesReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -641,28 +658,30 @@ func (x *GetRoomMapsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRoomMapsRequest.ProtoReflect.Descriptor instead. -func (*GetRoomMapsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNewsSourcesReply.ProtoReflect.Descriptor instead. +func (*GetNewsSourcesReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{10} } -func (x *GetRoomMapsRequest) GetArchId() string { +func (x *GetNewsSourcesReply) GetSources() []*NewsSource { if x != nil { - return x.ArchId + return x.Sources } - return "" + return nil } -type GetRoomMapsReply struct { +type NewsSource struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Maps []*GetRoomMapsReply_Map `protobuf:"bytes,1,rep,name=maps,proto3" json:"maps,omitempty"` + Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Icon string `protobuf:"bytes,3,opt,name=icon,proto3" json:"icon,omitempty"` } -func (x *GetRoomMapsReply) Reset() { - *x = GetRoomMapsReply{} +func (x *NewsSource) Reset() { + *x = NewsSource{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -670,13 +689,13 @@ func (x *GetRoomMapsReply) Reset() { } } -func (x *GetRoomMapsReply) String() string { +func (x *NewsSource) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRoomMapsReply) ProtoMessage() {} +func (*NewsSource) ProtoMessage() {} -func (x *GetRoomMapsReply) ProtoReflect() protoreflect.Message { +func (x *NewsSource) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -688,28 +707,40 @@ func (x *GetRoomMapsReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRoomMapsReply.ProtoReflect.Descriptor instead. -func (*GetRoomMapsReply) Descriptor() ([]byte, []int) { +// Deprecated: Use NewsSource.ProtoReflect.Descriptor instead. +func (*NewsSource) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{11} } -func (x *GetRoomMapsReply) GetMaps() []*GetRoomMapsReply_Map { +func (x *NewsSource) GetSource() string { if x != nil { - return x.Maps + return x.Source } - return nil + return "" +} + +func (x *NewsSource) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *NewsSource) GetIcon() string { + if x != nil { + return x.Icon + } + return "" } -type GetLocationsRequest struct { +type GetTopNewsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Location string `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"` } -func (x *GetLocationsRequest) Reset() { - *x = GetLocationsRequest{} +func (x *GetTopNewsRequest) Reset() { + *x = GetTopNewsRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -717,13 +748,13 @@ func (x *GetLocationsRequest) Reset() { } } -func (x *GetLocationsRequest) String() string { +func (x *GetTopNewsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetLocationsRequest) ProtoMessage() {} +func (*GetTopNewsRequest) ProtoMessage() {} -func (x *GetLocationsRequest) ProtoReflect() protoreflect.Message { +func (x *GetTopNewsRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -735,28 +766,25 @@ func (x *GetLocationsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetLocationsRequest.ProtoReflect.Descriptor instead. -func (*GetLocationsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetTopNewsRequest.ProtoReflect.Descriptor instead. +func (*GetTopNewsRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{12} } -func (x *GetLocationsRequest) GetLocation() string { - if x != nil { - return x.Location - } - return "" -} - -type GetLocationsReply struct { +type GetTopNewsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Locations []*GetLocationsReply_Location `protobuf:"bytes,1,rep,name=locations,proto3" json:"locations,omitempty"` + ImageUrl string `protobuf:"bytes,1,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"` + Link string `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"` + Created *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created,proto3" json:"created,omitempty"` + From *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=from,proto3" json:"from,omitempty"` + To *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=to,proto3" json:"to,omitempty"` } -func (x *GetLocationsReply) Reset() { - *x = GetLocationsReply{} +func (x *GetTopNewsReply) Reset() { + *x = GetTopNewsReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -764,13 +792,13 @@ func (x *GetLocationsReply) Reset() { } } -func (x *GetLocationsReply) String() string { +func (x *GetTopNewsReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetLocationsReply) ProtoMessage() {} +func (*GetTopNewsReply) ProtoMessage() {} -func (x *GetLocationsReply) ProtoReflect() protoreflect.Message { +func (x *GetTopNewsReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -782,28 +810,63 @@ func (x *GetLocationsReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetLocationsReply.ProtoReflect.Descriptor instead. -func (*GetLocationsReply) Descriptor() ([]byte, []int) { +// Deprecated: Use GetTopNewsReply.ProtoReflect.Descriptor instead. +func (*GetTopNewsReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{13} } -func (x *GetLocationsReply) GetLocations() []*GetLocationsReply_Location { +func (x *GetTopNewsReply) GetImageUrl() string { + if x != nil { + return x.ImageUrl + } + return "" +} + +func (x *GetTopNewsReply) GetLink() string { + if x != nil { + return x.Link + } + return "" +} + +func (x *GetTopNewsReply) GetCreated() *timestamppb.Timestamp { + if x != nil { + return x.Created + } + return nil +} + +func (x *GetTopNewsReply) GetFrom() *timestamppb.Timestamp { + if x != nil { + return x.From + } + return nil +} + +func (x *GetTopNewsReply) GetTo() *timestamppb.Timestamp { if x != nil { - return x.Locations + return x.To } return nil } -type SearchRoomsRequest struct { +type GetCanteenRatingsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` + // canteenId Mandatory Name of the canteen (EAT-API naming scheme "MENSA_GARCHING") + CanteenId string `protobuf:"bytes,1,opt,name=canteen_id,json=canteenId,proto3" json:"canteen_id,omitempty"` + // Optional Parameter to define an interval for the ratings (Lower bound) + From *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"` + // Optional Parameter to define an interval for the ratings (Upper bound) + To *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"` + // Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" + Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` } -func (x *SearchRoomsRequest) Reset() { - *x = SearchRoomsRequest{} +func (x *GetCanteenRatingsRequest) Reset() { + *x = GetCanteenRatingsRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -811,13 +874,13 @@ func (x *SearchRoomsRequest) Reset() { } } -func (x *SearchRoomsRequest) String() string { +func (x *GetCanteenRatingsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchRoomsRequest) ProtoMessage() {} +func (*GetCanteenRatingsRequest) ProtoMessage() {} -func (x *SearchRoomsRequest) ProtoReflect() protoreflect.Message { +func (x *GetCanteenRatingsRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -829,28 +892,54 @@ func (x *SearchRoomsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SearchRoomsRequest.ProtoReflect.Descriptor instead. -func (*SearchRoomsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetCanteenRatingsRequest.ProtoReflect.Descriptor instead. +func (*GetCanteenRatingsRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{14} } -func (x *SearchRoomsRequest) GetQuery() string { +func (x *GetCanteenRatingsRequest) GetCanteenId() string { if x != nil { - return x.Query + return x.CanteenId } return "" } -type SearchRoomsReply struct { +func (x *GetCanteenRatingsRequest) GetFrom() *timestamppb.Timestamp { + if x != nil { + return x.From + } + return nil +} + +func (x *GetCanteenRatingsRequest) GetTo() *timestamppb.Timestamp { + if x != nil { + return x.To + } + return nil +} + +func (x *GetCanteenRatingsRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +type GetCanteenRatingsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rooms []*Room `protobuf:"bytes,1,rep,name=rooms,proto3" json:"rooms,omitempty"` + Rating []*SingleRatingReply `protobuf:"bytes,1,rep,name=rating,proto3" json:"rating,omitempty"` + Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` + Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` + Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` + Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` + RatingTags []*RatingTagResult `protobuf:"bytes,6,rep,name=rating_tags,json=ratingTags,proto3" json:"rating_tags,omitempty"` } -func (x *SearchRoomsReply) Reset() { - *x = SearchRoomsReply{} +func (x *GetCanteenRatingsReply) Reset() { + *x = GetCanteenRatingsReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -858,13 +947,13 @@ func (x *SearchRoomsReply) Reset() { } } -func (x *SearchRoomsReply) String() string { +func (x *GetCanteenRatingsReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SearchRoomsReply) ProtoMessage() {} +func (*GetCanteenRatingsReply) ProtoMessage() {} -func (x *SearchRoomsReply) ProtoReflect() protoreflect.Message { +func (x *GetCanteenRatingsReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -876,36 +965,72 @@ func (x *SearchRoomsReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SearchRoomsReply.ProtoReflect.Descriptor instead. -func (*SearchRoomsReply) Descriptor() ([]byte, []int) { +// Deprecated: Use GetCanteenRatingsReply.ProtoReflect.Descriptor instead. +func (*GetCanteenRatingsReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{15} } -func (x *SearchRoomsReply) GetRooms() []*Room { +func (x *GetCanteenRatingsReply) GetRating() []*SingleRatingReply { if x != nil { - return x.Rooms + return x.Rating + } + return nil +} + +func (x *GetCanteenRatingsReply) GetAvg() float64 { + if x != nil { + return x.Avg + } + return 0 +} + +func (x *GetCanteenRatingsReply) GetStd() float64 { + if x != nil { + return x.Std + } + return 0 +} + +func (x *GetCanteenRatingsReply) GetMin() int32 { + if x != nil { + return x.Min + } + return 0 +} + +func (x *GetCanteenRatingsReply) GetMax() int32 { + if x != nil { + return x.Max + } + return 0 +} + +func (x *GetCanteenRatingsReply) GetRatingTags() []*RatingTagResult { + if x != nil { + return x.RatingTags } return nil } -type Room struct { +type GetDishRatingsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RoomId int32 `protobuf:"varint,1,opt,name=roomId,proto3" json:"roomId,omitempty"` - RoomCode string `protobuf:"bytes,2,opt,name=room_code,json=roomCode,proto3" json:"room_code,omitempty"` - BuildingNr string `protobuf:"bytes,3,opt,name=building_nr,json=buildingNr,proto3" json:"building_nr,omitempty"` - ArchId string `protobuf:"bytes,4,opt,name=arch_id,json=archId,proto3" json:"arch_id,omitempty"` - Info string `protobuf:"bytes,5,opt,name=info,proto3" json:"info,omitempty"` - Address string `protobuf:"bytes,6,opt,name=address,proto3" json:"address,omitempty"` - Purpose string `protobuf:"bytes,7,opt,name=purpose,proto3" json:"purpose,omitempty"` - Campus string `protobuf:"bytes,8,opt,name=campus,proto3" json:"campus,omitempty"` - Name string `protobuf:"bytes,9,opt,name=name,proto3" json:"name,omitempty"` + // Mandatory Name of the canteen (EAT-API naming scheme "MENSA_GARCHING") + CanteenId string `protobuf:"bytes,1,opt,name=canteen_id,json=canteenId,proto3" json:"canteen_id,omitempty"` + // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa + Dish string `protobuf:"bytes,2,opt,name=dish,proto3" json:"dish,omitempty"` + // Optional Parameter to define an interval for the ratings (Lower bound) + From *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` + // Optional Parameter to define an interval for the ratings (Upper bound) + To *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` + // Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" + Limit int32 `protobuf:"varint,5,opt,name=limit,proto3" json:"limit,omitempty"` } -func (x *Room) Reset() { - *x = Room{} +func (x *GetDishRatingsRequest) Reset() { + *x = GetDishRatingsRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -913,13 +1038,13 @@ func (x *Room) Reset() { } } -func (x *Room) String() string { +func (x *GetDishRatingsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Room) ProtoMessage() {} +func (*GetDishRatingsRequest) ProtoMessage() {} -func (x *Room) ProtoReflect() protoreflect.Message { +func (x *GetDishRatingsRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -931,84 +1056,62 @@ func (x *Room) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Room.ProtoReflect.Descriptor instead. -func (*Room) Descriptor() ([]byte, []int) { +// Deprecated: Use GetDishRatingsRequest.ProtoReflect.Descriptor instead. +func (*GetDishRatingsRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{16} } -func (x *Room) GetRoomId() int32 { - if x != nil { - return x.RoomId - } - return 0 -} - -func (x *Room) GetRoomCode() string { +func (x *GetDishRatingsRequest) GetCanteenId() string { if x != nil { - return x.RoomCode + return x.CanteenId } return "" } -func (x *Room) GetBuildingNr() string { +func (x *GetDishRatingsRequest) GetDish() string { if x != nil { - return x.BuildingNr + return x.Dish } return "" } -func (x *Room) GetArchId() string { +func (x *GetDishRatingsRequest) GetFrom() *timestamppb.Timestamp { if x != nil { - return x.ArchId + return x.From } - return "" + return nil } -func (x *Room) GetInfo() string { +func (x *GetDishRatingsRequest) GetTo() *timestamppb.Timestamp { if x != nil { - return x.Info + return x.To } - return "" + return nil } -func (x *Room) GetAddress() string { +func (x *GetDishRatingsRequest) GetLimit() int32 { if x != nil { - return x.Address + return x.Limit } - return "" + return 0 } -func (x *Room) GetPurpose() string { - if x != nil { - return x.Purpose - } - return "" +type GetDishRatingsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rating []*SingleRatingReply `protobuf:"bytes,1,rep,name=rating,proto3" json:"rating,omitempty"` + Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` + Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` + Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` + Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` + RatingTags []*RatingTagResult `protobuf:"bytes,6,rep,name=rating_tags,json=ratingTags,proto3" json:"rating_tags,omitempty"` + NameTags []*RatingTagResult `protobuf:"bytes,7,rep,name=name_tags,json=nameTags,proto3" json:"name_tags,omitempty"` } -func (x *Room) GetCampus() string { - if x != nil { - return x.Campus - } - return "" -} - -func (x *Room) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -type NewsSourceReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Sources []*NewsSource `protobuf:"bytes,1,rep,name=sources,proto3" json:"sources,omitempty"` -} - -func (x *NewsSourceReply) Reset() { - *x = NewsSourceReply{} +func (x *GetDishRatingsReply) Reset() { + *x = GetDishRatingsReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1016,13 +1119,13 @@ func (x *NewsSourceReply) Reset() { } } -func (x *NewsSourceReply) String() string { +func (x *GetDishRatingsReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NewsSourceReply) ProtoMessage() {} +func (*GetDishRatingsReply) ProtoMessage() {} -func (x *NewsSourceReply) ProtoReflect() protoreflect.Message { +func (x *GetDishRatingsReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1034,30 +1137,77 @@ func (x *NewsSourceReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NewsSourceReply.ProtoReflect.Descriptor instead. -func (*NewsSourceReply) Descriptor() ([]byte, []int) { +// Deprecated: Use GetDishRatingsReply.ProtoReflect.Descriptor instead. +func (*GetDishRatingsReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{17} } -func (x *NewsSourceReply) GetSources() []*NewsSource { +func (x *GetDishRatingsReply) GetRating() []*SingleRatingReply { if x != nil { - return x.Sources + return x.Rating } return nil } -type NewsSource struct { +func (x *GetDishRatingsReply) GetAvg() float64 { + if x != nil { + return x.Avg + } + return 0 +} + +func (x *GetDishRatingsReply) GetStd() float64 { + if x != nil { + return x.Std + } + return 0 +} + +func (x *GetDishRatingsReply) GetMin() int32 { + if x != nil { + return x.Min + } + return 0 +} + +func (x *GetDishRatingsReply) GetMax() int32 { + if x != nil { + return x.Max + } + return 0 +} + +func (x *GetDishRatingsReply) GetRatingTags() []*RatingTagResult { + if x != nil { + return x.RatingTags + } + return nil +} + +func (x *GetDishRatingsReply) GetNameTags() []*RatingTagResult { + if x != nil { + return x.NameTags + } + return nil +} + +type SingleRatingReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` - Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` - Icon string `protobuf:"bytes,3,opt,name=icon,proto3" json:"icon,omitempty"` + // number in the range 1-5 + Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` + // Optional JPEG image in Base64 + Image []byte `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` + // Optional comment (max 256 chars) + Comment string `protobuf:"bytes,3,opt,name=comment,proto3" json:"comment,omitempty"` + RatingTags []*RatingTagNewRequest `protobuf:"bytes,4,rep,name=rating_tags,json=ratingTags,proto3" json:"rating_tags,omitempty"` + Visited *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=visited,proto3" json:"visited,omitempty"` } -func (x *NewsSource) Reset() { - *x = NewsSource{} +func (x *SingleRatingReply) Reset() { + *x = SingleRatingReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1065,13 +1215,13 @@ func (x *NewsSource) Reset() { } } -func (x *NewsSource) String() string { +func (x *SingleRatingReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NewsSource) ProtoMessage() {} +func (*SingleRatingReply) ProtoMessage() {} -func (x *NewsSource) ProtoReflect() protoreflect.Message { +func (x *SingleRatingReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1083,46 +1233,54 @@ func (x *NewsSource) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NewsSource.ProtoReflect.Descriptor instead. -func (*NewsSource) Descriptor() ([]byte, []int) { +// Deprecated: Use SingleRatingReply.ProtoReflect.Descriptor instead. +func (*SingleRatingReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{18} } -func (x *NewsSource) GetSource() string { +func (x *SingleRatingReply) GetPoints() int32 { if x != nil { - return x.Source + return x.Points } - return "" + return 0 } -func (x *NewsSource) GetTitle() string { +func (x *SingleRatingReply) GetImage() []byte { if x != nil { - return x.Title + return x.Image } - return "" + return nil } -func (x *NewsSource) GetIcon() string { +func (x *SingleRatingReply) GetComment() string { if x != nil { - return x.Icon + return x.Comment } return "" } -type GetTopNewsReply struct { +func (x *SingleRatingReply) GetRatingTags() []*RatingTagNewRequest { + if x != nil { + return x.RatingTags + } + return nil +} + +func (x *SingleRatingReply) GetVisited() *timestamppb.Timestamp { + if x != nil { + return x.Visited + } + return nil +} + +type NewCanteenRatingReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - ImageUrl string `protobuf:"bytes,1,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"` - Link string `protobuf:"bytes,2,opt,name=link,proto3" json:"link,omitempty"` - Created *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created,proto3" json:"created,omitempty"` - From *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=from,proto3" json:"from,omitempty"` - To *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=to,proto3" json:"to,omitempty"` } -func (x *GetTopNewsReply) Reset() { - *x = GetTopNewsReply{} +func (x *NewCanteenRatingReply) Reset() { + *x = NewCanteenRatingReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1130,13 +1288,13 @@ func (x *GetTopNewsReply) Reset() { } } -func (x *GetTopNewsReply) String() string { +func (x *NewCanteenRatingReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetTopNewsReply) ProtoMessage() {} +func (*NewCanteenRatingReply) ProtoMessage() {} -func (x *GetTopNewsReply) ProtoReflect() protoreflect.Message { +func (x *NewCanteenRatingReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1148,63 +1306,28 @@ func (x *GetTopNewsReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetTopNewsReply.ProtoReflect.Descriptor instead. -func (*GetTopNewsReply) Descriptor() ([]byte, []int) { +// Deprecated: Use NewCanteenRatingReply.ProtoReflect.Descriptor instead. +func (*NewCanteenRatingReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{19} } -func (x *GetTopNewsReply) GetImageUrl() string { - if x != nil { - return x.ImageUrl - } - return "" -} - -func (x *GetTopNewsReply) GetLink() string { - if x != nil { - return x.Link - } - return "" -} - -func (x *GetTopNewsReply) GetCreated() *timestamppb.Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *GetTopNewsReply) GetFrom() *timestamppb.Timestamp { - if x != nil { - return x.From - } - return nil -} - -func (x *GetTopNewsReply) GetTo() *timestamppb.Timestamp { - if x != nil { - return x.To - } - return nil -} - -type CafeteriaRatingRequest struct { +type NewCanteenRatingRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // cafeteriaId Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") - CafeteriaId string `protobuf:"bytes,1,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - // Optional Parameter to define an interval for the ratings (Lower bound) - From *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"` - // Optional Parameter to define an interval for the ratings (Upper bound) - To *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=to,proto3" json:"to,omitempty"` - // Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" - Limit int32 `protobuf:"varint,4,opt,name=limit,proto3" json:"limit,omitempty"` + // number in the range 1-5 + Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` + CanteenId string `protobuf:"bytes,2,opt,name=canteen_id,json=canteenId,proto3" json:"canteen_id,omitempty"` + Image []byte `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"` + // Optional list of tag ratings add as many tags with a rating (1-5) of the list of canteenRatingTags + RatingTags []*RatingTag `protobuf:"bytes,4,rep,name=rating_tags,json=ratingTags,proto3" json:"rating_tags,omitempty"` + // Optional comment (max 256 chars) + Comment string `protobuf:"bytes,6,opt,name=comment,proto3" json:"comment,omitempty"` } -func (x *CafeteriaRatingRequest) Reset() { - *x = CafeteriaRatingRequest{} +func (x *NewCanteenRatingRequest) Reset() { + *x = NewCanteenRatingRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1212,13 +1335,13 @@ func (x *CafeteriaRatingRequest) Reset() { } } -func (x *CafeteriaRatingRequest) String() string { +func (x *NewCanteenRatingRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CafeteriaRatingRequest) ProtoMessage() {} +func (*NewCanteenRatingRequest) ProtoMessage() {} -func (x *CafeteriaRatingRequest) ProtoReflect() protoreflect.Message { +func (x *NewCanteenRatingRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1230,58 +1353,54 @@ func (x *CafeteriaRatingRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CafeteriaRatingRequest.ProtoReflect.Descriptor instead. -func (*CafeteriaRatingRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use NewCanteenRatingRequest.ProtoReflect.Descriptor instead. +func (*NewCanteenRatingRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{20} } -func (x *CafeteriaRatingRequest) GetCafeteriaId() string { +func (x *NewCanteenRatingRequest) GetPoints() int32 { if x != nil { - return x.CafeteriaId + return x.Points + } + return 0 +} + +func (x *NewCanteenRatingRequest) GetCanteenId() string { + if x != nil { + return x.CanteenId } return "" } -func (x *CafeteriaRatingRequest) GetFrom() *timestamppb.Timestamp { +func (x *NewCanteenRatingRequest) GetImage() []byte { if x != nil { - return x.From + return x.Image } return nil } -func (x *CafeteriaRatingRequest) GetTo() *timestamppb.Timestamp { +func (x *NewCanteenRatingRequest) GetRatingTags() []*RatingTag { if x != nil { - return x.To + return x.RatingTags } return nil } -func (x *CafeteriaRatingRequest) GetLimit() int32 { +func (x *NewCanteenRatingRequest) GetComment() string { if x != nil { - return x.Limit + return x.Comment } - return 0 + return "" } -type DishRatingRequest struct { +type NewDishRatingReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - // Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") - CafeteriaId string `protobuf:"bytes,1,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa - Dish string `protobuf:"bytes,2,opt,name=dish,proto3" json:"dish,omitempty"` - // Optional Parameter to define an interval for the ratings (Lower bound) - From *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"` - // Optional Parameter to define an interval for the ratings (Upper bound) - To *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=to,proto3" json:"to,omitempty"` - // Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" - Limit int32 `protobuf:"varint,5,opt,name=limit,proto3" json:"limit,omitempty"` } -func (x *DishRatingRequest) Reset() { - *x = DishRatingRequest{} +func (x *NewDishRatingReply) Reset() { + *x = NewDishRatingReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1289,13 +1408,13 @@ func (x *DishRatingRequest) Reset() { } } -func (x *DishRatingRequest) String() string { +func (x *NewDishRatingReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DishRatingRequest) ProtoMessage() {} +func (*NewDishRatingReply) ProtoMessage() {} -func (x *DishRatingRequest) ProtoReflect() protoreflect.Message { +func (x *NewDishRatingReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1307,61 +1426,32 @@ func (x *DishRatingRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DishRatingRequest.ProtoReflect.Descriptor instead. -func (*DishRatingRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use NewDishRatingReply.ProtoReflect.Descriptor instead. +func (*NewDishRatingReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{21} } -func (x *DishRatingRequest) GetCafeteriaId() string { - if x != nil { - return x.CafeteriaId - } - return "" -} - -func (x *DishRatingRequest) GetDish() string { - if x != nil { - return x.Dish - } - return "" -} - -func (x *DishRatingRequest) GetFrom() *timestamppb.Timestamp { - if x != nil { - return x.From - } - return nil -} - -func (x *DishRatingRequest) GetTo() *timestamppb.Timestamp { - if x != nil { - return x.To - } - return nil -} - -func (x *DishRatingRequest) GetLimit() int32 { - if x != nil { - return x.Limit - } - return 0 -} - -type CafeteriaRatingReply struct { +type NewDishRatingRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Rating []*SingleRatingReply `protobuf:"bytes,1,rep,name=rating,proto3" json:"rating,omitempty"` - Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` - Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` - Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` - Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` - RatingTags []*RatingTagResult `protobuf:"bytes,6,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` + // number in the range 1-5 + Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` + // Mandatory Name of the dish (EAT-API naming scheme "MENSA_GARCHING") Must be available int the given mensa + CanteenId string `protobuf:"bytes,2,opt,name=canteen_id,json=canteenId,proto3" json:"canteen_id,omitempty"` + // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa + Dish string `protobuf:"bytes,3,opt,name=dish,proto3" json:"dish,omitempty"` + // Optional JPEG image in Base64 + Image []byte `protobuf:"bytes,4,opt,name=image,proto3" json:"image,omitempty"` + // Optional list of tag ratings add as many tags with a rating (1-5) of the list of dishRatingTags + RatingTags []*RatingTag `protobuf:"bytes,5,rep,name=rating_tags,json=ratingTags,proto3" json:"rating_tags,omitempty"` + // Optional comment (max 256 chars) + Comment string `protobuf:"bytes,7,opt,name=comment,proto3" json:"comment,omitempty"` } -func (x *CafeteriaRatingReply) Reset() { - *x = CafeteriaRatingReply{} +func (x *NewDishRatingRequest) Reset() { + *x = NewDishRatingRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1369,13 +1459,13 @@ func (x *CafeteriaRatingReply) Reset() { } } -func (x *CafeteriaRatingReply) String() string { +func (x *NewDishRatingRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CafeteriaRatingReply) ProtoMessage() {} +func (*NewDishRatingRequest) ProtoMessage() {} -func (x *CafeteriaRatingReply) ProtoReflect() protoreflect.Message { +func (x *NewDishRatingRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1387,69 +1477,61 @@ func (x *CafeteriaRatingReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CafeteriaRatingReply.ProtoReflect.Descriptor instead. -func (*CafeteriaRatingReply) Descriptor() ([]byte, []int) { +// Deprecated: Use NewDishRatingRequest.ProtoReflect.Descriptor instead. +func (*NewDishRatingRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{22} } -func (x *CafeteriaRatingReply) GetRating() []*SingleRatingReply { +func (x *NewDishRatingRequest) GetPoints() int32 { if x != nil { - return x.Rating + return x.Points } - return nil + return 0 } -func (x *CafeteriaRatingReply) GetAvg() float64 { +func (x *NewDishRatingRequest) GetCanteenId() string { if x != nil { - return x.Avg + return x.CanteenId } - return 0 + return "" } -func (x *CafeteriaRatingReply) GetStd() float64 { +func (x *NewDishRatingRequest) GetDish() string { if x != nil { - return x.Std + return x.Dish } - return 0 + return "" } -func (x *CafeteriaRatingReply) GetMin() int32 { +func (x *NewDishRatingRequest) GetImage() []byte { if x != nil { - return x.Min + return x.Image } - return 0 + return nil } -func (x *CafeteriaRatingReply) GetMax() int32 { +func (x *NewDishRatingRequest) GetRatingTags() []*RatingTag { if x != nil { - return x.Max + return x.RatingTags } - return 0 + return nil } -func (x *CafeteriaRatingReply) GetRatingTags() []*RatingTagResult { +func (x *NewDishRatingRequest) GetComment() string { if x != nil { - return x.RatingTags + return x.Comment } - return nil + return "" } -type DishRatingReply struct { +type GetAvailableDishTagsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Rating []*SingleRatingReply `protobuf:"bytes,1,rep,name=rating,proto3" json:"rating,omitempty"` - Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` - Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` - Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` - Max int32 `protobuf:"varint,5,opt,name=max,proto3" json:"max,omitempty"` - RatingTags []*RatingTagResult `protobuf:"bytes,6,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` - NameTags []*RatingTagResult `protobuf:"bytes,7,rep,name=nameTags,proto3" json:"nameTags,omitempty"` } -func (x *DishRatingReply) Reset() { - *x = DishRatingReply{} +func (x *GetAvailableDishTagsRequest) Reset() { + *x = GetAvailableDishTagsRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1457,13 +1539,13 @@ func (x *DishRatingReply) Reset() { } } -func (x *DishRatingReply) String() string { +func (x *GetAvailableDishTagsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DishRatingReply) ProtoMessage() {} +func (*GetAvailableDishTagsRequest) ProtoMessage() {} -func (x *DishRatingReply) ProtoReflect() protoreflect.Message { +func (x *GetAvailableDishTagsRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1475,77 +1557,21 @@ func (x *DishRatingReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DishRatingReply.ProtoReflect.Descriptor instead. -func (*DishRatingReply) Descriptor() ([]byte, []int) { +// Deprecated: Use GetAvailableDishTagsRequest.ProtoReflect.Descriptor instead. +func (*GetAvailableDishTagsRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{23} } -func (x *DishRatingReply) GetRating() []*SingleRatingReply { - if x != nil { - return x.Rating - } - return nil -} - -func (x *DishRatingReply) GetAvg() float64 { - if x != nil { - return x.Avg - } - return 0 -} - -func (x *DishRatingReply) GetStd() float64 { - if x != nil { - return x.Std - } - return 0 -} - -func (x *DishRatingReply) GetMin() int32 { - if x != nil { - return x.Min - } - return 0 -} - -func (x *DishRatingReply) GetMax() int32 { - if x != nil { - return x.Max - } - return 0 -} - -func (x *DishRatingReply) GetRatingTags() []*RatingTagResult { - if x != nil { - return x.RatingTags - } - return nil -} - -func (x *DishRatingReply) GetNameTags() []*RatingTagResult { - if x != nil { - return x.NameTags - } - return nil -} - -type SingleRatingReply struct { +type GetAvailableDishTagsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // number in the range 1-5 - Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` - // Optional JPEG image in Base64 - Image []byte `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` - // Optional comment (max 256 chars) - Comment string `protobuf:"bytes,3,opt,name=comment,proto3" json:"comment,omitempty"` - RatingTags []*RatingTagNewRequest `protobuf:"bytes,4,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` - Visited *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=visited,proto3" json:"visited,omitempty"` + RatingTags []*TagsOverview `protobuf:"bytes,1,rep,name=rating_tags,json=ratingTags,proto3" json:"rating_tags,omitempty"` } -func (x *SingleRatingReply) Reset() { - *x = SingleRatingReply{} +func (x *GetAvailableDishTagsReply) Reset() { + *x = GetAvailableDishTagsReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1553,13 +1579,13 @@ func (x *SingleRatingReply) Reset() { } } -func (x *SingleRatingReply) String() string { +func (x *GetAvailableDishTagsReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SingleRatingReply) ProtoMessage() {} +func (*GetAvailableDishTagsReply) ProtoMessage() {} -func (x *SingleRatingReply) ProtoReflect() protoreflect.Message { +func (x *GetAvailableDishTagsReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1571,63 +1597,26 @@ func (x *SingleRatingReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SingleRatingReply.ProtoReflect.Descriptor instead. -func (*SingleRatingReply) Descriptor() ([]byte, []int) { +// Deprecated: Use GetAvailableDishTagsReply.ProtoReflect.Descriptor instead. +func (*GetAvailableDishTagsReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{24} } -func (x *SingleRatingReply) GetPoints() int32 { - if x != nil { - return x.Points - } - return 0 -} - -func (x *SingleRatingReply) GetImage() []byte { - if x != nil { - return x.Image - } - return nil -} - -func (x *SingleRatingReply) GetComment() string { - if x != nil { - return x.Comment - } - return "" -} - -func (x *SingleRatingReply) GetRatingTags() []*RatingTagNewRequest { +func (x *GetAvailableDishTagsReply) GetRatingTags() []*TagsOverview { if x != nil { return x.RatingTags } return nil } -func (x *SingleRatingReply) GetVisited() *timestamppb.Timestamp { - if x != nil { - return x.Visited - } - return nil -} - -type NewCafeteriaRatingRequest struct { +type GetNameTagsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - // number in the range 1-5 - Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` - CafeteriaId string `protobuf:"bytes,2,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - Image []byte `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"` - // Optional list of tag ratings add as many tags with a rating (1-5) of the list of cafeteriaRatingTags - RatingTags []*RatingTag `protobuf:"bytes,4,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` - // Optional comment (max 256 chars) - Comment string `protobuf:"bytes,6,opt,name=comment,proto3" json:"comment,omitempty"` } -func (x *NewCafeteriaRatingRequest) Reset() { - *x = NewCafeteriaRatingRequest{} +func (x *GetNameTagsRequest) Reset() { + *x = GetNameTagsRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1635,13 +1624,13 @@ func (x *NewCafeteriaRatingRequest) Reset() { } } -func (x *NewCafeteriaRatingRequest) String() string { +func (x *GetNameTagsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NewCafeteriaRatingRequest) ProtoMessage() {} +func (*GetNameTagsRequest) ProtoMessage() {} -func (x *NewCafeteriaRatingRequest) ProtoReflect() protoreflect.Message { +func (x *GetNameTagsRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1653,67 +1642,21 @@ func (x *NewCafeteriaRatingRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NewCafeteriaRatingRequest.ProtoReflect.Descriptor instead. -func (*NewCafeteriaRatingRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNameTagsRequest.ProtoReflect.Descriptor instead. +func (*GetNameTagsRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{25} } -func (x *NewCafeteriaRatingRequest) GetPoints() int32 { - if x != nil { - return x.Points - } - return 0 -} - -func (x *NewCafeteriaRatingRequest) GetCafeteriaId() string { - if x != nil { - return x.CafeteriaId - } - return "" -} - -func (x *NewCafeteriaRatingRequest) GetImage() []byte { - if x != nil { - return x.Image - } - return nil -} - -func (x *NewCafeteriaRatingRequest) GetRatingTags() []*RatingTag { - if x != nil { - return x.RatingTags - } - return nil -} - -func (x *NewCafeteriaRatingRequest) GetComment() string { - if x != nil { - return x.Comment - } - return "" -} - -type NewDishRatingRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // number in the range 1-5 - Points int32 `protobuf:"varint,1,opt,name=points,proto3" json:"points,omitempty"` - // Mandatory Name of the dish (EAT-API naming scheme "MENSA_GARCHING") Must be available int the given mensa - CafeteriaId string `protobuf:"bytes,2,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa - Dish string `protobuf:"bytes,3,opt,name=dish,proto3" json:"dish,omitempty"` - // Optional JPEG image in Base64 - Image []byte `protobuf:"bytes,4,opt,name=image,proto3" json:"image,omitempty"` - // Optional list of tag ratings add as many tags with a rating (1-5) of the list of dishRatingTags - RatingTags []*RatingTag `protobuf:"bytes,5,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` - // Optional comment (max 256 chars) - Comment string `protobuf:"bytes,7,opt,name=comment,proto3" json:"comment,omitempty"` +type GetNameTagsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RatingTags []*TagsOverview `protobuf:"bytes,1,rep,name=rating_tags,json=ratingTags,proto3" json:"rating_tags,omitempty"` } -func (x *NewDishRatingRequest) Reset() { - *x = NewDishRatingRequest{} +func (x *GetNameTagsReply) Reset() { + *x = GetNameTagsReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1721,13 +1664,13 @@ func (x *NewDishRatingRequest) Reset() { } } -func (x *NewDishRatingRequest) String() string { +func (x *GetNameTagsReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NewDishRatingRequest) ProtoMessage() {} +func (*GetNameTagsReply) ProtoMessage() {} -func (x *NewDishRatingRequest) ProtoReflect() protoreflect.Message { +func (x *GetNameTagsReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1739,78 +1682,81 @@ func (x *NewDishRatingRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NewDishRatingRequest.ProtoReflect.Descriptor instead. -func (*NewDishRatingRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNameTagsReply.ProtoReflect.Descriptor instead. +func (*GetNameTagsReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{26} } -func (x *NewDishRatingRequest) GetPoints() int32 { +func (x *GetNameTagsReply) GetRatingTags() []*TagsOverview { if x != nil { - return x.Points + return x.RatingTags } - return 0 + return nil } -func (x *NewDishRatingRequest) GetCafeteriaId() string { - if x != nil { - return x.CafeteriaId - } - return "" +type GetAvailableCanteenTagsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (x *NewDishRatingRequest) GetDish() string { - if x != nil { - return x.Dish +func (x *GetAvailableCanteenTagsRequest) Reset() { + *x = GetAvailableCanteenTagsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *NewDishRatingRequest) GetImage() []byte { - if x != nil { - return x.Image - } - return nil +func (x *GetAvailableCanteenTagsRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *NewDishRatingRequest) GetRatingTags() []*RatingTag { - if x != nil { - return x.RatingTags +func (*GetAvailableCanteenTagsRequest) ProtoMessage() {} + +func (x *GetAvailableCanteenTagsRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_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 nil + return mi.MessageOf(x) } -func (x *NewDishRatingRequest) GetComment() string { - if x != nil { - return x.Comment - } - return "" +// Deprecated: Use GetAvailableCanteenTagsRequest.ProtoReflect.Descriptor instead. +func (*GetAvailableCanteenTagsRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{27} } -type GetTagsReply struct { +type GetAvailableCanteenTagsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RatingTags []*TagsOverview `protobuf:"bytes,1,rep,name=ratingTags,proto3" json:"ratingTags,omitempty"` + RatingTags []*TagsOverview `protobuf:"bytes,1,rep,name=rating_tags,json=ratingTags,proto3" json:"rating_tags,omitempty"` } -func (x *GetTagsReply) Reset() { - *x = GetTagsReply{} +func (x *GetAvailableCanteenTagsReply) Reset() { + *x = GetAvailableCanteenTagsReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[27] + mi := &file_tumdev_campus_backend_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetTagsReply) String() string { +func (x *GetAvailableCanteenTagsReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetTagsReply) ProtoMessage() {} +func (*GetAvailableCanteenTagsReply) ProtoMessage() {} -func (x *GetTagsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[27] +func (x *GetAvailableCanteenTagsReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1821,12 +1767,12 @@ func (x *GetTagsReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetTagsReply.ProtoReflect.Descriptor instead. -func (*GetTagsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{27} +// Deprecated: Use GetAvailableCanteenTagsReply.ProtoReflect.Descriptor instead. +func (*GetAvailableCanteenTagsReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{28} } -func (x *GetTagsReply) GetRatingTags() []*TagsOverview { +func (x *GetAvailableCanteenTagsReply) GetRatingTags() []*TagsOverview { if x != nil { return x.RatingTags } @@ -1838,7 +1784,7 @@ type TagsOverview struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` + TagId int32 `protobuf:"varint,1,opt,name=tag_id,json=tagId,proto3" json:"tag_id,omitempty"` De string `protobuf:"bytes,2,opt,name=de,proto3" json:"de,omitempty"` En string `protobuf:"bytes,3,opt,name=en,proto3" json:"en,omitempty"` } @@ -1846,7 +1792,7 @@ type TagsOverview struct { func (x *TagsOverview) Reset() { *x = TagsOverview{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[28] + mi := &file_tumdev_campus_backend_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1859,7 +1805,7 @@ func (x *TagsOverview) String() string { func (*TagsOverview) ProtoMessage() {} func (x *TagsOverview) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[28] + mi := &file_tumdev_campus_backend_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1872,7 +1818,7 @@ func (x *TagsOverview) ProtoReflect() protoreflect.Message { // Deprecated: Use TagsOverview.ProtoReflect.Descriptor instead. func (*TagsOverview) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{28} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{29} } func (x *TagsOverview) GetTagId() int32 { @@ -1901,14 +1847,14 @@ type RatingTag struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` + TagId int64 `protobuf:"varint,1,opt,name=tag_id,json=tagId,proto3" json:"tag_id,omitempty"` Points float64 `protobuf:"fixed64,2,opt,name=points,proto3" json:"points,omitempty"` } func (x *RatingTag) Reset() { *x = RatingTag{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[29] + mi := &file_tumdev_campus_backend_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1921,7 +1867,7 @@ func (x *RatingTag) String() string { func (*RatingTag) ProtoMessage() {} func (x *RatingTag) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[29] + mi := &file_tumdev_campus_backend_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1934,10 +1880,10 @@ func (x *RatingTag) ProtoReflect() protoreflect.Message { // Deprecated: Use RatingTag.ProtoReflect.Descriptor instead. func (*RatingTag) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{29} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{30} } -func (x *RatingTag) GetTagId() int32 { +func (x *RatingTag) GetTagId() int64 { if x != nil { return x.TagId } @@ -1956,14 +1902,14 @@ type RatingTagNewRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` + TagId int32 `protobuf:"varint,1,opt,name=tag_id,json=tagId,proto3" json:"tag_id,omitempty"` Points int32 `protobuf:"varint,2,opt,name=points,proto3" json:"points,omitempty"` } func (x *RatingTagNewRequest) Reset() { *x = RatingTagNewRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[30] + mi := &file_tumdev_campus_backend_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1976,7 +1922,7 @@ func (x *RatingTagNewRequest) String() string { func (*RatingTagNewRequest) ProtoMessage() {} func (x *RatingTagNewRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[30] + mi := &file_tumdev_campus_backend_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1989,7 +1935,7 @@ func (x *RatingTagNewRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RatingTagNewRequest.ProtoReflect.Descriptor instead. func (*RatingTagNewRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{30} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{31} } func (x *RatingTagNewRequest) GetTagId() int32 { @@ -2011,7 +1957,7 @@ type RatingTagResult struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TagId int32 `protobuf:"varint,1,opt,name=tagId,proto3" json:"tagId,omitempty"` + TagId int32 `protobuf:"varint,1,opt,name=tag_id,json=tagId,proto3" json:"tag_id,omitempty"` Avg float64 `protobuf:"fixed64,2,opt,name=avg,proto3" json:"avg,omitempty"` Std float64 `protobuf:"fixed64,3,opt,name=std,proto3" json:"std,omitempty"` Min int32 `protobuf:"varint,4,opt,name=min,proto3" json:"min,omitempty"` @@ -2021,7 +1967,7 @@ type RatingTagResult struct { func (x *RatingTagResult) Reset() { *x = RatingTagResult{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[31] + mi := &file_tumdev_campus_backend_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2034,7 +1980,7 @@ func (x *RatingTagResult) String() string { func (*RatingTagResult) ProtoMessage() {} func (x *RatingTagResult) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[31] + mi := &file_tumdev_campus_backend_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2047,7 +1993,7 @@ func (x *RatingTagResult) ProtoReflect() protoreflect.Message { // Deprecated: Use RatingTagResult.ProtoReflect.Descriptor instead. func (*RatingTagResult) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{31} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{32} } func (x *RatingTagResult) GetTagId() int32 { @@ -2085,223 +2031,29 @@ func (x *RatingTagResult) GetMax() int32 { return 0 } -type GetCafeteriaReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Cafeteria []*Cafeteria `protobuf:"bytes,1,rep,name=cafeteria,proto3" json:"cafeteria,omitempty"` -} - -func (x *GetCafeteriaReply) Reset() { - *x = GetCafeteriaReply{} - if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetCafeteriaReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetCafeteriaReply) ProtoMessage() {} - -func (x *GetCafeteriaReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_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 GetCafeteriaReply.ProtoReflect.Descriptor instead. -func (*GetCafeteriaReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{32} -} - -func (x *GetCafeteriaReply) GetCafeteria() []*Cafeteria { - if x != nil { - return x.Cafeteria - } - return nil -} - -type Cafeteria struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` - Longitude float64 `protobuf:"fixed64,3,opt,name=longitude,proto3" json:"longitude,omitempty"` - Latitude float64 `protobuf:"fixed64,4,opt,name=latitude,proto3" json:"latitude,omitempty"` -} - -func (x *Cafeteria) Reset() { - *x = Cafeteria{} - if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Cafeteria) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Cafeteria) ProtoMessage() {} - -func (x *Cafeteria) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_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 Cafeteria.ProtoReflect.Descriptor instead. -func (*Cafeteria) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{33} -} - -func (x *Cafeteria) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Cafeteria) GetAddress() string { - if x != nil { - return x.Address - } - return "" -} - -func (x *Cafeteria) GetLongitude() float64 { - if x != nil { - return x.Longitude - } - return 0 -} - -func (x *Cafeteria) GetLatitude() float64 { - if x != nil { - return x.Latitude - } - return 0 -} - -type GetDishesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CafeteriaId string `protobuf:"bytes,1,opt,name=cafeteriaId,proto3" json:"cafeteriaId,omitempty"` - // >=2022 until the current year - Year int32 `protobuf:"varint,2,opt,name=year,proto3" json:"year,omitempty"` - // range 1 - 53 - Week int32 `protobuf:"varint,3,opt,name=week,proto3" json:"week,omitempty"` - // range 0 (Monday) - 4 (Friday) - Day int32 `protobuf:"varint,4,opt,name=day,proto3" json:"day,omitempty"` -} - -func (x *GetDishesRequest) Reset() { - *x = GetDishesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetDishesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetDishesRequest) ProtoMessage() {} - -func (x *GetDishesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_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 GetDishesRequest.ProtoReflect.Descriptor instead. -func (*GetDishesRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{34} -} - -func (x *GetDishesRequest) GetCafeteriaId() string { - if x != nil { - return x.CafeteriaId - } - return "" -} - -func (x *GetDishesRequest) GetYear() int32 { - if x != nil { - return x.Year - } - return 0 -} - -func (x *GetDishesRequest) GetWeek() int32 { - if x != nil { - return x.Week - } - return 0 -} - -func (x *GetDishesRequest) GetDay() int32 { - if x != nil { - return x.Day - } - return 0 -} - -type GetDishesReply struct { +type GetCanteensRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Dish []string `protobuf:"bytes,1,rep,name=dish,proto3" json:"dish,omitempty"` } -func (x *GetDishesReply) Reset() { - *x = GetDishesReply{} +func (x *GetCanteensRequest) Reset() { + *x = GetCanteensRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[35] + mi := &file_tumdev_campus_backend_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetDishesReply) String() string { +func (x *GetCanteensRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetDishesReply) ProtoMessage() {} +func (*GetCanteensRequest) ProtoMessage() {} -func (x *GetDishesReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[35] +func (x *GetCanteensRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2312,43 +2064,36 @@ func (x *GetDishesReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetDishesReply.ProtoReflect.Descriptor instead. -func (*GetDishesReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{35} -} - -func (x *GetDishesReply) GetDish() []string { - if x != nil { - return x.Dish - } - return nil +// Deprecated: Use GetCanteensRequest.ProtoReflect.Descriptor instead. +func (*GetCanteensRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{33} } -type GetResponsiblePersonReply struct { +type GetCanteensReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ResponsiblePerson []*ResponsiblePersonElement `protobuf:"bytes,1,rep,name=responsiblePerson,proto3" json:"responsiblePerson,omitempty"` + Canteen []*Canteen `protobuf:"bytes,1,rep,name=canteen,proto3" json:"canteen,omitempty"` } -func (x *GetResponsiblePersonReply) Reset() { - *x = GetResponsiblePersonReply{} +func (x *GetCanteensReply) Reset() { + *x = GetCanteensReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[36] + mi := &file_tumdev_campus_backend_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetResponsiblePersonReply) String() string { +func (x *GetCanteensReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetResponsiblePersonReply) ProtoMessage() {} +func (*GetCanteensReply) ProtoMessage() {} -func (x *GetResponsiblePersonReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[36] +func (x *GetCanteensReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2359,47 +2104,46 @@ func (x *GetResponsiblePersonReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetResponsiblePersonReply.ProtoReflect.Descriptor instead. -func (*GetResponsiblePersonReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{36} +// Deprecated: Use GetCanteensReply.ProtoReflect.Descriptor instead. +func (*GetCanteensReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{34} } -func (x *GetResponsiblePersonReply) GetResponsiblePerson() []*ResponsiblePersonElement { +func (x *GetCanteensReply) GetCanteen() []*Canteen { if x != nil { - return x.ResponsiblePerson + return x.Canteen } return nil } -type ResponsiblePersonElement struct { +type Canteen struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Telephone string `protobuf:"bytes,2,opt,name=telephone,proto3" json:"telephone,omitempty"` - Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` - Faculty string `protobuf:"bytes,4,opt,name=faculty,proto3" json:"faculty,omitempty"` - TumID string `protobuf:"bytes,5,opt,name=tumID,proto3" json:"tumID,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + Longitude float64 `protobuf:"fixed64,3,opt,name=longitude,proto3" json:"longitude,omitempty"` + Latitude float64 `protobuf:"fixed64,4,opt,name=latitude,proto3" json:"latitude,omitempty"` } -func (x *ResponsiblePersonElement) Reset() { - *x = ResponsiblePersonElement{} +func (x *Canteen) Reset() { + *x = Canteen{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[37] + mi := &file_tumdev_campus_backend_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ResponsiblePersonElement) String() string { +func (x *Canteen) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ResponsiblePersonElement) ProtoMessage() {} +func (*Canteen) ProtoMessage() {} -func (x *ResponsiblePersonElement) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[37] +func (x *Canteen) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2410,71 +2154,70 @@ func (x *ResponsiblePersonElement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ResponsiblePersonElement.ProtoReflect.Descriptor instead. -func (*ResponsiblePersonElement) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{37} -} - -func (x *ResponsiblePersonElement) GetName() string { - if x != nil { - return x.Name - } - return "" +// Deprecated: Use Canteen.ProtoReflect.Descriptor instead. +func (*Canteen) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{35} } -func (x *ResponsiblePersonElement) GetTelephone() string { +func (x *Canteen) GetId() string { if x != nil { - return x.Telephone + return x.Id } return "" } -func (x *ResponsiblePersonElement) GetEmail() string { +func (x *Canteen) GetAddress() string { if x != nil { - return x.Email + return x.Address } return "" } -func (x *ResponsiblePersonElement) GetFaculty() string { +func (x *Canteen) GetLongitude() float64 { if x != nil { - return x.Faculty + return x.Longitude } - return "" + return 0 } -func (x *ResponsiblePersonElement) GetTumID() string { +func (x *Canteen) GetLatitude() float64 { if x != nil { - return x.TumID + return x.Latitude } - return "" + return 0 } -type GetBuilding2GpsReply struct { +type GetDishesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Building2Gps []*Building2GpsElement `protobuf:"bytes,1,rep,name=building2Gps,proto3" json:"building2Gps,omitempty"` + CanteenId string `protobuf:"bytes,1,opt,name=canteen_id,json=canteenId,proto3" json:"canteen_id,omitempty"` + // >=2022 until the current year + Year int32 `protobuf:"varint,2,opt,name=year,proto3" json:"year,omitempty"` + // range 1 - 53 + Week int32 `protobuf:"varint,3,opt,name=week,proto3" json:"week,omitempty"` + // range 0 (Monday) - 4 (Friday) + Day int32 `protobuf:"varint,4,opt,name=day,proto3" json:"day,omitempty"` } -func (x *GetBuilding2GpsReply) Reset() { - *x = GetBuilding2GpsReply{} +func (x *GetDishesRequest) Reset() { + *x = GetDishesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[38] + mi := &file_tumdev_campus_backend_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetBuilding2GpsReply) String() string { +func (x *GetDishesRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetBuilding2GpsReply) ProtoMessage() {} +func (*GetDishesRequest) ProtoMessage() {} -func (x *GetBuilding2GpsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[38] +func (x *GetDishesRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2485,45 +2228,64 @@ func (x *GetBuilding2GpsReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetBuilding2GpsReply.ProtoReflect.Descriptor instead. -func (*GetBuilding2GpsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{38} +// Deprecated: Use GetDishesRequest.ProtoReflect.Descriptor instead. +func (*GetDishesRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{36} } -func (x *GetBuilding2GpsReply) GetBuilding2Gps() []*Building2GpsElement { +func (x *GetDishesRequest) GetCanteenId() string { if x != nil { - return x.Building2Gps + return x.CanteenId } - return nil + return "" +} + +func (x *GetDishesRequest) GetYear() int32 { + if x != nil { + return x.Year + } + return 0 +} + +func (x *GetDishesRequest) GetWeek() int32 { + if x != nil { + return x.Week + } + return 0 +} + +func (x *GetDishesRequest) GetDay() int32 { + if x != nil { + return x.Day + } + return 0 } -type Building2GpsElement struct { +type GetDishesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Latitude string `protobuf:"bytes,2,opt,name=latitude,proto3" json:"latitude,omitempty"` - Longitude string `protobuf:"bytes,3,opt,name=longitude,proto3" json:"longitude,omitempty"` + Dish []string `protobuf:"bytes,1,rep,name=dish,proto3" json:"dish,omitempty"` } -func (x *Building2GpsElement) Reset() { - *x = Building2GpsElement{} +func (x *GetDishesReply) Reset() { + *x = GetDishesReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[39] + mi := &file_tumdev_campus_backend_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Building2GpsElement) String() string { +func (x *GetDishesReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Building2GpsElement) ProtoMessage() {} +func (*GetDishesReply) ProtoMessage() {} -func (x *Building2GpsElement) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[39] +func (x *GetDishesReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2534,57 +2296,41 @@ func (x *Building2GpsElement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Building2GpsElement.ProtoReflect.Descriptor instead. -func (*Building2GpsElement) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{39} -} - -func (x *Building2GpsElement) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Building2GpsElement) GetLatitude() string { - if x != nil { - return x.Latitude - } - return "" +// Deprecated: Use GetDishesReply.ProtoReflect.Descriptor instead. +func (*GetDishesReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{37} } -func (x *Building2GpsElement) GetLongitude() string { +func (x *GetDishesReply) GetDish() []string { if x != nil { - return x.Longitude + return x.Dish } - return "" + return nil } -type GetAreaFacilitiesByBuildingNrReply struct { +type GetResponsiblePersonRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - AreaFacilitiesByBuildingNr []*RoomInformationElement `protobuf:"bytes,1,rep,name=areaFacilitiesByBuildingNr,proto3" json:"areaFacilitiesByBuildingNr,omitempty"` } -func (x *GetAreaFacilitiesByBuildingNrReply) Reset() { - *x = GetAreaFacilitiesByBuildingNrReply{} +func (x *GetResponsiblePersonRequest) Reset() { + *x = GetResponsiblePersonRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[40] + mi := &file_tumdev_campus_backend_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAreaFacilitiesByBuildingNrReply) String() string { +func (x *GetResponsiblePersonRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAreaFacilitiesByBuildingNrReply) ProtoMessage() {} +func (*GetResponsiblePersonRequest) ProtoMessage() {} -func (x *GetAreaFacilitiesByBuildingNrReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[40] +func (x *GetResponsiblePersonRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2595,43 +2341,36 @@ func (x *GetAreaFacilitiesByBuildingNrReply) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetAreaFacilitiesByBuildingNrReply.ProtoReflect.Descriptor instead. -func (*GetAreaFacilitiesByBuildingNrReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{40} -} - -func (x *GetAreaFacilitiesByBuildingNrReply) GetAreaFacilitiesByBuildingNr() []*RoomInformationElement { - if x != nil { - return x.AreaFacilitiesByBuildingNr - } - return nil +// Deprecated: Use GetResponsiblePersonRequest.ProtoReflect.Descriptor instead. +func (*GetResponsiblePersonRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{38} } -type GetAreaFacilitiesByBuildingNrRequest struct { +type GetResponsiblePersonReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - BuildingNr string `protobuf:"bytes,1,opt,name=building_nr,json=buildingNr,proto3" json:"building_nr,omitempty"` + ResponsiblePerson []*ResponsiblePerson `protobuf:"bytes,1,rep,name=responsible_person,json=responsiblePerson,proto3" json:"responsible_person,omitempty"` } -func (x *GetAreaFacilitiesByBuildingNrRequest) Reset() { - *x = GetAreaFacilitiesByBuildingNrRequest{} +func (x *GetResponsiblePersonReply) Reset() { + *x = GetResponsiblePersonReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[41] + mi := &file_tumdev_campus_backend_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetAreaFacilitiesByBuildingNrRequest) String() string { +func (x *GetResponsiblePersonReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAreaFacilitiesByBuildingNrRequest) ProtoMessage() {} +func (*GetResponsiblePersonReply) ProtoMessage() {} -func (x *GetAreaFacilitiesByBuildingNrRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[41] +func (x *GetResponsiblePersonReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2642,43 +2381,47 @@ func (x *GetAreaFacilitiesByBuildingNrRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use GetAreaFacilitiesByBuildingNrRequest.ProtoReflect.Descriptor instead. -func (*GetAreaFacilitiesByBuildingNrRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{41} +// Deprecated: Use GetResponsiblePersonReply.ProtoReflect.Descriptor instead. +func (*GetResponsiblePersonReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{39} } -func (x *GetAreaFacilitiesByBuildingNrRequest) GetBuildingNr() string { +func (x *GetResponsiblePersonReply) GetResponsiblePerson() []*ResponsiblePerson { if x != nil { - return x.BuildingNr + return x.ResponsiblePerson } - return "" + return nil } -type GetListOfToiletsReply struct { +type ResponsiblePerson struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ListOfToilets []*RoomInformationElement `protobuf:"bytes,1,rep,name=listOfToilets,proto3" json:"listOfToilets,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Telephone string `protobuf:"bytes,2,opt,name=telephone,proto3" json:"telephone,omitempty"` + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + Faculty string `protobuf:"bytes,4,opt,name=faculty,proto3" json:"faculty,omitempty"` + TumId string `protobuf:"bytes,5,opt,name=tum_id,json=tumId,proto3" json:"tum_id,omitempty"` } -func (x *GetListOfToiletsReply) Reset() { - *x = GetListOfToiletsReply{} +func (x *ResponsiblePerson) Reset() { + *x = ResponsiblePerson{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[42] + mi := &file_tumdev_campus_backend_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetListOfToiletsReply) String() string { +func (x *ResponsiblePerson) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetListOfToiletsReply) ProtoMessage() {} +func (*ResponsiblePerson) ProtoMessage() {} -func (x *GetListOfToiletsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[42] +func (x *ResponsiblePerson) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2689,16 +2432,44 @@ func (x *GetListOfToiletsReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetListOfToiletsReply.ProtoReflect.Descriptor instead. -func (*GetListOfToiletsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{42} +// Deprecated: Use ResponsiblePerson.ProtoReflect.Descriptor instead. +func (*ResponsiblePerson) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{40} } -func (x *GetListOfToiletsReply) GetListOfToilets() []*RoomInformationElement { +func (x *ResponsiblePerson) GetName() string { if x != nil { - return x.ListOfToilets + return x.Name } - return nil + return "" +} + +func (x *ResponsiblePerson) GetTelephone() string { + if x != nil { + return x.Telephone + } + return "" +} + +func (x *ResponsiblePerson) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *ResponsiblePerson) GetFaculty() string { + if x != nil { + return x.Faculty + } + return "" +} + +func (x *ResponsiblePerson) GetTumId() string { + if x != nil { + return x.TumId + } + return "" } type RoomInformationElement struct { @@ -2706,7 +2477,7 @@ type RoomInformationElement struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RoomId int32 `protobuf:"varint,1,opt,name=roomId,proto3" json:"roomId,omitempty"` + RoomId int32 `protobuf:"varint,1,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` RoomCode string `protobuf:"bytes,2,opt,name=room_code,json=roomCode,proto3" json:"room_code,omitempty"` BuildingNr string `protobuf:"bytes,3,opt,name=building_nr,json=buildingNr,proto3" json:"building_nr,omitempty"` ArchId string `protobuf:"bytes,4,opt,name=arch_id,json=archId,proto3" json:"arch_id,omitempty"` @@ -2720,7 +2491,7 @@ type RoomInformationElement struct { func (x *RoomInformationElement) Reset() { *x = RoomInformationElement{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[43] + mi := &file_tumdev_campus_backend_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2733,7 +2504,7 @@ func (x *RoomInformationElement) String() string { func (*RoomInformationElement) ProtoMessage() {} func (x *RoomInformationElement) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[43] + mi := &file_tumdev_campus_backend_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2746,7 +2517,7 @@ func (x *RoomInformationElement) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomInformationElement.ProtoReflect.Descriptor instead. func (*RoomInformationElement) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{43} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{41} } func (x *RoomInformationElement) GetRoomId() int32 { @@ -2812,78 +2583,29 @@ func (x *RoomInformationElement) GetName() string { return "" } -type GetListOfElevatorsReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ListOfElevators []*RoomInformationElement `protobuf:"bytes,1,rep,name=listOfElevators,proto3" json:"listOfElevators,omitempty"` -} - -func (x *GetListOfElevatorsReply) Reset() { - *x = GetListOfElevatorsReply{} - if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetListOfElevatorsReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetListOfElevatorsReply) ProtoMessage() {} - -func (x *GetListOfElevatorsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[44] - 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 GetListOfElevatorsReply.ProtoReflect.Descriptor instead. -func (*GetListOfElevatorsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{44} -} - -func (x *GetListOfElevatorsReply) GetListOfElevators() []*RoomInformationElement { - if x != nil { - return x.ListOfElevators - } - return nil -} - -type GetMoreInformationReply struct { +type GetMoreInformationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Information []*MoreInformationElement `protobuf:"bytes,1,rep,name=information,proto3" json:"information,omitempty"` } -func (x *GetMoreInformationReply) Reset() { - *x = GetMoreInformationReply{} +func (x *GetMoreInformationRequest) Reset() { + *x = GetMoreInformationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[45] + mi := &file_tumdev_campus_backend_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *GetMoreInformationReply) String() string { +func (x *GetMoreInformationRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMoreInformationReply) ProtoMessage() {} +func (*GetMoreInformationRequest) ProtoMessage() {} -func (x *GetMoreInformationReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[45] +func (x *GetMoreInformationRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2894,45 +2616,36 @@ func (x *GetMoreInformationReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMoreInformationReply.ProtoReflect.Descriptor instead. -func (*GetMoreInformationReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{45} -} - -func (x *GetMoreInformationReply) GetInformation() []*MoreInformationElement { - if x != nil { - return x.Information - } - return nil +// Deprecated: Use GetMoreInformationRequest.ProtoReflect.Descriptor instead. +func (*GetMoreInformationRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{42} } -type MoreInformationElement struct { +type GetMoreInformationReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` - Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` + Infos []*GetMoreInformationReply_MoreInformation `protobuf:"bytes,1,rep,name=infos,proto3" json:"infos,omitempty"` } -func (x *MoreInformationElement) Reset() { - *x = MoreInformationElement{} +func (x *GetMoreInformationReply) Reset() { + *x = GetMoreInformationReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[46] + mi := &file_tumdev_campus_backend_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MoreInformationElement) String() string { +func (x *GetMoreInformationReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MoreInformationElement) ProtoMessage() {} +func (*GetMoreInformationReply) ProtoMessage() {} -func (x *MoreInformationElement) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[46] +func (x *GetMoreInformationReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2943,30 +2656,16 @@ func (x *MoreInformationElement) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MoreInformationElement.ProtoReflect.Descriptor instead. -func (*MoreInformationElement) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{46} -} - -func (x *MoreInformationElement) GetTitle() string { - if x != nil { - return x.Title - } - return "" -} - -func (x *MoreInformationElement) GetCategory() string { - if x != nil { - return x.Category - } - return "" +// Deprecated: Use GetMoreInformationReply.ProtoReflect.Descriptor instead. +func (*GetMoreInformationReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{43} } -func (x *MoreInformationElement) GetUrl() string { +func (x *GetMoreInformationReply) GetInfos() []*GetMoreInformationReply_MoreInformation { if x != nil { - return x.Url + return x.Infos } - return "" + return nil } type GetOpeningTimesRequest struct { @@ -2980,7 +2679,7 @@ type GetOpeningTimesRequest struct { func (x *GetOpeningTimesRequest) Reset() { *x = GetOpeningTimesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[47] + mi := &file_tumdev_campus_backend_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2993,7 +2692,7 @@ func (x *GetOpeningTimesRequest) String() string { func (*GetOpeningTimesRequest) ProtoMessage() {} func (x *GetOpeningTimesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[47] + mi := &file_tumdev_campus_backend_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3006,7 +2705,7 @@ func (x *GetOpeningTimesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOpeningTimesRequest.ProtoReflect.Descriptor instead. func (*GetOpeningTimesRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{47} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{44} } func (x *GetOpeningTimesRequest) GetLanguage() string { @@ -3027,7 +2726,7 @@ type GetOpeningTimesReply struct { func (x *GetOpeningTimesReply) Reset() { *x = GetOpeningTimesReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[48] + mi := &file_tumdev_campus_backend_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3040,7 +2739,7 @@ func (x *GetOpeningTimesReply) String() string { func (*GetOpeningTimesReply) ProtoMessage() {} func (x *GetOpeningTimesReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[48] + mi := &file_tumdev_campus_backend_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3053,7 +2752,7 @@ func (x *GetOpeningTimesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOpeningTimesReply.ProtoReflect.Descriptor instead. func (*GetOpeningTimesReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{48} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{45} } func (x *GetOpeningTimesReply) GetFacilities() []*OpeningTimesMsgElement { @@ -3084,7 +2783,7 @@ type OpeningTimesMsgElement struct { func (x *OpeningTimesMsgElement) Reset() { *x = OpeningTimesMsgElement{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[49] + mi := &file_tumdev_campus_backend_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3097,7 +2796,7 @@ func (x *OpeningTimesMsgElement) String() string { func (*OpeningTimesMsgElement) ProtoMessage() {} func (x *OpeningTimesMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[49] + mi := &file_tumdev_campus_backend_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3110,7 +2809,7 @@ func (x *OpeningTimesMsgElement) ProtoReflect() protoreflect.Message { // Deprecated: Use OpeningTimesMsgElement.ProtoReflect.Descriptor instead. func (*OpeningTimesMsgElement) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{49} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{46} } func (x *OpeningTimesMsgElement) GetId() int32 { @@ -3195,13 +2894,13 @@ type GetUpdateNoteRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + Version int64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` } func (x *GetUpdateNoteRequest) Reset() { *x = GetUpdateNoteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[50] + mi := &file_tumdev_campus_backend_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3214,7 +2913,7 @@ func (x *GetUpdateNoteRequest) String() string { func (*GetUpdateNoteRequest) ProtoMessage() {} func (x *GetUpdateNoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[50] + mi := &file_tumdev_campus_backend_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3227,10 +2926,10 @@ func (x *GetUpdateNoteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUpdateNoteRequest.ProtoReflect.Descriptor instead. func (*GetUpdateNoteRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{50} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{47} } -func (x *GetUpdateNoteRequest) GetVersion() int32 { +func (x *GetUpdateNoteRequest) GetVersion() int64 { if x != nil { return x.Version } @@ -3242,13 +2941,14 @@ type GetUpdateNoteReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + VersionName string `protobuf:"bytes,2,opt,name=version_name,json=versionName,proto3" json:"version_name,omitempty"` } func (x *GetUpdateNoteReply) Reset() { *x = GetUpdateNoteReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[51] + mi := &file_tumdev_campus_backend_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3261,7 +2961,7 @@ func (x *GetUpdateNoteReply) String() string { func (*GetUpdateNoteReply) ProtoMessage() {} func (x *GetUpdateNoteReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[51] + mi := &file_tumdev_campus_backend_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3274,7 +2974,7 @@ func (x *GetUpdateNoteReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUpdateNoteReply.ProtoReflect.Descriptor instead. func (*GetUpdateNoteReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{51} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{48} } func (x *GetUpdateNoteReply) GetMessage() string { @@ -3284,6 +2984,51 @@ func (x *GetUpdateNoteReply) GetMessage() string { return "" } +func (x *GetUpdateNoteReply) GetVersionName() string { + if x != nil { + return x.VersionName + } + return "" +} + +type GetStudyRoomListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetStudyRoomListRequest) Reset() { + *x = GetStudyRoomListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStudyRoomListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStudyRoomListRequest) ProtoMessage() {} + +func (x *GetStudyRoomListRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[49] + 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 GetStudyRoomListRequest.ProtoReflect.Descriptor instead. +func (*GetStudyRoomListRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{49} +} + type GetStudyRoomListReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3295,7 +3040,7 @@ type GetStudyRoomListReply struct { func (x *GetStudyRoomListReply) Reset() { *x = GetStudyRoomListReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[52] + mi := &file_tumdev_campus_backend_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3308,7 +3053,7 @@ func (x *GetStudyRoomListReply) String() string { func (*GetStudyRoomListReply) ProtoMessage() {} func (x *GetStudyRoomListReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[52] + mi := &file_tumdev_campus_backend_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3321,7 +3066,7 @@ func (x *GetStudyRoomListReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStudyRoomListReply.ProtoReflect.Descriptor instead. func (*GetStudyRoomListReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{52} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{50} } func (x *GetStudyRoomListReply) GetRooms() []*StudyRoomMsgElement { @@ -3345,7 +3090,7 @@ type StudyRoomMsgElement struct { func (x *StudyRoomMsgElement) Reset() { *x = StudyRoomMsgElement{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[53] + mi := &file_tumdev_campus_backend_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3358,7 +3103,7 @@ func (x *StudyRoomMsgElement) String() string { func (*StudyRoomMsgElement) ProtoMessage() {} func (x *StudyRoomMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[53] + mi := &file_tumdev_campus_backend_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3371,7 +3116,7 @@ func (x *StudyRoomMsgElement) ProtoReflect() protoreflect.Message { // Deprecated: Use StudyRoomMsgElement.ProtoReflect.Descriptor instead. func (*StudyRoomMsgElement) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{53} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{51} } func (x *StudyRoomMsgElement) GetId() int32 { @@ -3408,7 +3153,7 @@ type StudyRoom struct { unknownFields protoimpl.UnknownFields GroupId int32 `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - RoomId int32 `protobuf:"varint,2,opt,name=roomId,proto3" json:"roomId,omitempty"` + RoomId int32 `protobuf:"varint,2,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` RoomCode string `protobuf:"bytes,3,opt,name=room_code,json=roomCode,proto3" json:"room_code,omitempty"` RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"` BuildingName string `protobuf:"bytes,5,opt,name=building_name,json=buildingName,proto3" json:"building_name,omitempty"` @@ -3417,7 +3162,7 @@ type StudyRoom struct { func (x *StudyRoom) Reset() { *x = StudyRoom{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[54] + mi := &file_tumdev_campus_backend_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3430,7 +3175,7 @@ func (x *StudyRoom) String() string { func (*StudyRoom) ProtoMessage() {} func (x *StudyRoom) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[54] + mi := &file_tumdev_campus_backend_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3443,7 +3188,7 @@ func (x *StudyRoom) ProtoReflect() protoreflect.Message { // Deprecated: Use StudyRoom.ProtoReflect.Descriptor instead. func (*StudyRoom) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{54} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{52} } func (x *StudyRoom) GetGroupId() int32 { @@ -3486,13 +3231,13 @@ type GetKinoRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LastId int32 `protobuf:"varint,1,opt,name=lastId,proto3" json:"lastId,omitempty"` + LastId int32 `protobuf:"varint,1,opt,name=last_id,json=lastId,proto3" json:"last_id,omitempty"` } func (x *GetKinoRequest) Reset() { *x = GetKinoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[55] + mi := &file_tumdev_campus_backend_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3505,7 +3250,7 @@ func (x *GetKinoRequest) String() string { func (*GetKinoRequest) ProtoMessage() {} func (x *GetKinoRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[55] + mi := &file_tumdev_campus_backend_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3518,7 +3263,7 @@ func (x *GetKinoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKinoRequest.ProtoReflect.Descriptor instead. func (*GetKinoRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{55} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{53} } func (x *GetKinoRequest) GetLastId() int32 { @@ -3539,7 +3284,7 @@ type GetKinoReply struct { func (x *GetKinoReply) Reset() { *x = GetKinoReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[56] + mi := &file_tumdev_campus_backend_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3552,7 +3297,7 @@ func (x *GetKinoReply) String() string { func (*GetKinoReply) ProtoMessage() {} func (x *GetKinoReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[56] + mi := &file_tumdev_campus_backend_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3565,7 +3310,7 @@ func (x *GetKinoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKinoReply.ProtoReflect.Descriptor instead. func (*GetKinoReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{56} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{54} } func (x *GetKinoReply) GetKinos() []*KinoMsgElement { @@ -3601,7 +3346,7 @@ type KinoMsgElement struct { func (x *KinoMsgElement) Reset() { *x = KinoMsgElement{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[57] + mi := &file_tumdev_campus_backend_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3614,7 +3359,7 @@ func (x *KinoMsgElement) String() string { func (*KinoMsgElement) ProtoMessage() {} func (x *KinoMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[57] + mi := &file_tumdev_campus_backend_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3627,7 +3372,7 @@ func (x *KinoMsgElement) ProtoReflect() protoreflect.Message { // Deprecated: Use KinoMsgElement.ProtoReflect.Descriptor instead. func (*KinoMsgElement) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{57} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{55} } func (x *KinoMsgElement) GetName() string { @@ -3742,6 +3487,44 @@ func (x *KinoMsgElement) GetLink() string { return "" } +type SendFeedbackReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SendFeedbackReply) Reset() { + *x = SendFeedbackReply{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SendFeedbackReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SendFeedbackReply) ProtoMessage() {} + +func (x *SendFeedbackReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[56] + 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 SendFeedbackReply.ProtoReflect.Descriptor instead. +func (*SendFeedbackReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{56} +} + type SendFeedbackRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3749,19 +3532,19 @@ type SendFeedbackRequest struct { Topic string `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"` Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` - EmailId string `protobuf:"bytes,3,opt,name=emailId,proto3" json:"emailId,omitempty"` + EmailId string `protobuf:"bytes,3,opt,name=email_id,json=emailId,proto3" json:"email_id,omitempty"` Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` ImageCount int32 `protobuf:"varint,5,opt,name=image_count,json=imageCount,proto3" json:"image_count,omitempty"` Latitude float64 `protobuf:"fixed64,6,opt,name=latitude,proto3" json:"latitude,omitempty"` Longitude float64 `protobuf:"fixed64,7,opt,name=longitude,proto3" json:"longitude,omitempty"` - OsVersion string `protobuf:"bytes,8,opt,name=osVersion,proto3" json:"osVersion,omitempty"` - AppVersion string `protobuf:"bytes,9,opt,name=appVersion,proto3" json:"appVersion,omitempty"` + OsVersion string `protobuf:"bytes,8,opt,name=os_version,json=osVersion,proto3" json:"os_version,omitempty"` + AppVersion string `protobuf:"bytes,9,opt,name=app_version,json=appVersion,proto3" json:"app_version,omitempty"` } func (x *SendFeedbackRequest) Reset() { *x = SendFeedbackRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[58] + mi := &file_tumdev_campus_backend_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3774,7 +3557,7 @@ func (x *SendFeedbackRequest) String() string { func (*SendFeedbackRequest) ProtoMessage() {} func (x *SendFeedbackRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[58] + mi := &file_tumdev_campus_backend_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3787,7 +3570,7 @@ func (x *SendFeedbackRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendFeedbackRequest.ProtoReflect.Descriptor instead. func (*SendFeedbackRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{58} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{57} } func (x *SendFeedbackRequest) GetTopic() string { @@ -3864,7 +3647,7 @@ type SendFeedbackImageReply struct { func (x *SendFeedbackImageReply) Reset() { *x = SendFeedbackImageReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[59] + mi := &file_tumdev_campus_backend_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3877,7 +3660,7 @@ func (x *SendFeedbackImageReply) String() string { func (*SendFeedbackImageReply) ProtoMessage() {} func (x *SendFeedbackImageReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[59] + mi := &file_tumdev_campus_backend_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3890,7 +3673,7 @@ func (x *SendFeedbackImageReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SendFeedbackImageReply.ProtoReflect.Descriptor instead. func (*SendFeedbackImageReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{59} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{58} } func (x *SendFeedbackImageReply) GetStatus() string { @@ -3906,13 +3689,13 @@ type SendFeedbackImageRequest struct { unknownFields protoimpl.UnknownFields Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - ImageNr int32 `protobuf:"varint,2,opt,name=imageNr,proto3" json:"imageNr,omitempty"` //todo where does the file come from? + ImageNr int32 `protobuf:"varint,2,opt,name=image_nr,json=imageNr,proto3" json:"image_nr,omitempty"` //todo where does the file come from? } func (x *SendFeedbackImageRequest) Reset() { *x = SendFeedbackImageRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[60] + mi := &file_tumdev_campus_backend_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3925,7 +3708,7 @@ func (x *SendFeedbackImageRequest) String() string { func (*SendFeedbackImageRequest) ProtoMessage() {} func (x *SendFeedbackImageRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[60] + mi := &file_tumdev_campus_backend_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3938,7 +3721,7 @@ func (x *SendFeedbackImageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendFeedbackImageRequest.ProtoReflect.Descriptor instead. func (*SendFeedbackImageRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{60} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{59} } func (x *SendFeedbackImageRequest) GetId() int32 { @@ -3960,13 +3743,13 @@ type GetMembersRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LrzId string `protobuf:"bytes,1,opt,name=lrzId,proto3" json:"lrzId,omitempty"` + LrzId string `protobuf:"bytes,1,opt,name=lrz_id,json=lrzId,proto3" json:"lrz_id,omitempty"` } func (x *GetMembersRequest) Reset() { *x = GetMembersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[61] + mi := &file_tumdev_campus_backend_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3979,7 +3762,7 @@ func (x *GetMembersRequest) String() string { func (*GetMembersRequest) ProtoMessage() {} func (x *GetMembersRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[61] + mi := &file_tumdev_campus_backend_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3992,7 +3775,7 @@ func (x *GetMembersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMembersRequest.ProtoReflect.Descriptor instead. func (*GetMembersRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{61} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{60} } func (x *GetMembersRequest) GetLrzId() string { @@ -4007,15 +3790,15 @@ type GetMembersReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LrzId string `protobuf:"bytes,1,opt,name=lrzId,proto3" json:"lrzId,omitempty"` + LrzId string `protobuf:"bytes,1,opt,name=lrz_id,json=lrzId,proto3" json:"lrz_id,omitempty"` Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - MemberId int32 `protobuf:"varint,3,opt,name=memberId,proto3" json:"memberId,omitempty"` + MemberId int32 `protobuf:"varint,3,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"` } func (x *GetMembersReply) Reset() { *x = GetMembersReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[62] + mi := &file_tumdev_campus_backend_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4028,7 +3811,7 @@ func (x *GetMembersReply) String() string { func (*GetMembersReply) ProtoMessage() {} func (x *GetMembersReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[62] + mi := &file_tumdev_campus_backend_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4041,7 +3824,7 @@ func (x *GetMembersReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMembersReply.ProtoReflect.Descriptor instead. func (*GetMembersReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{62} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{61} } func (x *GetMembersReply) GetLrzId() string { @@ -4070,13 +3853,13 @@ type GetUploadStatusRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - LrzId string `protobuf:"bytes,1,opt,name=lrzId,proto3" json:"lrzId,omitempty"` + LrzId string `protobuf:"bytes,1,opt,name=lrz_id,json=lrzId,proto3" json:"lrz_id,omitempty"` } func (x *GetUploadStatusRequest) Reset() { *x = GetUploadStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[63] + mi := &file_tumdev_campus_backend_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4089,7 +3872,7 @@ func (x *GetUploadStatusRequest) String() string { func (*GetUploadStatusRequest) ProtoMessage() {} func (x *GetUploadStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[63] + mi := &file_tumdev_campus_backend_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4102,7 +3885,7 @@ func (x *GetUploadStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUploadStatusRequest.ProtoReflect.Descriptor instead. func (*GetUploadStatusRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{63} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{62} } func (x *GetUploadStatusRequest) GetLrzId() string { @@ -4127,7 +3910,7 @@ type GetUploadStatusReply struct { func (x *GetUploadStatusReply) Reset() { *x = GetUploadStatusReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[64] + mi := &file_tumdev_campus_backend_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4140,7 +3923,7 @@ func (x *GetUploadStatusReply) String() string { func (*GetUploadStatusReply) ProtoMessage() {} func (x *GetUploadStatusReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[64] + mi := &file_tumdev_campus_backend_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4153,7 +3936,7 @@ func (x *GetUploadStatusReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUploadStatusReply.ProtoReflect.Descriptor instead. func (*GetUploadStatusReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{64} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{63} } func (x *GetUploadStatusReply) GetFcmToken() string { @@ -4170,41 +3953,88 @@ func (x *GetUploadStatusReply) GetPublicKey() string { return "" } -func (x *GetUploadStatusReply) GetStudentId() bool { - if x != nil { - return x.StudentId +func (x *GetUploadStatusReply) GetStudentId() bool { + if x != nil { + return x.StudentId + } + return false +} + +func (x *GetUploadStatusReply) GetEmployeeId() bool { + if x != nil { + return x.EmployeeId + } + return false +} + +func (x *GetUploadStatusReply) GetExternalId() bool { + if x != nil { + return x.ExternalId + } + return false +} + +type GetNotificationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NotificationId int32 `protobuf:"varint,1,opt,name=notification_id,json=notificationId,proto3" json:"notification_id,omitempty"` +} + +func (x *GetNotificationRequest) Reset() { + *x = GetNotificationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_tumdev_campus_backend_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetNotificationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetNotificationRequest) ProtoMessage() {} + +func (x *GetNotificationRequest) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (x *GetUploadStatusReply) GetEmployeeId() bool { - if x != nil { - return x.EmployeeId - } - return false +// Deprecated: Use GetNotificationRequest.ProtoReflect.Descriptor instead. +func (*GetNotificationRequest) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{64} } -func (x *GetUploadStatusReply) GetExternalId() bool { +func (x *GetNotificationRequest) GetNotificationId() int32 { if x != nil { - return x.ExternalId + return x.NotificationId } - return false + return 0 } -type GetNotificationsReply struct { +type GetNotificationReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NotificationId int32 `protobuf:"varint,1,opt,name=notificationId,proto3" json:"notificationId,omitempty"` + NotificationId int32 `protobuf:"varint,1,opt,name=notification_id,json=notificationId,proto3" json:"notification_id,omitempty"` Type int32 `protobuf:"varint,2,opt,name=type,proto3" json:"type,omitempty"` Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` Signature string `protobuf:"bytes,5,opt,name=signature,proto3" json:"signature,omitempty"` } -func (x *GetNotificationsReply) Reset() { - *x = GetNotificationsReply{} +func (x *GetNotificationReply) Reset() { + *x = GetNotificationReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4212,13 +4042,13 @@ func (x *GetNotificationsReply) Reset() { } } -func (x *GetNotificationsReply) String() string { +func (x *GetNotificationReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNotificationsReply) ProtoMessage() {} +func (*GetNotificationReply) ProtoMessage() {} -func (x *GetNotificationsReply) ProtoReflect() protoreflect.Message { +func (x *GetNotificationReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4230,56 +4060,56 @@ func (x *GetNotificationsReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNotificationsReply.ProtoReflect.Descriptor instead. -func (*GetNotificationsReply) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNotificationReply.ProtoReflect.Descriptor instead. +func (*GetNotificationReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{65} } -func (x *GetNotificationsReply) GetNotificationId() int32 { +func (x *GetNotificationReply) GetNotificationId() int32 { if x != nil { return x.NotificationId } return 0 } -func (x *GetNotificationsReply) GetType() int32 { +func (x *GetNotificationReply) GetType() int32 { if x != nil { return x.Type } return 0 } -func (x *GetNotificationsReply) GetTitle() string { +func (x *GetNotificationReply) GetTitle() string { if x != nil { return x.Title } return "" } -func (x *GetNotificationsReply) GetDescription() string { +func (x *GetNotificationReply) GetDescription() string { if x != nil { return x.Description } return "" } -func (x *GetNotificationsReply) GetSignature() string { +func (x *GetNotificationReply) GetSignature() string { if x != nil { return x.Signature } return "" } -type NotificationsRequest struct { +type GetNotificationConfirmRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - NotificationId int32 `protobuf:"varint,1,opt,name=notificationId,proto3" json:"notificationId,omitempty"` + NotificationId int32 `protobuf:"varint,1,opt,name=notification_id,json=notificationId,proto3" json:"notification_id,omitempty"` } -func (x *NotificationsRequest) Reset() { - *x = NotificationsRequest{} +func (x *GetNotificationConfirmRequest) Reset() { + *x = GetNotificationConfirmRequest{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4287,13 +4117,13 @@ func (x *NotificationsRequest) Reset() { } } -func (x *NotificationsRequest) String() string { +func (x *GetNotificationConfirmRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NotificationsRequest) ProtoMessage() {} +func (*GetNotificationConfirmRequest) ProtoMessage() {} -func (x *NotificationsRequest) ProtoReflect() protoreflect.Message { +func (x *GetNotificationConfirmRequest) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4305,19 +4135,19 @@ func (x *NotificationsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NotificationsRequest.ProtoReflect.Descriptor instead. -func (*NotificationsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNotificationConfirmRequest.ProtoReflect.Descriptor instead. +func (*GetNotificationConfirmRequest) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{66} } -func (x *NotificationsRequest) GetNotificationId() int32 { +func (x *GetNotificationConfirmRequest) GetNotificationId() int32 { if x != nil { return x.NotificationId } return 0 } -type GetNotificationsConfirmReply struct { +type GetNotificationConfirmReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -4325,8 +4155,8 @@ type GetNotificationsConfirmReply struct { Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` } -func (x *GetNotificationsConfirmReply) Reset() { - *x = GetNotificationsConfirmReply{} +func (x *GetNotificationConfirmReply) Reset() { + *x = GetNotificationConfirmReply{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4334,13 +4164,13 @@ func (x *GetNotificationsConfirmReply) Reset() { } } -func (x *GetNotificationsConfirmReply) String() string { +func (x *GetNotificationConfirmReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetNotificationsConfirmReply) ProtoMessage() {} +func (*GetNotificationConfirmReply) ProtoMessage() {} -func (x *GetNotificationsConfirmReply) ProtoReflect() protoreflect.Message { +func (x *GetNotificationConfirmReply) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4352,12 +4182,12 @@ func (x *GetNotificationsConfirmReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetNotificationsConfirmReply.ProtoReflect.Descriptor instead. -func (*GetNotificationsConfirmReply) Descriptor() ([]byte, []int) { +// Deprecated: Use GetNotificationConfirmReply.ProtoReflect.Descriptor instead. +func (*GetNotificationConfirmReply) Descriptor() ([]byte, []int) { return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{67} } -func (x *GetNotificationsConfirmReply) GetStatus() string { +func (x *GetNotificationConfirmReply) GetStatus() string { if x != nil { return x.Status } @@ -4370,7 +4200,7 @@ type GetCanteenHeadCountRequest struct { unknownFields protoimpl.UnknownFields // The requested canteen ID - CanteenId string `protobuf:"bytes,1,opt,name=canteenId,proto3" json:"canteenId,omitempty"` + CanteenId string `protobuf:"bytes,1,opt,name=canteen_id,json=canteenId,proto3" json:"canteen_id,omitempty"` } func (x *GetCanteenHeadCountRequest) Reset() { @@ -4420,7 +4250,7 @@ type GetCanteenHeadCountReply struct { // The absolut count of humans in the canteen. Only valid in case percent != -1. Count uint32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` // The maximum nunmber of humans in the canteen for the percent to be 100.00. Only valid in case percent != -1. - MaxCount uint32 `protobuf:"varint,2,opt,name=maxCount,proto3" json:"maxCount,omitempty"` + MaxCount uint32 `protobuf:"varint,2,opt,name=max_count,json=maxCount,proto3" json:"max_count,omitempty"` // Current capacity utilization of the canteen clamped to 0 and 100 or -1 in case no data is available. Percent float32 `protobuf:"fixed32,3,opt,name=percent,proto3" json:"percent,omitempty"` // A time stamp indicating how up to date the response is. Only valid in case percent != -1. @@ -4487,20 +4317,18 @@ func (x *GetCanteenHeadCountReply) GetTimestamp() *timestamppb.Timestamp { return nil } -type GetRoomScheduleReply_RoomScheduleEvent struct { +type GetMoreInformationReply_MoreInformation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Start *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=start,proto3" json:"start,omitempty"` - End *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=end,proto3" json:"end,omitempty"` - Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` - EventId int32 `protobuf:"varint,4,opt,name=event_id,json=eventId,proto3" json:"event_id,omitempty"` - CourseCode string `protobuf:"bytes,5,opt,name=course_code,json=courseCode,proto3" json:"course_code,omitempty"` + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` } -func (x *GetRoomScheduleReply_RoomScheduleEvent) Reset() { - *x = GetRoomScheduleReply_RoomScheduleEvent{} +func (x *GetMoreInformationReply_MoreInformation) Reset() { + *x = GetMoreInformationReply_MoreInformation{} if protoimpl.UnsafeEnabled { mi := &file_tumdev_campus_backend_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4508,13 +4336,13 @@ func (x *GetRoomScheduleReply_RoomScheduleEvent) Reset() { } } -func (x *GetRoomScheduleReply_RoomScheduleEvent) String() string { +func (x *GetMoreInformationReply_MoreInformation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRoomScheduleReply_RoomScheduleEvent) ProtoMessage() {} +func (*GetMoreInformationReply_MoreInformation) ProtoMessage() {} -func (x *GetRoomScheduleReply_RoomScheduleEvent) ProtoReflect() protoreflect.Message { +func (x *GetMoreInformationReply_MoreInformation) ProtoReflect() protoreflect.Message { mi := &file_tumdev_campus_backend_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4526,200 +4354,28 @@ func (x *GetRoomScheduleReply_RoomScheduleEvent) ProtoReflect() protoreflect.Mes return mi.MessageOf(x) } -// Deprecated: Use GetRoomScheduleReply_RoomScheduleEvent.ProtoReflect.Descriptor instead. -func (*GetRoomScheduleReply_RoomScheduleEvent) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{7, 0} -} - -func (x *GetRoomScheduleReply_RoomScheduleEvent) GetStart() *timestamppb.Timestamp { - if x != nil { - return x.Start - } - return nil -} - -func (x *GetRoomScheduleReply_RoomScheduleEvent) GetEnd() *timestamppb.Timestamp { - if x != nil { - return x.End - } - return nil +// Deprecated: Use GetMoreInformationReply_MoreInformation.ProtoReflect.Descriptor instead. +func (*GetMoreInformationReply_MoreInformation) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{43, 0} } -func (x *GetRoomScheduleReply_RoomScheduleEvent) GetTitle() string { +func (x *GetMoreInformationReply_MoreInformation) GetTitle() string { if x != nil { return x.Title } return "" } -func (x *GetRoomScheduleReply_RoomScheduleEvent) GetEventId() int32 { - if x != nil { - return x.EventId - } - return 0 -} - -func (x *GetRoomScheduleReply_RoomScheduleEvent) GetCourseCode() string { - if x != nil { - return x.CourseCode - } - return "" -} - -type GetRoomMapsReply_Map struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - MapId int64 `protobuf:"varint,1,opt,name=map_id,json=mapId,proto3" json:"map_id,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - Scale int64 `protobuf:"varint,3,opt,name=scale,proto3" json:"scale,omitempty"` - Width int64 `protobuf:"varint,4,opt,name=width,proto3" json:"width,omitempty"` - Height int64 `protobuf:"varint,5,opt,name=height,proto3" json:"height,omitempty"` -} - -func (x *GetRoomMapsReply_Map) Reset() { - *x = GetRoomMapsReply_Map{} - if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetRoomMapsReply_Map) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetRoomMapsReply_Map) ProtoMessage() {} - -func (x *GetRoomMapsReply_Map) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[71] - 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 GetRoomMapsReply_Map.ProtoReflect.Descriptor instead. -func (*GetRoomMapsReply_Map) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{11, 0} -} - -func (x *GetRoomMapsReply_Map) GetMapId() int64 { - if x != nil { - return x.MapId - } - return 0 -} - -func (x *GetRoomMapsReply_Map) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *GetRoomMapsReply_Map) GetScale() int64 { - if x != nil { - return x.Scale - } - return 0 -} - -func (x *GetRoomMapsReply_Map) GetWidth() int64 { - if x != nil { - return x.Width - } - return 0 -} - -func (x *GetRoomMapsReply_Map) GetHeight() int64 { - if x != nil { - return x.Height - } - return 0 -} - -type GetLocationsReply_Location struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Location string `protobuf:"bytes,1,opt,name=location,proto3" json:"location,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Lon string `protobuf:"bytes,3,opt,name=lon,proto3" json:"lon,omitempty"` - Lat string `protobuf:"bytes,4,opt,name=lat,proto3" json:"lat,omitempty"` - Radius string `protobuf:"bytes,5,opt,name=radius,proto3" json:"radius,omitempty"` -} - -func (x *GetLocationsReply_Location) Reset() { - *x = GetLocationsReply_Location{} - if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetLocationsReply_Location) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetLocationsReply_Location) ProtoMessage() {} - -func (x *GetLocationsReply_Location) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[72] - 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 GetLocationsReply_Location.ProtoReflect.Descriptor instead. -func (*GetLocationsReply_Location) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{13, 0} -} - -func (x *GetLocationsReply_Location) GetLocation() string { - if x != nil { - return x.Location - } - return "" -} - -func (x *GetLocationsReply_Location) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *GetLocationsReply_Location) GetLon() string { - if x != nil { - return x.Lon - } - return "" -} - -func (x *GetLocationsReply_Location) GetLat() string { +func (x *GetMoreInformationReply_MoreInformation) GetCategory() string { if x != nil { - return x.Lat + return x.Category } return "" } -func (x *GetLocationsReply_Location) GetRadius() string { +func (x *GetMoreInformationReply_MoreInformation) GetUrl() string { if x != nil { - return x.Radius + return x.Url } return "" } @@ -4731,401 +4387,324 @@ var file_tumdev_campus_backend_proto_rawDesc = []byte{ 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, - 0x01, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x31, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x62, 0x0a, 0x13, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0a, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2f, 0x0a, - 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x59, - 0x0a, 0x1f, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x39, 0x0a, 0x1d, 0x49, 0x4f, 0x53, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x99, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x0b, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x32, 0x0a, + 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x22, 0x64, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x30, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x5a, 0x0a, 0x1f, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, - 0x6f, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, - 0x65, 0x6e, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x43, 0x0a, 0x06, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x1a, 0xc5, 0x01, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x72, - 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6f, 0x75, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x34, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x22, - 0x78, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, - 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x74, - 0x6d, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x74, - 0x6d, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x74, 0x6d, 0x5f, 0x65, 0x61, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x75, 0x74, 0x6d, 0x45, - 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x74, 0x6d, 0x5f, 0x6e, 0x6f, - 0x72, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x75, 0x74, - 0x6d, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0x2d, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x22, 0xc6, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2d, 0x0a, - 0x04, 0x6d, 0x61, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x2e, 0x4d, 0x61, 0x70, 0x52, 0x04, 0x6d, 0x61, 0x70, 0x73, 0x1a, 0x82, 0x01, 0x0a, - 0x03, 0x4d, 0x61, 0x70, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x61, 0x70, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, - 0x61, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x22, 0x31, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xca, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x09, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x76, 0x0a, 0x08, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6c, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x64, - 0x69, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, - 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x33, 0x0a, - 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x1f, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x09, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x05, 0x72, 0x6f, 0x6f, - 0x6d, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x04, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, - 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, - 0x72, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x72, 0x70, - 0x6f, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, - 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3c, - 0x0a, 0x0f, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x0a, - 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0xd4, 0x01, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x12, 0x0a, - 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, - 0x6b, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x02, 0x74, 0x6f, 0x22, 0xac, 0x01, 0x0a, 0x16, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, - 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, - 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, - 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, - 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, - 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, - 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x2e, - 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, - 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x22, 0xc4, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, - 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, - 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, - 0x78, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0xf1, 0x01, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x68, - 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, - 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, - 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6d, 0x61, 0x78, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x6e, 0x61, 0x6d, - 0x65, 0x54, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x22, 0xcb, 0x01, 0x0a, 0x11, - 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x39, 0x0a, 0x1d, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0xc3, 0x01, 0x0a, 0x08, 0x4e, 0x65, 0x77, 0x73, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x31, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x21, 0x0a, 0x04, 0x6e, 0x65, 0x77, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x49, + 0x74, 0x65, 0x6d, 0x52, 0x04, 0x6e, 0x65, 0x77, 0x73, 0x22, 0x53, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x77, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x6e, 0x65, 0x77, 0x73, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x17, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x40, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4e, 0x65, + 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x0a, 0x4e, 0x65, 0x77, + 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0x13, 0x0a, 0x11, 0x47, 0x65, 0x74, + 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd4, + 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, + 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, + 0x69, 0x6e, 0x6b, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x22, 0xb5, 0x01, 0x0a, 0x19, 0x4e, 0x65, - 0x77, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x22, 0xc4, 0x01, 0x0a, 0x14, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, + 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, + 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x02, 0x74, 0x6f, 0x22, 0xab, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, + 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, + 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x22, 0xc7, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, + 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, + 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, + 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, + 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x35, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0xbc, 0x01, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, + 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xf7, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x06, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, + 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x35, 0x0a, 0x0b, + 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x67, 0x73, 0x12, 0x31, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x08, 0x6e, 0x61, + 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x11, 0x53, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, + 0x34, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x69, + 0x73, 0x69, 0x74, 0x65, 0x64, 0x22, 0x17, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x6e, 0x74, + 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xb1, + 0x01, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, - 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x31, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, + 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x14, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xc2, 0x01, 0x0a, 0x14, 0x4e, 0x65, 0x77, + 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x1d, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x68, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4f, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, + 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, + 0x77, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x14, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x46, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, + 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, - 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x0c, 0x54, - 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, - 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, - 0x6e, 0x22, 0x39, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, - 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x43, 0x0a, 0x13, - 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x22, 0x6f, 0x0a, 0x0f, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, - 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, - 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, - 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, - 0x61, 0x78, 0x22, 0x41, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, - 0x65, 0x72, 0x69, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x09, 0x63, 0x61, 0x66, 0x65, - 0x74, 0x65, 0x72, 0x69, 0x61, 0x22, 0x6f, 0x0a, 0x09, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, - 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, - 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x6e, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, - 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, - 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x79, 0x65, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x77, 0x65, 0x65, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x03, 0x64, 0x61, 0x79, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, - 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x22, 0x68, 0x0a, 0x19, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, - 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x22, 0x92, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x66, - 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, - 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x75, 0x6d, 0x49, 0x44, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x75, 0x6d, 0x49, 0x44, 0x22, 0x54, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, - 0x47, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x45, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, - 0x73, 0x22, 0x5f, 0x0a, 0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, - 0x73, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, - 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, - 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, - 0x64, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, - 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, - 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x5b, 0x0a, 0x1a, 0x61, 0x72, 0x65, - 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x61, 0x72, 0x65, 0x61, - 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x22, 0x47, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, - 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x22, - 0x5a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x41, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, - 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6c, 0x69, - 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x16, - 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, - 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x17, 0x0a, 0x07, - 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, - 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, - 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x60, 0x0a, 0x17, 0x47, 0x65, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x45, 0x0a, 0x0f, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, - 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x6c, 0x69, 0x73, 0x74, - 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x58, 0x0a, 0x17, 0x47, - 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x16, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x75, 0x72, 0x6c, 0x22, 0x34, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xbf, - 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, - 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, - 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, - 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, - 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, - 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x66, - 0x6f, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x12, - 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, - 0x22, 0x30, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x47, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, + 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x47, + 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x52, 0x0a, + 0x1c, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x32, 0x0a, + 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, + 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, + 0x73, 0x22, 0x45, 0x0a, 0x0c, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, + 0x77, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x61, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x6e, 0x22, 0x3a, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x61, 0x67, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x22, 0x44, 0x0a, 0x13, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x74, + 0x61, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x70, 0x0a, 0x0f, 0x52, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, + 0x06, 0x74, 0x61, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, + 0x61, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, + 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x22, 0x14, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x07, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, + 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x07, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x22, 0x6d, + 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x6b, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x79, 0x65, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x64, 0x61, 0x79, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x69, 0x73, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, + 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x62, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x45, 0x0a, 0x12, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, + 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, + 0x75, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x75, 0x6d, + 0x49, 0x64, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, + 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, + 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, + 0x72, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb4, + 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x42, 0x0a, 0x05, 0x69, 0x6e, + 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x55, + 0x0a, 0x0f, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x34, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x22, 0xbf, 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, + 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x49, 0x64, 0x22, 0x30, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x47, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, @@ -5137,383 +4716,338 @@ var file_tumdev_campus_backend_proto_rawDesc = []byte{ 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x52, - 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x75, 0x64, 0x79, + 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x9e, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, - 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, - 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, - 0x22, 0x39, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x29, 0x0a, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x22, 0xbe, 0x03, 0x0a, 0x0e, - 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x6f, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x8e, 0x02, 0x0a, - 0x13, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x30, 0x0a, - 0x16, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0x44, 0x0a, 0x18, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x4e, 0x72, 0x22, 0x29, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, - 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, - 0x22, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x63, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x63, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, - 0x0b, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x22, - 0xa9, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, + 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4b, 0x69, + 0x6e, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, + 0x49, 0x64, 0x22, 0x39, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x22, 0xbe, 0x03, + 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x6f, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x07, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, + 0x6e, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x13, + 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x91, 0x02, 0x0a, 0x13, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, + 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, + 0x63, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, + 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, + 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x73, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x73, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x30, 0x0a, 0x16, 0x53, 0x65, 0x6e, 0x64, 0x46, + 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x45, 0x0a, 0x18, 0x53, 0x65, 0x6e, + 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, + 0x22, 0x2a, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0x59, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x15, 0x0a, 0x06, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x63, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x63, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, + 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x41, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x3e, 0x0a, 0x14, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x36, 0x0a, 0x1c, 0x47, - 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, - 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x22, - 0xa0, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, - 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x2a, 0x2f, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x07, 0x0a, 0x03, 0x49, 0x4f, 0x53, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4e, 0x44, - 0x52, 0x4f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, - 0x53, 0x10, 0x02, 0x32, 0xb0, 0x1e, 0x0a, 0x06, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x4d, - 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, - 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x74, 0x6f, 0x70, 0x12, 0x5e, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, - 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x62, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x0d, - 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x68, 0x0a, - 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x12, 0x17, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x29, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x62, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x17, - 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, - 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x6a, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, - 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x22, 0x62, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x15, 0x2f, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x7d, 0x12, 0x60, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, - 0x70, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, - 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x62, 0x04, 0x6d, - 0x61, 0x70, 0x73, 0x22, 0x10, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, - 0x2f, 0x6d, 0x61, 0x70, 0x73, 0x12, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, - 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, - 0x72, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x7b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x30, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x62, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x22, 0x1d, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x6f, - 0x6f, 0x6d, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, 0x12, - 0x6f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x66, - 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x63, 0x61, 0x66, 0x65, - 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, - 0x12, 0x5b, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x69, - 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x6e, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x66, - 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x5f, 0x0a, + 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x48, 0x0a, + 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x35, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3b, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x22, 0xa1, 0x01, 0x0a, 0x18, + 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, + 0x2f, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, + 0x03, 0x49, 0x4f, 0x53, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, + 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x10, 0x02, + 0x32, 0xec, 0x17, 0x0a, 0x06, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x47, + 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, + 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, + 0x09, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x74, 0x6f, 0x70, 0x12, 0x66, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x62, 0x07, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x12, 0x0d, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x55, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x12, 0x13, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x62, 0x04, 0x6e, + 0x65, 0x77, 0x73, 0x12, 0x14, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x7b, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x6e, 0x65, 0x77, 0x73, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x6f, 0x0a, 0x11, 0x47, 0x65, 0x74, + 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1d, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, + 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x63, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1a, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, + 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, + 0x6c, 0x0a, 0x10, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x6e, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x60, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, - 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x71, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, - 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x26, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, + 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, + 0x89, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, + 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x68, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x29, 0x62, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x1a, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, + 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x6c, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x27, 0x62, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, - 0x6c, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x7b, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, - 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x6c, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, - 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x62, - 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x18, 0x2f, 0x63, 0x61, 0x66, - 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x61, 0x6c, 0x6c, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x73, 0x12, 0x56, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, - 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x62, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x0f, 0x2f, 0x64, 0x69, - 0x73, 0x68, 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x14, + 0x6c, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x54, 0x61, 0x67, 0x73, 0x12, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x54, + 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x62, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, + 0x67, 0x73, 0x12, 0x1d, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, + 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x62, 0x07, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x12, 0x14, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x61, 0x6c, 0x6c, 0x43, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x12, 0x56, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x44, 0x69, + 0x73, 0x68, 0x65, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, + 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x62, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x0f, + 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x77, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, - 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, - 0x65, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x62, 0x61, 0x72, 0x72, - 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, - 0x32, 0x47, 0x70, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, - 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, - 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x12, 0x13, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, - 0x2f, 0x6e, 0x65, 0x61, 0x72, 0x62, 0x79, 0x12, 0x64, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, - 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x6a, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, - 0x6f, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x18, 0x12, 0x16, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, - 0x65, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, - 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, - 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x6d, 0x6f, 0x72, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x1b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, - 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2f, 0x7b, 0x6c, - 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x7d, 0x12, 0x62, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x6e, 0x6f, - 0x74, 0x65, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x5b, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, - 0x74, 0x75, 0x64, 0x79, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x4b, 0x69, 0x6e, 0x6f, 0x12, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69, - 0x6e, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x16, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x6b, 0x69, 0x6e, 0x6f, 0x2f, 0x7b, 0x6c, 0x61, 0x73, - 0x74, 0x49, 0x64, 0x7d, 0x12, 0x58, 0x0a, 0x0c, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, - 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, - 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x22, 0x09, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x71, - 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, - 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, - 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x18, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, - 0x63, 0x6b, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, - 0x7d, 0x12, 0x6b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x7d, 0x12, 0x71, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, + 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x17, 0x12, 0x15, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x12, 0x78, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, + 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, + 0x65, 0x65, 0x2f, 0x6d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4f, + 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x7d, 0x12, + 0x62, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, + 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x7d, 0x12, 0x61, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, + 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x74, 0x75, 0x64, + 0x79, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x12, 0x4a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, + 0x6f, 0x12, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x11, 0x12, 0x0f, 0x2f, 0x6b, 0x69, 0x6e, 0x6f, 0x2f, 0x7b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, + 0x64, 0x7d, 0x12, 0x53, 0x0a, 0x0c, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, + 0x63, 0x6b, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, + 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x09, 0x2f, 0x66, + 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x72, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x46, + 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, + 0x22, 0x19, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x2f, 0x7b, 0x69, 0x64, 0x7d, + 0x2f, 0x7b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x72, 0x7d, 0x12, 0x6c, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, + 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, + 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x73, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, - 0x12, 0x1f, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x7d, 0x12, 0x87, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x12, 0x19, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x29, 0x12, 0x27, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x7d, 0x12, 0x54, 0x0a, 0x0a, 0x47, - 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, - 0x10, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x49, 0x64, - 0x7d, 0x12, 0x7d, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, - 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x12, 0x1e, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x7d, - 0x12, 0x99, 0x01, 0x0a, 0x18, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, - 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x69, 0x6f, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, - 0x07, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x42, 0x5e, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x2e, 0x74, 0x75, - 0x6d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0e, 0x43, 0x61, - 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x25, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x55, 0x4d, 0x2d, 0x44, - 0x65, 0x76, 0x2f, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, - 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x90, + 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x2f, + 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x7d, 0x12, 0x55, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, + 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x19, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, + 0x7b, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, + 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x99, 0x01, 0x0a, 0x18, 0x49, 0x4f, 0x53, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x69, 0x6f, 0x73, + 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x12, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x5d, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x42, + 0x5e, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x2e, 0x74, 0x75, 0x6d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x55, 0x4d, 0x2d, 0x44, 0x65, 0x76, 0x2f, 0x43, 0x61, 0x6d, 0x70, + 0x75, 0x73, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, + 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5529,205 +5063,178 @@ func file_tumdev_campus_backend_proto_rawDescGZIP() []byte { } var file_tumdev_campus_backend_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_tumdev_campus_backend_proto_msgTypes = make([]protoimpl.MessageInfo, 73) +var file_tumdev_campus_backend_proto_msgTypes = make([]protoimpl.MessageInfo, 71) var file_tumdev_campus_backend_proto_goTypes = []interface{}{ - (DeviceType)(0), // 0: api.DeviceType - (*RegisterDeviceRequest)(nil), // 1: api.RegisterDeviceRequest - (*RegisterDeviceReply)(nil), // 2: api.RegisterDeviceReply - (*RemoveDeviceRequest)(nil), // 3: api.RemoveDeviceRequest - (*RemoveDeviceReply)(nil), // 4: api.RemoveDeviceReply - (*IOSDeviceRequestResponseRequest)(nil), // 5: api.IOSDeviceRequestResponseRequest - (*IOSDeviceRequestResponseReply)(nil), // 6: api.IOSDeviceRequestResponseReply - (*GetRoomScheduleRequest)(nil), // 7: api.GetRoomScheduleRequest - (*GetRoomScheduleReply)(nil), // 8: api.GetRoomScheduleReply - (*GetRoomCoordinatesRequest)(nil), // 9: api.GetRoomCoordinatesRequest - (*GetRoomCoordinatesReply)(nil), // 10: api.GetRoomCoordinatesReply - (*GetRoomMapsRequest)(nil), // 11: api.GetRoomMapsRequest - (*GetRoomMapsReply)(nil), // 12: api.GetRoomMapsReply - (*GetLocationsRequest)(nil), // 13: api.GetLocationsRequest - (*GetLocationsReply)(nil), // 14: api.GetLocationsReply - (*SearchRoomsRequest)(nil), // 15: api.SearchRoomsRequest - (*SearchRoomsReply)(nil), // 16: api.SearchRoomsReply - (*Room)(nil), // 17: api.Room - (*NewsSourceReply)(nil), // 18: api.NewsSourceReply - (*NewsSource)(nil), // 19: api.NewsSource - (*GetTopNewsReply)(nil), // 20: api.GetTopNewsReply - (*CafeteriaRatingRequest)(nil), // 21: api.CafeteriaRatingRequest - (*DishRatingRequest)(nil), // 22: api.DishRatingRequest - (*CafeteriaRatingReply)(nil), // 23: api.CafeteriaRatingReply - (*DishRatingReply)(nil), // 24: api.DishRatingReply - (*SingleRatingReply)(nil), // 25: api.SingleRatingReply - (*NewCafeteriaRatingRequest)(nil), // 26: api.NewCafeteriaRatingRequest - (*NewDishRatingRequest)(nil), // 27: api.NewDishRatingRequest - (*GetTagsReply)(nil), // 28: api.GetTagsReply - (*TagsOverview)(nil), // 29: api.TagsOverview - (*RatingTag)(nil), // 30: api.RatingTag - (*RatingTagNewRequest)(nil), // 31: api.RatingTagNewRequest - (*RatingTagResult)(nil), // 32: api.RatingTagResult - (*GetCafeteriaReply)(nil), // 33: api.GetCafeteriaReply - (*Cafeteria)(nil), // 34: api.Cafeteria - (*GetDishesRequest)(nil), // 35: api.GetDishesRequest - (*GetDishesReply)(nil), // 36: api.GetDishesReply - (*GetResponsiblePersonReply)(nil), // 37: api.GetResponsiblePersonReply - (*ResponsiblePersonElement)(nil), // 38: api.ResponsiblePersonElement - (*GetBuilding2GpsReply)(nil), // 39: api.GetBuilding2GpsReply - (*Building2GpsElement)(nil), // 40: api.Building2GpsElement - (*GetAreaFacilitiesByBuildingNrReply)(nil), // 41: api.GetAreaFacilitiesByBuildingNrReply - (*GetAreaFacilitiesByBuildingNrRequest)(nil), // 42: api.GetAreaFacilitiesByBuildingNrRequest - (*GetListOfToiletsReply)(nil), // 43: api.GetListOfToiletsReply - (*RoomInformationElement)(nil), // 44: api.RoomInformationElement - (*GetListOfElevatorsReply)(nil), // 45: api.GetListOfElevatorsReply - (*GetMoreInformationReply)(nil), // 46: api.GetMoreInformationReply - (*MoreInformationElement)(nil), // 47: api.MoreInformationElement - (*GetOpeningTimesRequest)(nil), // 48: api.GetOpeningTimesRequest - (*GetOpeningTimesReply)(nil), // 49: api.GetOpeningTimesReply - (*OpeningTimesMsgElement)(nil), // 50: api.OpeningTimesMsgElement - (*GetUpdateNoteRequest)(nil), // 51: api.GetUpdateNoteRequest - (*GetUpdateNoteReply)(nil), // 52: api.GetUpdateNoteReply - (*GetStudyRoomListReply)(nil), // 53: api.GetStudyRoomListReply - (*StudyRoomMsgElement)(nil), // 54: api.StudyRoomMsgElement - (*StudyRoom)(nil), // 55: api.StudyRoom - (*GetKinoRequest)(nil), // 56: api.GetKinoRequest - (*GetKinoReply)(nil), // 57: api.GetKinoReply - (*KinoMsgElement)(nil), // 58: api.KinoMsgElement - (*SendFeedbackRequest)(nil), // 59: api.SendFeedbackRequest - (*SendFeedbackImageReply)(nil), // 60: api.SendFeedbackImageReply - (*SendFeedbackImageRequest)(nil), // 61: api.SendFeedbackImageRequest - (*GetMembersRequest)(nil), // 62: api.GetMembersRequest - (*GetMembersReply)(nil), // 63: api.GetMembersReply - (*GetUploadStatusRequest)(nil), // 64: api.GetUploadStatusRequest - (*GetUploadStatusReply)(nil), // 65: api.GetUploadStatusReply - (*GetNotificationsReply)(nil), // 66: api.GetNotificationsReply - (*NotificationsRequest)(nil), // 67: api.NotificationsRequest - (*GetNotificationsConfirmReply)(nil), // 68: api.GetNotificationsConfirmReply - (*GetCanteenHeadCountRequest)(nil), // 69: api.GetCanteenHeadCountRequest - (*GetCanteenHeadCountReply)(nil), // 70: api.GetCanteenHeadCountReply - (*GetRoomScheduleReply_RoomScheduleEvent)(nil), // 71: api.GetRoomScheduleReply.RoomScheduleEvent - (*GetRoomMapsReply_Map)(nil), // 72: api.GetRoomMapsReply.Map - (*GetLocationsReply_Location)(nil), // 73: api.GetLocationsReply.Location - (*timestamppb.Timestamp)(nil), // 74: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 75: google.protobuf.Empty + (DeviceType)(0), // 0: api.DeviceType + (*RegisterDeviceRequest)(nil), // 1: api.RegisterDeviceRequest + (*RegisterDeviceReply)(nil), // 2: api.RegisterDeviceReply + (*RemoveDeviceRequest)(nil), // 3: api.RemoveDeviceRequest + (*RemoveDeviceReply)(nil), // 4: api.RemoveDeviceReply + (*IOSDeviceRequestResponseRequest)(nil), // 5: api.IOSDeviceRequestResponseRequest + (*IOSDeviceRequestResponseReply)(nil), // 6: api.IOSDeviceRequestResponseReply + (*NewsItem)(nil), // 7: api.NewsItem + (*GetNewsReply)(nil), // 8: api.GetNewsReply + (*GetNewsRequest)(nil), // 9: api.GetNewsRequest + (*GetNewsSourcesRequest)(nil), // 10: api.GetNewsSourcesRequest + (*GetNewsSourcesReply)(nil), // 11: api.GetNewsSourcesReply + (*NewsSource)(nil), // 12: api.NewsSource + (*GetTopNewsRequest)(nil), // 13: api.GetTopNewsRequest + (*GetTopNewsReply)(nil), // 14: api.GetTopNewsReply + (*GetCanteenRatingsRequest)(nil), // 15: api.GetCanteenRatingsRequest + (*GetCanteenRatingsReply)(nil), // 16: api.GetCanteenRatingsReply + (*GetDishRatingsRequest)(nil), // 17: api.GetDishRatingsRequest + (*GetDishRatingsReply)(nil), // 18: api.GetDishRatingsReply + (*SingleRatingReply)(nil), // 19: api.SingleRatingReply + (*NewCanteenRatingReply)(nil), // 20: api.NewCanteenRatingReply + (*NewCanteenRatingRequest)(nil), // 21: api.NewCanteenRatingRequest + (*NewDishRatingReply)(nil), // 22: api.NewDishRatingReply + (*NewDishRatingRequest)(nil), // 23: api.NewDishRatingRequest + (*GetAvailableDishTagsRequest)(nil), // 24: api.GetAvailableDishTagsRequest + (*GetAvailableDishTagsReply)(nil), // 25: api.GetAvailableDishTagsReply + (*GetNameTagsRequest)(nil), // 26: api.GetNameTagsRequest + (*GetNameTagsReply)(nil), // 27: api.GetNameTagsReply + (*GetAvailableCanteenTagsRequest)(nil), // 28: api.GetAvailableCanteenTagsRequest + (*GetAvailableCanteenTagsReply)(nil), // 29: api.GetAvailableCanteenTagsReply + (*TagsOverview)(nil), // 30: api.TagsOverview + (*RatingTag)(nil), // 31: api.RatingTag + (*RatingTagNewRequest)(nil), // 32: api.RatingTagNewRequest + (*RatingTagResult)(nil), // 33: api.RatingTagResult + (*GetCanteensRequest)(nil), // 34: api.GetCanteensRequest + (*GetCanteensReply)(nil), // 35: api.GetCanteensReply + (*Canteen)(nil), // 36: api.Canteen + (*GetDishesRequest)(nil), // 37: api.GetDishesRequest + (*GetDishesReply)(nil), // 38: api.GetDishesReply + (*GetResponsiblePersonRequest)(nil), // 39: api.GetResponsiblePersonRequest + (*GetResponsiblePersonReply)(nil), // 40: api.GetResponsiblePersonReply + (*ResponsiblePerson)(nil), // 41: api.ResponsiblePerson + (*RoomInformationElement)(nil), // 42: api.RoomInformationElement + (*GetMoreInformationRequest)(nil), // 43: api.GetMoreInformationRequest + (*GetMoreInformationReply)(nil), // 44: api.GetMoreInformationReply + (*GetOpeningTimesRequest)(nil), // 45: api.GetOpeningTimesRequest + (*GetOpeningTimesReply)(nil), // 46: api.GetOpeningTimesReply + (*OpeningTimesMsgElement)(nil), // 47: api.OpeningTimesMsgElement + (*GetUpdateNoteRequest)(nil), // 48: api.GetUpdateNoteRequest + (*GetUpdateNoteReply)(nil), // 49: api.GetUpdateNoteReply + (*GetStudyRoomListRequest)(nil), // 50: api.GetStudyRoomListRequest + (*GetStudyRoomListReply)(nil), // 51: api.GetStudyRoomListReply + (*StudyRoomMsgElement)(nil), // 52: api.StudyRoomMsgElement + (*StudyRoom)(nil), // 53: api.StudyRoom + (*GetKinoRequest)(nil), // 54: api.GetKinoRequest + (*GetKinoReply)(nil), // 55: api.GetKinoReply + (*KinoMsgElement)(nil), // 56: api.KinoMsgElement + (*SendFeedbackReply)(nil), // 57: api.SendFeedbackReply + (*SendFeedbackRequest)(nil), // 58: api.SendFeedbackRequest + (*SendFeedbackImageReply)(nil), // 59: api.SendFeedbackImageReply + (*SendFeedbackImageRequest)(nil), // 60: api.SendFeedbackImageRequest + (*GetMembersRequest)(nil), // 61: api.GetMembersRequest + (*GetMembersReply)(nil), // 62: api.GetMembersReply + (*GetUploadStatusRequest)(nil), // 63: api.GetUploadStatusRequest + (*GetUploadStatusReply)(nil), // 64: api.GetUploadStatusReply + (*GetNotificationRequest)(nil), // 65: api.GetNotificationRequest + (*GetNotificationReply)(nil), // 66: api.GetNotificationReply + (*GetNotificationConfirmRequest)(nil), // 67: api.GetNotificationConfirmRequest + (*GetNotificationConfirmReply)(nil), // 68: api.GetNotificationConfirmReply + (*GetCanteenHeadCountRequest)(nil), // 69: api.GetCanteenHeadCountRequest + (*GetCanteenHeadCountReply)(nil), // 70: api.GetCanteenHeadCountReply + (*GetMoreInformationReply_MoreInformation)(nil), // 71: api.GetMoreInformationReply.MoreInformation + (*timestamppb.Timestamp)(nil), // 72: google.protobuf.Timestamp } var file_tumdev_campus_backend_proto_depIdxs = []int32{ - 0, // 0: api.RegisterDeviceRequest.deviceType:type_name -> api.DeviceType - 0, // 1: api.RemoveDeviceRequest.deviceType:type_name -> api.DeviceType - 74, // 2: api.GetRoomScheduleRequest.start:type_name -> google.protobuf.Timestamp - 74, // 3: api.GetRoomScheduleRequest.end:type_name -> google.protobuf.Timestamp - 71, // 4: api.GetRoomScheduleReply.events:type_name -> api.GetRoomScheduleReply.RoomScheduleEvent - 72, // 5: api.GetRoomMapsReply.maps:type_name -> api.GetRoomMapsReply.Map - 73, // 6: api.GetLocationsReply.locations:type_name -> api.GetLocationsReply.Location - 17, // 7: api.SearchRoomsReply.rooms:type_name -> api.Room - 19, // 8: api.NewsSourceReply.sources:type_name -> api.NewsSource - 74, // 9: api.GetTopNewsReply.created:type_name -> google.protobuf.Timestamp - 74, // 10: api.GetTopNewsReply.from:type_name -> google.protobuf.Timestamp - 74, // 11: api.GetTopNewsReply.to:type_name -> google.protobuf.Timestamp - 74, // 12: api.CafeteriaRatingRequest.from:type_name -> google.protobuf.Timestamp - 74, // 13: api.CafeteriaRatingRequest.to:type_name -> google.protobuf.Timestamp - 74, // 14: api.DishRatingRequest.from:type_name -> google.protobuf.Timestamp - 74, // 15: api.DishRatingRequest.to:type_name -> google.protobuf.Timestamp - 25, // 16: api.CafeteriaRatingReply.rating:type_name -> api.SingleRatingReply - 32, // 17: api.CafeteriaRatingReply.ratingTags:type_name -> api.RatingTagResult - 25, // 18: api.DishRatingReply.rating:type_name -> api.SingleRatingReply - 32, // 19: api.DishRatingReply.ratingTags:type_name -> api.RatingTagResult - 32, // 20: api.DishRatingReply.nameTags:type_name -> api.RatingTagResult - 31, // 21: api.SingleRatingReply.ratingTags:type_name -> api.RatingTagNewRequest - 74, // 22: api.SingleRatingReply.visited:type_name -> google.protobuf.Timestamp - 30, // 23: api.NewCafeteriaRatingRequest.ratingTags:type_name -> api.RatingTag - 30, // 24: api.NewDishRatingRequest.ratingTags:type_name -> api.RatingTag - 29, // 25: api.GetTagsReply.ratingTags:type_name -> api.TagsOverview - 34, // 26: api.GetCafeteriaReply.cafeteria:type_name -> api.Cafeteria - 38, // 27: api.GetResponsiblePersonReply.responsiblePerson:type_name -> api.ResponsiblePersonElement - 40, // 28: api.GetBuilding2GpsReply.building2Gps:type_name -> api.Building2GpsElement - 44, // 29: api.GetAreaFacilitiesByBuildingNrReply.areaFacilitiesByBuildingNr:type_name -> api.RoomInformationElement - 44, // 30: api.GetListOfToiletsReply.listOfToilets:type_name -> api.RoomInformationElement - 44, // 31: api.GetListOfElevatorsReply.listOfElevators:type_name -> api.RoomInformationElement - 47, // 32: api.GetMoreInformationReply.information:type_name -> api.MoreInformationElement - 50, // 33: api.GetOpeningTimesReply.facilities:type_name -> api.OpeningTimesMsgElement - 54, // 34: api.GetStudyRoomListReply.rooms:type_name -> api.StudyRoomMsgElement - 55, // 35: api.StudyRoomMsgElement.rooms:type_name -> api.StudyRoom - 58, // 36: api.GetKinoReply.kinos:type_name -> api.KinoMsgElement - 74, // 37: api.KinoMsgElement.date:type_name -> google.protobuf.Timestamp - 74, // 38: api.KinoMsgElement.created:type_name -> google.protobuf.Timestamp - 74, // 39: api.GetCanteenHeadCountReply.timestamp:type_name -> google.protobuf.Timestamp - 74, // 40: api.GetRoomScheduleReply.RoomScheduleEvent.start:type_name -> google.protobuf.Timestamp - 74, // 41: api.GetRoomScheduleReply.RoomScheduleEvent.end:type_name -> google.protobuf.Timestamp - 75, // 42: api.Campus.GetTopNews:input_type -> google.protobuf.Empty - 75, // 43: api.Campus.GetNewsSources:input_type -> google.protobuf.Empty - 15, // 44: api.Campus.SearchRooms:input_type -> api.SearchRoomsRequest - 13, // 45: api.Campus.GetLocations:input_type -> api.GetLocationsRequest - 11, // 46: api.Campus.GetRoomMaps:input_type -> api.GetRoomMapsRequest - 9, // 47: api.Campus.GetRoomCoordinates:input_type -> api.GetRoomCoordinatesRequest - 7, // 48: api.Campus.GetRoomSchedule:input_type -> api.GetRoomScheduleRequest - 21, // 49: api.Campus.GetCafeteriaRatings:input_type -> api.CafeteriaRatingRequest - 22, // 50: api.Campus.GetDishRatings:input_type -> api.DishRatingRequest - 26, // 51: api.Campus.NewCafeteriaRating:input_type -> api.NewCafeteriaRatingRequest - 27, // 52: api.Campus.NewDishRating:input_type -> api.NewDishRatingRequest - 75, // 53: api.Campus.GetAvailableDishTags:input_type -> google.protobuf.Empty - 75, // 54: api.Campus.GetNameTags:input_type -> google.protobuf.Empty - 75, // 55: api.Campus.GetAvailableCafeteriaTags:input_type -> google.protobuf.Empty - 75, // 56: api.Campus.GetCafeterias:input_type -> google.protobuf.Empty - 35, // 57: api.Campus.GetDishes:input_type -> api.GetDishesRequest - 75, // 58: api.Campus.GetResponsiblePerson:input_type -> google.protobuf.Empty - 75, // 59: api.Campus.GetBuilding2Gps:input_type -> google.protobuf.Empty - 42, // 60: api.Campus.GetAreaFacilitiesByBuildingNr:input_type -> api.GetAreaFacilitiesByBuildingNrRequest - 75, // 61: api.Campus.GetListOfToilets:input_type -> google.protobuf.Empty - 75, // 62: api.Campus.GetListOfElevators:input_type -> google.protobuf.Empty - 75, // 63: api.Campus.GetMoreInformation:input_type -> google.protobuf.Empty - 48, // 64: api.Campus.GetOpeningTimes:input_type -> api.GetOpeningTimesRequest - 51, // 65: api.Campus.GetUpdateNote:input_type -> api.GetUpdateNoteRequest - 75, // 66: api.Campus.GetStudyRoomList:input_type -> google.protobuf.Empty - 56, // 67: api.Campus.GetKino:input_type -> api.GetKinoRequest - 59, // 68: api.Campus.SendFeedback:input_type -> api.SendFeedbackRequest - 61, // 69: api.Campus.SendFeedbackImage:input_type -> api.SendFeedbackImageRequest - 64, // 70: api.Campus.GetUploadStatus:input_type -> api.GetUploadStatusRequest - 67, // 71: api.Campus.GetNotification:input_type -> api.NotificationsRequest - 67, // 72: api.Campus.GetNotificationConfirm:input_type -> api.NotificationsRequest - 62, // 73: api.Campus.GetMembers:input_type -> api.GetMembersRequest - 69, // 74: api.Campus.GetCanteenHeadCount:input_type -> api.GetCanteenHeadCountRequest - 5, // 75: api.Campus.IOSDeviceRequestResponse:input_type -> api.IOSDeviceRequestResponseRequest - 1, // 76: api.Campus.RegisterDevice:input_type -> api.RegisterDeviceRequest - 3, // 77: api.Campus.RemoveDevice:input_type -> api.RemoveDeviceRequest - 20, // 78: api.Campus.GetTopNews:output_type -> api.GetTopNewsReply - 18, // 79: api.Campus.GetNewsSources:output_type -> api.NewsSourceReply - 16, // 80: api.Campus.SearchRooms:output_type -> api.SearchRoomsReply - 14, // 81: api.Campus.GetLocations:output_type -> api.GetLocationsReply - 12, // 82: api.Campus.GetRoomMaps:output_type -> api.GetRoomMapsReply - 10, // 83: api.Campus.GetRoomCoordinates:output_type -> api.GetRoomCoordinatesReply - 8, // 84: api.Campus.GetRoomSchedule:output_type -> api.GetRoomScheduleReply - 23, // 85: api.Campus.GetCafeteriaRatings:output_type -> api.CafeteriaRatingReply - 24, // 86: api.Campus.GetDishRatings:output_type -> api.DishRatingReply - 75, // 87: api.Campus.NewCafeteriaRating:output_type -> google.protobuf.Empty - 75, // 88: api.Campus.NewDishRating:output_type -> google.protobuf.Empty - 28, // 89: api.Campus.GetAvailableDishTags:output_type -> api.GetTagsReply - 28, // 90: api.Campus.GetNameTags:output_type -> api.GetTagsReply - 28, // 91: api.Campus.GetAvailableCafeteriaTags:output_type -> api.GetTagsReply - 33, // 92: api.Campus.GetCafeterias:output_type -> api.GetCafeteriaReply - 36, // 93: api.Campus.GetDishes:output_type -> api.GetDishesReply - 37, // 94: api.Campus.GetResponsiblePerson:output_type -> api.GetResponsiblePersonReply - 39, // 95: api.Campus.GetBuilding2Gps:output_type -> api.GetBuilding2GpsReply - 41, // 96: api.Campus.GetAreaFacilitiesByBuildingNr:output_type -> api.GetAreaFacilitiesByBuildingNrReply - 43, // 97: api.Campus.GetListOfToilets:output_type -> api.GetListOfToiletsReply - 45, // 98: api.Campus.GetListOfElevators:output_type -> api.GetListOfElevatorsReply - 46, // 99: api.Campus.GetMoreInformation:output_type -> api.GetMoreInformationReply - 49, // 100: api.Campus.GetOpeningTimes:output_type -> api.GetOpeningTimesReply - 52, // 101: api.Campus.GetUpdateNote:output_type -> api.GetUpdateNoteReply - 53, // 102: api.Campus.GetStudyRoomList:output_type -> api.GetStudyRoomListReply - 57, // 103: api.Campus.GetKino:output_type -> api.GetKinoReply - 60, // 104: api.Campus.SendFeedback:output_type -> api.SendFeedbackImageReply - 60, // 105: api.Campus.SendFeedbackImage:output_type -> api.SendFeedbackImageReply - 65, // 106: api.Campus.GetUploadStatus:output_type -> api.GetUploadStatusReply - 66, // 107: api.Campus.GetNotification:output_type -> api.GetNotificationsReply - 68, // 108: api.Campus.GetNotificationConfirm:output_type -> api.GetNotificationsConfirmReply - 63, // 109: api.Campus.GetMembers:output_type -> api.GetMembersReply - 70, // 110: api.Campus.GetCanteenHeadCount:output_type -> api.GetCanteenHeadCountReply - 6, // 111: api.Campus.IOSDeviceRequestResponse:output_type -> api.IOSDeviceRequestResponseReply - 2, // 112: api.Campus.RegisterDevice:output_type -> api.RegisterDeviceReply - 4, // 113: api.Campus.RemoveDevice:output_type -> api.RemoveDeviceReply - 78, // [78:114] is the sub-list for method output_type - 42, // [42:78] is the sub-list for method input_type - 42, // [42:42] is the sub-list for extension type_name - 42, // [42:42] is the sub-list for extension extendee - 0, // [0:42] is the sub-list for field type_name + 0, // 0: api.RegisterDeviceRequest.device_type:type_name -> api.DeviceType + 0, // 1: api.RemoveDeviceRequest.device_type:type_name -> api.DeviceType + 72, // 2: api.NewsItem.created:type_name -> google.protobuf.Timestamp + 7, // 3: api.GetNewsReply.news:type_name -> api.NewsItem + 12, // 4: api.GetNewsSourcesReply.sources:type_name -> api.NewsSource + 72, // 5: api.GetTopNewsReply.created:type_name -> google.protobuf.Timestamp + 72, // 6: api.GetTopNewsReply.from:type_name -> google.protobuf.Timestamp + 72, // 7: api.GetTopNewsReply.to:type_name -> google.protobuf.Timestamp + 72, // 8: api.GetCanteenRatingsRequest.from:type_name -> google.protobuf.Timestamp + 72, // 9: api.GetCanteenRatingsRequest.to:type_name -> google.protobuf.Timestamp + 19, // 10: api.GetCanteenRatingsReply.rating:type_name -> api.SingleRatingReply + 33, // 11: api.GetCanteenRatingsReply.rating_tags:type_name -> api.RatingTagResult + 72, // 12: api.GetDishRatingsRequest.from:type_name -> google.protobuf.Timestamp + 72, // 13: api.GetDishRatingsRequest.to:type_name -> google.protobuf.Timestamp + 19, // 14: api.GetDishRatingsReply.rating:type_name -> api.SingleRatingReply + 33, // 15: api.GetDishRatingsReply.rating_tags:type_name -> api.RatingTagResult + 33, // 16: api.GetDishRatingsReply.name_tags:type_name -> api.RatingTagResult + 32, // 17: api.SingleRatingReply.rating_tags:type_name -> api.RatingTagNewRequest + 72, // 18: api.SingleRatingReply.visited:type_name -> google.protobuf.Timestamp + 31, // 19: api.NewCanteenRatingRequest.rating_tags:type_name -> api.RatingTag + 31, // 20: api.NewDishRatingRequest.rating_tags:type_name -> api.RatingTag + 30, // 21: api.GetAvailableDishTagsReply.rating_tags:type_name -> api.TagsOverview + 30, // 22: api.GetNameTagsReply.rating_tags:type_name -> api.TagsOverview + 30, // 23: api.GetAvailableCanteenTagsReply.rating_tags:type_name -> api.TagsOverview + 36, // 24: api.GetCanteensReply.canteen:type_name -> api.Canteen + 41, // 25: api.GetResponsiblePersonReply.responsible_person:type_name -> api.ResponsiblePerson + 71, // 26: api.GetMoreInformationReply.infos:type_name -> api.GetMoreInformationReply.MoreInformation + 47, // 27: api.GetOpeningTimesReply.facilities:type_name -> api.OpeningTimesMsgElement + 52, // 28: api.GetStudyRoomListReply.rooms:type_name -> api.StudyRoomMsgElement + 53, // 29: api.StudyRoomMsgElement.rooms:type_name -> api.StudyRoom + 56, // 30: api.GetKinoReply.kinos:type_name -> api.KinoMsgElement + 72, // 31: api.KinoMsgElement.date:type_name -> google.protobuf.Timestamp + 72, // 32: api.KinoMsgElement.created:type_name -> google.protobuf.Timestamp + 72, // 33: api.GetCanteenHeadCountReply.timestamp:type_name -> google.protobuf.Timestamp + 13, // 34: api.Campus.GetTopNews:input_type -> api.GetTopNewsRequest + 10, // 35: api.Campus.GetNewsSources:input_type -> api.GetNewsSourcesRequest + 9, // 36: api.Campus.GetNews:input_type -> api.GetNewsRequest + 15, // 37: api.Campus.GetCanteenRatings:input_type -> api.GetCanteenRatingsRequest + 17, // 38: api.Campus.GetDishRatings:input_type -> api.GetDishRatingsRequest + 21, // 39: api.Campus.NewCanteenRating:input_type -> api.NewCanteenRatingRequest + 23, // 40: api.Campus.NewDishRating:input_type -> api.NewDishRatingRequest + 24, // 41: api.Campus.GetAvailableDishTags:input_type -> api.GetAvailableDishTagsRequest + 26, // 42: api.Campus.GetNameTags:input_type -> api.GetNameTagsRequest + 28, // 43: api.Campus.GetAvailableCanteenTags:input_type -> api.GetAvailableCanteenTagsRequest + 34, // 44: api.Campus.GetCanteens:input_type -> api.GetCanteensRequest + 37, // 45: api.Campus.GetDishes:input_type -> api.GetDishesRequest + 39, // 46: api.Campus.GetResponsiblePerson:input_type -> api.GetResponsiblePersonRequest + 43, // 47: api.Campus.GetMoreInformation:input_type -> api.GetMoreInformationRequest + 45, // 48: api.Campus.GetOpeningTimes:input_type -> api.GetOpeningTimesRequest + 48, // 49: api.Campus.GetUpdateNote:input_type -> api.GetUpdateNoteRequest + 50, // 50: api.Campus.GetStudyRoomList:input_type -> api.GetStudyRoomListRequest + 54, // 51: api.Campus.GetKino:input_type -> api.GetKinoRequest + 58, // 52: api.Campus.SendFeedback:input_type -> api.SendFeedbackRequest + 60, // 53: api.Campus.SendFeedbackImage:input_type -> api.SendFeedbackImageRequest + 63, // 54: api.Campus.GetUploadStatus:input_type -> api.GetUploadStatusRequest + 65, // 55: api.Campus.GetNotification:input_type -> api.GetNotificationRequest + 67, // 56: api.Campus.GetNotificationConfirm:input_type -> api.GetNotificationConfirmRequest + 61, // 57: api.Campus.GetMembers:input_type -> api.GetMembersRequest + 69, // 58: api.Campus.GetCanteenHeadCount:input_type -> api.GetCanteenHeadCountRequest + 5, // 59: api.Campus.IOSDeviceRequestResponse:input_type -> api.IOSDeviceRequestResponseRequest + 1, // 60: api.Campus.RegisterDevice:input_type -> api.RegisterDeviceRequest + 3, // 61: api.Campus.RemoveDevice:input_type -> api.RemoveDeviceRequest + 14, // 62: api.Campus.GetTopNews:output_type -> api.GetTopNewsReply + 11, // 63: api.Campus.GetNewsSources:output_type -> api.GetNewsSourcesReply + 8, // 64: api.Campus.GetNews:output_type -> api.GetNewsReply + 16, // 65: api.Campus.GetCanteenRatings:output_type -> api.GetCanteenRatingsReply + 18, // 66: api.Campus.GetDishRatings:output_type -> api.GetDishRatingsReply + 20, // 67: api.Campus.NewCanteenRating:output_type -> api.NewCanteenRatingReply + 22, // 68: api.Campus.NewDishRating:output_type -> api.NewDishRatingReply + 25, // 69: api.Campus.GetAvailableDishTags:output_type -> api.GetAvailableDishTagsReply + 27, // 70: api.Campus.GetNameTags:output_type -> api.GetNameTagsReply + 29, // 71: api.Campus.GetAvailableCanteenTags:output_type -> api.GetAvailableCanteenTagsReply + 35, // 72: api.Campus.GetCanteens:output_type -> api.GetCanteensReply + 38, // 73: api.Campus.GetDishes:output_type -> api.GetDishesReply + 40, // 74: api.Campus.GetResponsiblePerson:output_type -> api.GetResponsiblePersonReply + 44, // 75: api.Campus.GetMoreInformation:output_type -> api.GetMoreInformationReply + 46, // 76: api.Campus.GetOpeningTimes:output_type -> api.GetOpeningTimesReply + 49, // 77: api.Campus.GetUpdateNote:output_type -> api.GetUpdateNoteReply + 51, // 78: api.Campus.GetStudyRoomList:output_type -> api.GetStudyRoomListReply + 55, // 79: api.Campus.GetKino:output_type -> api.GetKinoReply + 57, // 80: api.Campus.SendFeedback:output_type -> api.SendFeedbackReply + 59, // 81: api.Campus.SendFeedbackImage:output_type -> api.SendFeedbackImageReply + 64, // 82: api.Campus.GetUploadStatus:output_type -> api.GetUploadStatusReply + 66, // 83: api.Campus.GetNotification:output_type -> api.GetNotificationReply + 68, // 84: api.Campus.GetNotificationConfirm:output_type -> api.GetNotificationConfirmReply + 62, // 85: api.Campus.GetMembers:output_type -> api.GetMembersReply + 70, // 86: api.Campus.GetCanteenHeadCount:output_type -> api.GetCanteenHeadCountReply + 6, // 87: api.Campus.IOSDeviceRequestResponse:output_type -> api.IOSDeviceRequestResponseReply + 2, // 88: api.Campus.RegisterDevice:output_type -> api.RegisterDeviceReply + 4, // 89: api.Campus.RemoveDevice:output_type -> api.RemoveDeviceReply + 62, // [62:90] is the sub-list for method output_type + 34, // [34:62] is the sub-list for method input_type + 34, // [34:34] is the sub-list for extension type_name + 34, // [34:34] is the sub-list for extension extendee + 0, // [0:34] is the sub-list for field type_name } func init() { file_tumdev_campus_backend_proto_init() } @@ -5809,7 +5316,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRoomScheduleRequest); i { + switch v := v.(*NewsItem); i { case 0: return &v.state case 1: @@ -5821,7 +5328,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRoomScheduleReply); i { + switch v := v.(*GetNewsReply); i { case 0: return &v.state case 1: @@ -5833,7 +5340,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRoomCoordinatesRequest); i { + switch v := v.(*GetNewsRequest); i { case 0: return &v.state case 1: @@ -5845,7 +5352,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRoomCoordinatesReply); i { + switch v := v.(*GetNewsSourcesRequest); i { case 0: return &v.state case 1: @@ -5857,7 +5364,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRoomMapsRequest); i { + switch v := v.(*GetNewsSourcesReply); i { case 0: return &v.state case 1: @@ -5869,7 +5376,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRoomMapsReply); i { + switch v := v.(*NewsSource); i { case 0: return &v.state case 1: @@ -5881,7 +5388,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLocationsRequest); i { + switch v := v.(*GetTopNewsRequest); i { case 0: return &v.state case 1: @@ -5893,7 +5400,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLocationsReply); i { + switch v := v.(*GetTopNewsReply); i { case 0: return &v.state case 1: @@ -5905,7 +5412,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchRoomsRequest); i { + switch v := v.(*GetCanteenRatingsRequest); i { case 0: return &v.state case 1: @@ -5917,7 +5424,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchRoomsReply); i { + switch v := v.(*GetCanteenRatingsReply); i { case 0: return &v.state case 1: @@ -5929,7 +5436,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Room); i { + switch v := v.(*GetDishRatingsRequest); i { case 0: return &v.state case 1: @@ -5941,7 +5448,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewsSourceReply); i { + switch v := v.(*GetDishRatingsReply); i { case 0: return &v.state case 1: @@ -5953,7 +5460,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewsSource); i { + switch v := v.(*SingleRatingReply); i { case 0: return &v.state case 1: @@ -5965,7 +5472,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTopNewsReply); i { + switch v := v.(*NewCanteenRatingReply); i { case 0: return &v.state case 1: @@ -5977,7 +5484,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CafeteriaRatingRequest); i { + switch v := v.(*NewCanteenRatingRequest); i { case 0: return &v.state case 1: @@ -5989,7 +5496,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DishRatingRequest); i { + switch v := v.(*NewDishRatingReply); i { case 0: return &v.state case 1: @@ -6001,7 +5508,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CafeteriaRatingReply); i { + switch v := v.(*NewDishRatingRequest); i { case 0: return &v.state case 1: @@ -6013,7 +5520,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DishRatingReply); i { + switch v := v.(*GetAvailableDishTagsRequest); i { case 0: return &v.state case 1: @@ -6025,7 +5532,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SingleRatingReply); i { + switch v := v.(*GetAvailableDishTagsReply); i { case 0: return &v.state case 1: @@ -6037,7 +5544,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewCafeteriaRatingRequest); i { + switch v := v.(*GetNameTagsRequest); i { case 0: return &v.state case 1: @@ -6049,7 +5556,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewDishRatingRequest); i { + switch v := v.(*GetNameTagsReply); i { case 0: return &v.state case 1: @@ -6061,7 +5568,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTagsReply); i { + switch v := v.(*GetAvailableCanteenTagsRequest); i { case 0: return &v.state case 1: @@ -6073,7 +5580,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TagsOverview); i { + switch v := v.(*GetAvailableCanteenTagsReply); i { case 0: return &v.state case 1: @@ -6085,7 +5592,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RatingTag); i { + switch v := v.(*TagsOverview); i { case 0: return &v.state case 1: @@ -6097,7 +5604,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RatingTagNewRequest); i { + switch v := v.(*RatingTag); i { case 0: return &v.state case 1: @@ -6109,7 +5616,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RatingTagResult); i { + switch v := v.(*RatingTagNewRequest); i { case 0: return &v.state case 1: @@ -6121,7 +5628,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCafeteriaReply); i { + switch v := v.(*RatingTagResult); i { case 0: return &v.state case 1: @@ -6133,7 +5640,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Cafeteria); i { + switch v := v.(*GetCanteensRequest); i { case 0: return &v.state case 1: @@ -6145,7 +5652,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetDishesRequest); i { + switch v := v.(*GetCanteensReply); i { case 0: return &v.state case 1: @@ -6157,7 +5664,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetDishesReply); i { + switch v := v.(*Canteen); i { case 0: return &v.state case 1: @@ -6169,7 +5676,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetResponsiblePersonReply); i { + switch v := v.(*GetDishesRequest); i { case 0: return &v.state case 1: @@ -6181,7 +5688,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResponsiblePersonElement); i { + switch v := v.(*GetDishesReply); i { case 0: return &v.state case 1: @@ -6193,7 +5700,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBuilding2GpsReply); i { + switch v := v.(*GetResponsiblePersonRequest); i { case 0: return &v.state case 1: @@ -6205,7 +5712,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Building2GpsElement); i { + switch v := v.(*GetResponsiblePersonReply); i { case 0: return &v.state case 1: @@ -6217,7 +5724,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAreaFacilitiesByBuildingNrReply); i { + switch v := v.(*ResponsiblePerson); i { case 0: return &v.state case 1: @@ -6229,7 +5736,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetAreaFacilitiesByBuildingNrRequest); i { + switch v := v.(*RoomInformationElement); i { case 0: return &v.state case 1: @@ -6241,7 +5748,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetListOfToiletsReply); i { + switch v := v.(*GetMoreInformationRequest); i { case 0: return &v.state case 1: @@ -6253,7 +5760,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoomInformationElement); i { + switch v := v.(*GetMoreInformationReply); i { case 0: return &v.state case 1: @@ -6265,7 +5772,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetListOfElevatorsReply); i { + switch v := v.(*GetOpeningTimesRequest); i { case 0: return &v.state case 1: @@ -6277,7 +5784,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMoreInformationReply); i { + switch v := v.(*GetOpeningTimesReply); i { case 0: return &v.state case 1: @@ -6289,7 +5796,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MoreInformationElement); i { + switch v := v.(*OpeningTimesMsgElement); i { case 0: return &v.state case 1: @@ -6301,7 +5808,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOpeningTimesRequest); i { + switch v := v.(*GetUpdateNoteRequest); i { case 0: return &v.state case 1: @@ -6313,7 +5820,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOpeningTimesReply); i { + switch v := v.(*GetUpdateNoteReply); i { case 0: return &v.state case 1: @@ -6325,7 +5832,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpeningTimesMsgElement); i { + switch v := v.(*GetStudyRoomListRequest); i { case 0: return &v.state case 1: @@ -6337,7 +5844,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUpdateNoteRequest); i { + switch v := v.(*GetStudyRoomListReply); i { case 0: return &v.state case 1: @@ -6349,7 +5856,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUpdateNoteReply); i { + switch v := v.(*StudyRoomMsgElement); i { case 0: return &v.state case 1: @@ -6361,7 +5868,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStudyRoomListReply); i { + switch v := v.(*StudyRoom); i { case 0: return &v.state case 1: @@ -6373,7 +5880,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StudyRoomMsgElement); i { + switch v := v.(*GetKinoRequest); i { case 0: return &v.state case 1: @@ -6385,7 +5892,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StudyRoom); i { + switch v := v.(*GetKinoReply); i { case 0: return &v.state case 1: @@ -6397,7 +5904,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetKinoRequest); i { + switch v := v.(*KinoMsgElement); i { case 0: return &v.state case 1: @@ -6409,7 +5916,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetKinoReply); i { + switch v := v.(*SendFeedbackReply); i { case 0: return &v.state case 1: @@ -6421,7 +5928,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KinoMsgElement); i { + switch v := v.(*SendFeedbackRequest); i { case 0: return &v.state case 1: @@ -6433,7 +5940,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendFeedbackRequest); i { + switch v := v.(*SendFeedbackImageReply); i { case 0: return &v.state case 1: @@ -6445,7 +5952,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendFeedbackImageReply); i { + switch v := v.(*SendFeedbackImageRequest); i { case 0: return &v.state case 1: @@ -6457,7 +5964,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendFeedbackImageRequest); i { + switch v := v.(*GetMembersRequest); i { case 0: return &v.state case 1: @@ -6469,7 +5976,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMembersRequest); i { + switch v := v.(*GetMembersReply); i { case 0: return &v.state case 1: @@ -6481,7 +5988,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMembersReply); i { + switch v := v.(*GetUploadStatusRequest); i { case 0: return &v.state case 1: @@ -6493,7 +6000,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUploadStatusRequest); i { + switch v := v.(*GetUploadStatusReply); i { case 0: return &v.state case 1: @@ -6505,7 +6012,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUploadStatusReply); i { + switch v := v.(*GetNotificationRequest); i { case 0: return &v.state case 1: @@ -6517,7 +6024,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNotificationsReply); i { + switch v := v.(*GetNotificationReply); i { case 0: return &v.state case 1: @@ -6529,7 +6036,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NotificationsRequest); i { + switch v := v.(*GetNotificationConfirmRequest); i { case 0: return &v.state case 1: @@ -6541,7 +6048,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNotificationsConfirmReply); i { + switch v := v.(*GetNotificationConfirmReply); i { case 0: return &v.state case 1: @@ -6577,31 +6084,7 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRoomScheduleReply_RoomScheduleEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_tumdev_campus_backend_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRoomMapsReply_Map); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_tumdev_campus_backend_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLocationsReply_Location); i { + switch v := v.(*GetMoreInformationReply_MoreInformation); i { case 0: return &v.state case 1: @@ -6620,7 +6103,7 @@ func file_tumdev_campus_backend_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_tumdev_campus_backend_proto_rawDesc, NumEnums: 1, - NumMessages: 73, + NumMessages: 71, NumExtensions: 0, NumServices: 1, }, diff --git a/server/api/tumdev/campus_backend.pb.gw.go b/server/api/tumdev/campus_backend.pb.gw.go index eeb38ca8..0439e41e 100644 --- a/server/api/tumdev/campus_backend.pb.gw.go +++ b/server/api/tumdev/campus_backend.pb.gw.go @@ -21,7 +21,6 @@ import ( "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/emptypb" ) // Suppress "imported and not used" errors @@ -33,7 +32,7 @@ var _ = utilities.NewDoubleArray var _ = metadata.Join func request_Campus_GetTopNews_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetTopNewsRequest var metadata runtime.ServerMetadata msg, err := client.GetTopNews(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -42,7 +41,7 @@ func request_Campus_GetTopNews_0(ctx context.Context, marshaler runtime.Marshale } func local_request_Campus_GetTopNews_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetTopNewsRequest var metadata runtime.ServerMetadata msg, err := server.GetTopNews(ctx, &protoReq) @@ -51,7 +50,7 @@ func local_request_Campus_GetTopNews_0(ctx context.Context, marshaler runtime.Ma } func request_Campus_GetNewsSources_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetNewsSourcesRequest var metadata runtime.ServerMetadata msg, err := client.GetNewsSources(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -60,7 +59,7 @@ func request_Campus_GetNewsSources_0(ctx context.Context, marshaler runtime.Mars } func local_request_Campus_GetNewsSources_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetNewsSourcesRequest var metadata runtime.ServerMetadata msg, err := server.GetNewsSources(ctx, &protoReq) @@ -68,8 +67,78 @@ func local_request_Campus_GetNewsSources_0(ctx context.Context, marshaler runtim } -func request_Campus_GetCafeteriaRatings_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CafeteriaRatingRequest +var ( + filter_Campus_GetNews_0 = &utilities.DoubleArray{Encoding: map[string]int{"last_news_id": 0, "lastNewsId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} +) + +func request_Campus_GetNews_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetNewsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["last_news_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "last_news_id") + } + + protoReq.LastNewsId, err = runtime.Int32(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "last_news_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Campus_GetNews_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetNews(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Campus_GetNews_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetNewsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["last_news_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "last_news_id") + } + + protoReq.LastNewsId, err = runtime.Int32(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "last_news_id", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Campus_GetNews_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetNews(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Campus_GetCanteenRatings_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCanteenRatingsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -80,13 +149,13 @@ func request_Campus_GetCafeteriaRatings_0(ctx context.Context, marshaler runtime return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.GetCafeteriaRatings(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.GetCanteenRatings(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Campus_GetCafeteriaRatings_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq CafeteriaRatingRequest +func local_request_Campus_GetCanteenRatings_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCanteenRatingsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -97,13 +166,13 @@ func local_request_Campus_GetCafeteriaRatings_0(ctx context.Context, marshaler r return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.GetCafeteriaRatings(ctx, &protoReq) + msg, err := server.GetCanteenRatings(ctx, &protoReq) return msg, metadata, err } func request_Campus_GetDishRatings_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DishRatingRequest + var protoReq GetDishRatingsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -120,7 +189,7 @@ func request_Campus_GetDishRatings_0(ctx context.Context, marshaler runtime.Mars } func local_request_Campus_GetDishRatings_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq DishRatingRequest + var protoReq GetDishRatingsRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -136,8 +205,8 @@ func local_request_Campus_GetDishRatings_0(ctx context.Context, marshaler runtim } -func request_Campus_NewCafeteriaRating_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq NewCafeteriaRatingRequest +func request_Campus_NewCanteenRating_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq NewCanteenRatingRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -148,13 +217,13 @@ func request_Campus_NewCafeteriaRating_0(ctx context.Context, marshaler runtime. return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.NewCafeteriaRating(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.NewCanteenRating(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Campus_NewCafeteriaRating_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq NewCafeteriaRatingRequest +func local_request_Campus_NewCanteenRating_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq NewCanteenRatingRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -165,7 +234,7 @@ func local_request_Campus_NewCafeteriaRating_0(ctx context.Context, marshaler ru return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := server.NewCafeteriaRating(ctx, &protoReq) + msg, err := server.NewCanteenRating(ctx, &protoReq) return msg, metadata, err } @@ -205,7 +274,7 @@ func local_request_Campus_NewDishRating_0(ctx context.Context, marshaler runtime } func request_Campus_GetAvailableDishTags_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetAvailableDishTagsRequest var metadata runtime.ServerMetadata msg, err := client.GetAvailableDishTags(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -214,7 +283,7 @@ func request_Campus_GetAvailableDishTags_0(ctx context.Context, marshaler runtim } func local_request_Campus_GetAvailableDishTags_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetAvailableDishTagsRequest var metadata runtime.ServerMetadata msg, err := server.GetAvailableDishTags(ctx, &protoReq) @@ -223,7 +292,7 @@ func local_request_Campus_GetAvailableDishTags_0(ctx context.Context, marshaler } func request_Campus_GetNameTags_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetNameTagsRequest var metadata runtime.ServerMetadata msg, err := client.GetNameTags(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -232,7 +301,7 @@ func request_Campus_GetNameTags_0(ctx context.Context, marshaler runtime.Marshal } func local_request_Campus_GetNameTags_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetNameTagsRequest var metadata runtime.ServerMetadata msg, err := server.GetNameTags(ctx, &protoReq) @@ -240,38 +309,38 @@ func local_request_Campus_GetNameTags_0(ctx context.Context, marshaler runtime.M } -func request_Campus_GetAvailableCafeteriaTags_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty +func request_Campus_GetAvailableCanteenTags_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetAvailableCanteenTagsRequest var metadata runtime.ServerMetadata - msg, err := client.GetAvailableCafeteriaTags(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.GetAvailableCanteenTags(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Campus_GetAvailableCafeteriaTags_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty +func local_request_Campus_GetAvailableCanteenTags_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetAvailableCanteenTagsRequest var metadata runtime.ServerMetadata - msg, err := server.GetAvailableCafeteriaTags(ctx, &protoReq) + msg, err := server.GetAvailableCanteenTags(ctx, &protoReq) return msg, metadata, err } -func request_Campus_GetCafeterias_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty +func request_Campus_GetCanteens_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCanteensRequest var metadata runtime.ServerMetadata - msg, err := client.GetCafeterias(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.GetCanteens(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_Campus_GetCafeterias_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty +func local_request_Campus_GetCanteens_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetCanteensRequest var metadata runtime.ServerMetadata - msg, err := server.GetCafeterias(ctx, &protoReq) + msg, err := server.GetCanteens(ctx, &protoReq) return msg, metadata, err } @@ -313,7 +382,7 @@ func local_request_Campus_GetDishes_0(ctx context.Context, marshaler runtime.Mar } func request_Campus_GetResponsiblePerson_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetResponsiblePersonRequest var metadata runtime.ServerMetadata msg, err := client.GetResponsiblePerson(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -322,7 +391,7 @@ func request_Campus_GetResponsiblePerson_0(ctx context.Context, marshaler runtim } func local_request_Campus_GetResponsiblePerson_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetResponsiblePersonRequest var metadata runtime.ServerMetadata msg, err := server.GetResponsiblePerson(ctx, &protoReq) @@ -330,98 +399,8 @@ func local_request_Campus_GetResponsiblePerson_0(ctx context.Context, marshaler } -func request_Campus_GetBuilding2Gps_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - - msg, err := client.GetBuilding2Gps(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Campus_GetBuilding2Gps_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - - msg, err := server.GetBuilding2Gps(ctx, &protoReq) - return msg, metadata, err - -} - -var ( - filter_Campus_GetAreaFacilitiesByBuildingNr_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Campus_GetAreaFacilitiesByBuildingNr_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetAreaFacilitiesByBuildingNrRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Campus_GetAreaFacilitiesByBuildingNr_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.GetAreaFacilitiesByBuildingNr(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Campus_GetAreaFacilitiesByBuildingNr_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetAreaFacilitiesByBuildingNrRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Campus_GetAreaFacilitiesByBuildingNr_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.GetAreaFacilitiesByBuildingNr(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Campus_GetListOfToilets_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - - msg, err := client.GetListOfToilets(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Campus_GetListOfToilets_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - - msg, err := server.GetListOfToilets(ctx, &protoReq) - return msg, metadata, err - -} - -func request_Campus_GetListOfElevators_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - - msg, err := client.GetListOfElevators(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Campus_GetListOfElevators_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty - var metadata runtime.ServerMetadata - - msg, err := server.GetListOfElevators(ctx, &protoReq) - return msg, metadata, err - -} - func request_Campus_GetMoreInformation_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetMoreInformationRequest var metadata runtime.ServerMetadata msg, err := client.GetMoreInformation(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -430,7 +409,7 @@ func request_Campus_GetMoreInformation_0(ctx context.Context, marshaler runtime. } func local_request_Campus_GetMoreInformation_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetMoreInformationRequest var metadata runtime.ServerMetadata msg, err := server.GetMoreInformation(ctx, &protoReq) @@ -506,7 +485,7 @@ func request_Campus_GetUpdateNote_0(ctx context.Context, marshaler runtime.Marsh return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "version") } - protoReq.Version, err = runtime.Int32(val) + protoReq.Version, err = runtime.Int64(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "version", err) } @@ -532,7 +511,7 @@ func local_request_Campus_GetUpdateNote_0(ctx context.Context, marshaler runtime return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "version") } - protoReq.Version, err = runtime.Int32(val) + protoReq.Version, err = runtime.Int64(val) if err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "version", err) } @@ -543,7 +522,7 @@ func local_request_Campus_GetUpdateNote_0(ctx context.Context, marshaler runtime } func request_Campus_GetStudyRoomList_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetStudyRoomListRequest var metadata runtime.ServerMetadata msg, err := client.GetStudyRoomList(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -552,7 +531,7 @@ func request_Campus_GetStudyRoomList_0(ctx context.Context, marshaler runtime.Ma } func local_request_Campus_GetStudyRoomList_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq emptypb.Empty + var protoReq GetStudyRoomListRequest var metadata runtime.ServerMetadata msg, err := server.GetStudyRoomList(ctx, &protoReq) @@ -571,14 +550,14 @@ func request_Campus_GetKino_0(ctx context.Context, marshaler runtime.Marshaler, _ = err ) - val, ok = pathParams["lastId"] + val, ok = pathParams["last_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lastId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "last_id") } protoReq.LastId, err = runtime.Int32(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lastId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "last_id", err) } msg, err := client.GetKino(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -597,14 +576,14 @@ func local_request_Campus_GetKino_0(ctx context.Context, marshaler runtime.Marsh _ = err ) - val, ok = pathParams["lastId"] + val, ok = pathParams["last_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lastId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "last_id") } protoReq.LastId, err = runtime.Int32(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lastId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "last_id", err) } msg, err := server.GetKino(ctx, &protoReq) @@ -669,14 +648,14 @@ func request_Campus_SendFeedbackImage_0(ctx context.Context, marshaler runtime.M return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["imageNr"] + val, ok = pathParams["image_nr"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "imageNr") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "image_nr") } protoReq.ImageNr, err = runtime.Int32(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "imageNr", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "image_nr", err) } msg, err := client.SendFeedbackImage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -705,14 +684,14 @@ func local_request_Campus_SendFeedbackImage_0(ctx context.Context, marshaler run return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) } - val, ok = pathParams["imageNr"] + val, ok = pathParams["image_nr"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "imageNr") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "image_nr") } protoReq.ImageNr, err = runtime.Int32(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "imageNr", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "image_nr", err) } msg, err := server.SendFeedbackImage(ctx, &protoReq) @@ -731,14 +710,14 @@ func request_Campus_GetUploadStatus_0(ctx context.Context, marshaler runtime.Mar _ = err ) - val, ok = pathParams["lrzId"] + val, ok = pathParams["lrz_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lrzId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lrz_id") } protoReq.LrzId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lrzId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lrz_id", err) } msg, err := client.GetUploadStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -757,14 +736,14 @@ func local_request_Campus_GetUploadStatus_0(ctx context.Context, marshaler runti _ = err ) - val, ok = pathParams["lrzId"] + val, ok = pathParams["lrz_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lrzId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lrz_id") } protoReq.LrzId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lrzId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lrz_id", err) } msg, err := server.GetUploadStatus(ctx, &protoReq) @@ -773,7 +752,7 @@ func local_request_Campus_GetUploadStatus_0(ctx context.Context, marshaler runti } func request_Campus_GetNotification_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq NotificationsRequest + var protoReq GetNotificationRequest var metadata runtime.ServerMetadata var ( @@ -783,14 +762,14 @@ func request_Campus_GetNotification_0(ctx context.Context, marshaler runtime.Mar _ = err ) - val, ok = pathParams["notificationId"] + val, ok = pathParams["notification_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "notificationId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "notification_id") } protoReq.NotificationId, err = runtime.Int32(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "notificationId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "notification_id", err) } msg, err := client.GetNotification(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -799,7 +778,7 @@ func request_Campus_GetNotification_0(ctx context.Context, marshaler runtime.Mar } func local_request_Campus_GetNotification_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq NotificationsRequest + var protoReq GetNotificationRequest var metadata runtime.ServerMetadata var ( @@ -809,14 +788,14 @@ func local_request_Campus_GetNotification_0(ctx context.Context, marshaler runti _ = err ) - val, ok = pathParams["notificationId"] + val, ok = pathParams["notification_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "notificationId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "notification_id") } protoReq.NotificationId, err = runtime.Int32(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "notificationId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "notification_id", err) } msg, err := server.GetNotification(ctx, &protoReq) @@ -825,7 +804,7 @@ func local_request_Campus_GetNotification_0(ctx context.Context, marshaler runti } func request_Campus_GetNotificationConfirm_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq NotificationsRequest + var protoReq GetNotificationConfirmRequest var metadata runtime.ServerMetadata var ( @@ -835,14 +814,14 @@ func request_Campus_GetNotificationConfirm_0(ctx context.Context, marshaler runt _ = err ) - val, ok = pathParams["notificationId"] + val, ok = pathParams["notification_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "notificationId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "notification_id") } protoReq.NotificationId, err = runtime.Int32(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "notificationId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "notification_id", err) } msg, err := client.GetNotificationConfirm(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -851,7 +830,7 @@ func request_Campus_GetNotificationConfirm_0(ctx context.Context, marshaler runt } func local_request_Campus_GetNotificationConfirm_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq NotificationsRequest + var protoReq GetNotificationConfirmRequest var metadata runtime.ServerMetadata var ( @@ -861,14 +840,14 @@ func local_request_Campus_GetNotificationConfirm_0(ctx context.Context, marshale _ = err ) - val, ok = pathParams["notificationId"] + val, ok = pathParams["notification_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "notificationId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "notification_id") } protoReq.NotificationId, err = runtime.Int32(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "notificationId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "notification_id", err) } msg, err := server.GetNotificationConfirm(ctx, &protoReq) @@ -887,14 +866,14 @@ func request_Campus_GetMembers_0(ctx context.Context, marshaler runtime.Marshale _ = err ) - val, ok = pathParams["lrzId"] + val, ok = pathParams["lrz_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lrzId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lrz_id") } protoReq.LrzId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lrzId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lrz_id", err) } msg, err := client.GetMembers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -913,14 +892,14 @@ func local_request_Campus_GetMembers_0(ctx context.Context, marshaler runtime.Ma _ = err ) - val, ok = pathParams["lrzId"] + val, ok = pathParams["lrz_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lrzId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "lrz_id") } protoReq.LrzId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lrzId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "lrz_id", err) } msg, err := server.GetMembers(ctx, &protoReq) @@ -939,14 +918,14 @@ func request_Campus_GetCanteenHeadCount_0(ctx context.Context, marshaler runtime _ = err ) - val, ok = pathParams["canteenId"] + val, ok = pathParams["canteen_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "canteenId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "canteen_id") } protoReq.CanteenId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "canteenId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "canteen_id", err) } msg, err := client.GetCanteenHeadCount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) @@ -965,14 +944,14 @@ func local_request_Campus_GetCanteenHeadCount_0(ctx context.Context, marshaler r _ = err ) - val, ok = pathParams["canteenId"] + val, ok = pathParams["canteen_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "canteenId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "canteen_id") } protoReq.CanteenId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "canteenId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "canteen_id", err) } msg, err := server.GetCanteenHeadCount(ctx, &protoReq) @@ -1049,7 +1028,7 @@ func local_request_Campus_RegisterDevice_0(ctx context.Context, marshaler runtim } var ( - filter_Campus_RemoveDevice_0 = &utilities.DoubleArray{Encoding: map[string]int{"deviceId": 0}, Base: []int{1, 2, 0, 0}, Check: []int{0, 1, 2, 2}} + filter_Campus_RemoveDevice_0 = &utilities.DoubleArray{Encoding: map[string]int{"device_id": 0, "deviceId": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} ) func request_Campus_RemoveDevice_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { @@ -1063,14 +1042,14 @@ func request_Campus_RemoveDevice_0(ctx context.Context, marshaler runtime.Marsha _ = err ) - val, ok = pathParams["deviceId"] + val, ok = pathParams["device_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "deviceId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "device_id") } protoReq.DeviceId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "deviceId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "device_id", err) } if err := req.ParseForm(); err != nil { @@ -1096,14 +1075,14 @@ func local_request_Campus_RemoveDevice_0(ctx context.Context, marshaler runtime. _ = err ) - val, ok = pathParams["deviceId"] + val, ok = pathParams["device_id"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "deviceId") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "device_id") } protoReq.DeviceId, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "deviceId", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "device_id", err) } if err := req.ParseForm(); err != nil { @@ -1174,7 +1153,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) - mux.Handle("POST", pattern_Campus_GetCafeteriaRatings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Campus_GetNews_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -1182,12 +1161,12 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetCafeteriaRatings", runtime.WithHTTPPathPattern("/cafeteria/rating/get")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetNews", runtime.WithHTTPPathPattern("/news/{last_news_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Campus_GetCafeteriaRatings_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Campus_GetNews_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { @@ -1195,7 +1174,32 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser return } - forward_Campus_GetCafeteriaRatings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Campus_GetNews_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetNews_0{resp}, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Campus_GetCanteenRatings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetCanteenRatings", runtime.WithHTTPPathPattern("/canteen/rating/get")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Campus_GetCanteenRatings_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Campus_GetCanteenRatings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1224,7 +1228,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) - mux.Handle("POST", pattern_Campus_NewCafeteriaRating_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Campus_NewCanteenRating_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -1232,12 +1236,12 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/NewCafeteriaRating", runtime.WithHTTPPathPattern("/cafeteria/rating/new")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/NewCanteenRating", runtime.WithHTTPPathPattern("/canteen/rating/new")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Campus_NewCafeteriaRating_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Campus_NewCanteenRating_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { @@ -1245,7 +1249,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser return } - forward_Campus_NewCafeteriaRating_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Campus_NewCanteenRating_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -1324,7 +1328,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) - mux.Handle("GET", pattern_Campus_GetAvailableCafeteriaTags_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Campus_GetAvailableCanteenTags_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -1332,12 +1336,12 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetAvailableCafeteriaTags", runtime.WithHTTPPathPattern("/cafeteria/rating/allRatingTags")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetAvailableCanteenTags", runtime.WithHTTPPathPattern("/canteen/rating/allRatingTags")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Campus_GetAvailableCafeteriaTags_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Campus_GetAvailableCanteenTags_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { @@ -1345,11 +1349,11 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser return } - forward_Campus_GetAvailableCafeteriaTags_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetAvailableCafeteriaTags_0{resp}, mux.GetForwardResponseOptions()...) + forward_Campus_GetAvailableCanteenTags_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetAvailableCanteenTags_0{resp}, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_Campus_GetCafeterias_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Campus_GetCanteens_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream @@ -1357,12 +1361,12 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetCafeterias", runtime.WithHTTPPathPattern("/cafeteria/allCafeterias")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetCanteens", runtime.WithHTTPPathPattern("/canteen/allCanteens")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_Campus_GetCafeterias_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_Campus_GetCanteens_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { @@ -1370,7 +1374,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser return } - forward_Campus_GetCafeterias_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetCafeterias_0{resp}, mux.GetForwardResponseOptions()...) + forward_Campus_GetCanteens_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetCanteens_0{resp}, mux.GetForwardResponseOptions()...) }) @@ -1424,106 +1428,6 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) - mux.Handle("GET", pattern_Campus_GetBuilding2Gps_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetBuilding2Gps", runtime.WithHTTPPathPattern("/barrierfree/building2Gps")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Campus_GetBuilding2Gps_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_Campus_GetBuilding2Gps_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Campus_GetAreaFacilitiesByBuildingNr_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetAreaFacilitiesByBuildingNr", runtime.WithHTTPPathPattern("/barrierfree/nearby")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Campus_GetAreaFacilitiesByBuildingNr_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_Campus_GetAreaFacilitiesByBuildingNr_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Campus_GetListOfToilets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetListOfToilets", runtime.WithHTTPPathPattern("/barrierfree/toilets")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Campus_GetListOfToilets_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_Campus_GetListOfToilets_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Campus_GetListOfElevators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetListOfElevators", runtime.WithHTTPPathPattern("/barrierfree/elevators")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Campus_GetListOfElevators_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_Campus_GetListOfElevators_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Campus_GetMoreInformation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1632,7 +1536,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetKino", runtime.WithHTTPPathPattern("/kino/{lastId}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetKino", runtime.WithHTTPPathPattern("/kino/{last_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1682,7 +1586,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/SendFeedbackImage", runtime.WithHTTPPathPattern("/feedback/{id}/{imageNr}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/SendFeedbackImage", runtime.WithHTTPPathPattern("/feedback/{id}/{image_nr}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1707,7 +1611,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetUploadStatus", runtime.WithHTTPPathPattern("/device/uploaded/{lrzId}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetUploadStatus", runtime.WithHTTPPathPattern("/device/uploaded/{lrz_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1732,7 +1636,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetNotification", runtime.WithHTTPPathPattern("/notifications/{notificationId}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetNotification", runtime.WithHTTPPathPattern("/notifications/{notification_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1757,7 +1661,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetNotificationConfirm", runtime.WithHTTPPathPattern("/notifications/confirm/{notificationId}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetNotificationConfirm", runtime.WithHTTPPathPattern("/notifications/confirm/{notification_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1782,7 +1686,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetMembers", runtime.WithHTTPPathPattern("/members/{lrzId}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetMembers", runtime.WithHTTPPathPattern("/members/{lrz_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1807,7 +1711,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetCanteenHeadCount", runtime.WithHTTPPathPattern("/canteen/headCount/{canteenId}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/GetCanteenHeadCount", runtime.WithHTTPPathPattern("/canteen/headCount/{canteen_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1882,7 +1786,7 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/RemoveDevice", runtime.WithHTTPPathPattern("/device/{deviceId}")) + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/api.Campus/RemoveDevice", runtime.WithHTTPPathPattern("/device/{device_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1984,25 +1888,47 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) - mux.Handle("POST", pattern_Campus_GetCafeteriaRatings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Campus_GetNews_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetCafeteriaRatings", runtime.WithHTTPPathPattern("/cafeteria/rating/get")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetNews", runtime.WithHTTPPathPattern("/news/{last_news_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Campus_GetCafeteriaRatings_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Campus_GetNews_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Campus_GetCafeteriaRatings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Campus_GetNews_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetNews_0{resp}, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Campus_GetCanteenRatings_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetCanteenRatings", runtime.WithHTTPPathPattern("/canteen/rating/get")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Campus_GetCanteenRatings_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Campus_GetCanteenRatings_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -2028,25 +1954,25 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) - mux.Handle("POST", pattern_Campus_NewCafeteriaRating_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("POST", pattern_Campus_NewCanteenRating_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/NewCafeteriaRating", runtime.WithHTTPPathPattern("/cafeteria/rating/new")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/NewCanteenRating", runtime.WithHTTPPathPattern("/canteen/rating/new")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Campus_NewCafeteriaRating_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Campus_NewCanteenRating_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Campus_NewCafeteriaRating_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Campus_NewCanteenRating_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) @@ -2116,47 +2042,47 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) - mux.Handle("GET", pattern_Campus_GetAvailableCafeteriaTags_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Campus_GetAvailableCanteenTags_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetAvailableCafeteriaTags", runtime.WithHTTPPathPattern("/cafeteria/rating/allRatingTags")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetAvailableCanteenTags", runtime.WithHTTPPathPattern("/canteen/rating/allRatingTags")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Campus_GetAvailableCafeteriaTags_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Campus_GetAvailableCanteenTags_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Campus_GetAvailableCafeteriaTags_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetAvailableCafeteriaTags_0{resp}, mux.GetForwardResponseOptions()...) + forward_Campus_GetAvailableCanteenTags_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetAvailableCanteenTags_0{resp}, mux.GetForwardResponseOptions()...) }) - mux.Handle("GET", pattern_Campus_GetCafeterias_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle("GET", pattern_Campus_GetCanteens_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetCafeterias", runtime.WithHTTPPathPattern("/cafeteria/allCafeterias")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetCanteens", runtime.WithHTTPPathPattern("/canteen/allCanteens")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_Campus_GetCafeterias_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_Campus_GetCanteens_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Campus_GetCafeterias_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetCafeterias_0{resp}, mux.GetForwardResponseOptions()...) + forward_Campus_GetCanteens_0(annotatedContext, mux, outboundMarshaler, w, req, response_Campus_GetCanteens_0{resp}, mux.GetForwardResponseOptions()...) }) @@ -2204,94 +2130,6 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) - mux.Handle("GET", pattern_Campus_GetBuilding2Gps_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetBuilding2Gps", runtime.WithHTTPPathPattern("/barrierfree/building2Gps")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Campus_GetBuilding2Gps_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_Campus_GetBuilding2Gps_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Campus_GetAreaFacilitiesByBuildingNr_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetAreaFacilitiesByBuildingNr", runtime.WithHTTPPathPattern("/barrierfree/nearby")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Campus_GetAreaFacilitiesByBuildingNr_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_Campus_GetAreaFacilitiesByBuildingNr_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Campus_GetListOfToilets_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetListOfToilets", runtime.WithHTTPPathPattern("/barrierfree/toilets")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Campus_GetListOfToilets_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_Campus_GetListOfToilets_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("GET", pattern_Campus_GetListOfElevators_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetListOfElevators", runtime.WithHTTPPathPattern("/barrierfree/elevators")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Campus_GetListOfElevators_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_Campus_GetListOfElevators_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("GET", pattern_Campus_GetMoreInformation_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2386,7 +2224,7 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetKino", runtime.WithHTTPPathPattern("/kino/{lastId}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetKino", runtime.WithHTTPPathPattern("/kino/{last_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2430,7 +2268,7 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/SendFeedbackImage", runtime.WithHTTPPathPattern("/feedback/{id}/{imageNr}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/SendFeedbackImage", runtime.WithHTTPPathPattern("/feedback/{id}/{image_nr}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2452,7 +2290,7 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetUploadStatus", runtime.WithHTTPPathPattern("/device/uploaded/{lrzId}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetUploadStatus", runtime.WithHTTPPathPattern("/device/uploaded/{lrz_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2474,7 +2312,7 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetNotification", runtime.WithHTTPPathPattern("/notifications/{notificationId}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetNotification", runtime.WithHTTPPathPattern("/notifications/{notification_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2496,7 +2334,7 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetNotificationConfirm", runtime.WithHTTPPathPattern("/notifications/confirm/{notificationId}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetNotificationConfirm", runtime.WithHTTPPathPattern("/notifications/confirm/{notification_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2518,7 +2356,7 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetMembers", runtime.WithHTTPPathPattern("/members/{lrzId}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetMembers", runtime.WithHTTPPathPattern("/members/{lrz_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2540,7 +2378,7 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetCanteenHeadCount", runtime.WithHTTPPathPattern("/canteen/headCount/{canteenId}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/GetCanteenHeadCount", runtime.WithHTTPPathPattern("/canteen/headCount/{canteen_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2606,7 +2444,7 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) var err error var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/RemoveDevice", runtime.WithHTTPPathPattern("/device/{deviceId}")) + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/api.Campus/RemoveDevice", runtime.WithHTTPPathPattern("/device/{device_id}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2630,16 +2468,25 @@ type response_Campus_GetNewsSources_0 struct { } func (m response_Campus_GetNewsSources_0) XXX_ResponseBody() interface{} { - response := m.Message.(*NewsSourceReply) + response := m.Message.(*GetNewsSourcesReply) return response.Sources } +type response_Campus_GetNews_0 struct { + proto.Message +} + +func (m response_Campus_GetNews_0) XXX_ResponseBody() interface{} { + response := m.Message.(*GetNewsReply) + return response.News +} + type response_Campus_GetAvailableDishTags_0 struct { proto.Message } func (m response_Campus_GetAvailableDishTags_0) XXX_ResponseBody() interface{} { - response := m.Message.(*GetTagsReply) + response := m.Message.(*GetAvailableDishTagsReply) return response.RatingTags } @@ -2648,26 +2495,26 @@ type response_Campus_GetNameTags_0 struct { } func (m response_Campus_GetNameTags_0) XXX_ResponseBody() interface{} { - response := m.Message.(*GetTagsReply) + response := m.Message.(*GetNameTagsReply) return response.RatingTags } -type response_Campus_GetAvailableCafeteriaTags_0 struct { +type response_Campus_GetAvailableCanteenTags_0 struct { proto.Message } -func (m response_Campus_GetAvailableCafeteriaTags_0) XXX_ResponseBody() interface{} { - response := m.Message.(*GetTagsReply) +func (m response_Campus_GetAvailableCanteenTags_0) XXX_ResponseBody() interface{} { + response := m.Message.(*GetAvailableCanteenTagsReply) return response.RatingTags } -type response_Campus_GetCafeterias_0 struct { +type response_Campus_GetCanteens_0 struct { proto.Message } -func (m response_Campus_GetCafeterias_0) XXX_ResponseBody() interface{} { - response := m.Message.(*GetCafeteriaReply) - return response.Cafeteria +func (m response_Campus_GetCanteens_0) XXX_ResponseBody() interface{} { + response := m.Message.(*GetCanteensReply) + return response.Canteen } type response_Campus_GetDishes_0 struct { @@ -2684,11 +2531,13 @@ var ( pattern_Campus_GetNewsSources_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"news", "sources"}, "")) - pattern_Campus_GetCafeteriaRatings_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"cafeteria", "rating", "get"}, "")) + pattern_Campus_GetNews_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"news", "last_news_id"}, "")) + + pattern_Campus_GetCanteenRatings_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"canteen", "rating", "get"}, "")) pattern_Campus_GetDishRatings_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"dish", "rating", "get"}, "")) - pattern_Campus_NewCafeteriaRating_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"cafeteria", "rating", "new"}, "")) + pattern_Campus_NewCanteenRating_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"canteen", "rating", "new"}, "")) pattern_Campus_NewDishRating_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"dish", "rating", "new"}, "")) @@ -2696,22 +2545,14 @@ var ( pattern_Campus_GetNameTags_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"dish", "rating", "allDishTags"}, "")) - pattern_Campus_GetAvailableCafeteriaTags_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"cafeteria", "rating", "allRatingTags"}, "")) + pattern_Campus_GetAvailableCanteenTags_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"canteen", "rating", "allRatingTags"}, "")) - pattern_Campus_GetCafeterias_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"cafeteria", "allCafeterias"}, "")) + pattern_Campus_GetCanteens_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"canteen", "allCanteens"}, "")) pattern_Campus_GetDishes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"dish", "allDishes"}, "")) pattern_Campus_GetResponsiblePerson_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"barrierfree", "contacts"}, "")) - pattern_Campus_GetBuilding2Gps_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"barrierfree", "building2Gps"}, "")) - - pattern_Campus_GetAreaFacilitiesByBuildingNr_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"barrierfree", "nearby"}, "")) - - pattern_Campus_GetListOfToilets_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"barrierfree", "toilets"}, "")) - - pattern_Campus_GetListOfElevators_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"barrierfree", "elevators"}, "")) - pattern_Campus_GetMoreInformation_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"barrierfree", "moreInformation"}, "")) pattern_Campus_GetOpeningTimes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"openingtimes", "language"}, "")) @@ -2720,27 +2561,27 @@ var ( pattern_Campus_GetStudyRoomList_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"studyrooms"}, "")) - pattern_Campus_GetKino_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"kino", "lastId"}, "")) + pattern_Campus_GetKino_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"kino", "last_id"}, "")) pattern_Campus_SendFeedback_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"feedback"}, "")) - pattern_Campus_SendFeedbackImage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 1, 0, 4, 1, 5, 2}, []string{"feedback", "id", "imageNr"}, "")) + pattern_Campus_SendFeedbackImage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1, 1, 0, 4, 1, 5, 2}, []string{"feedback", "id", "image_nr"}, "")) - pattern_Campus_GetUploadStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"device", "uploaded", "lrzId"}, "")) + pattern_Campus_GetUploadStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"device", "uploaded", "lrz_id"}, "")) - pattern_Campus_GetNotification_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"notifications", "notificationId"}, "")) + pattern_Campus_GetNotification_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"notifications", "notification_id"}, "")) - pattern_Campus_GetNotificationConfirm_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"notifications", "confirm", "notificationId"}, "")) + pattern_Campus_GetNotificationConfirm_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"notifications", "confirm", "notification_id"}, "")) - pattern_Campus_GetMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"members", "lrzId"}, "")) + pattern_Campus_GetMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"members", "lrz_id"}, "")) - pattern_Campus_GetCanteenHeadCount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"canteen", "headCount", "canteenId"}, "")) + pattern_Campus_GetCanteenHeadCount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"canteen", "headCount", "canteen_id"}, "")) pattern_Campus_IOSDeviceRequestResponse_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"ios", "notifications", "deviceRequestResponse"}, "")) pattern_Campus_RegisterDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"device"}, "")) - pattern_Campus_RemoveDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"device", "deviceId"}, "")) + pattern_Campus_RemoveDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"device", "device_id"}, "")) ) var ( @@ -2748,11 +2589,13 @@ var ( forward_Campus_GetNewsSources_0 = runtime.ForwardResponseMessage - forward_Campus_GetCafeteriaRatings_0 = runtime.ForwardResponseMessage + forward_Campus_GetNews_0 = runtime.ForwardResponseMessage + + forward_Campus_GetCanteenRatings_0 = runtime.ForwardResponseMessage forward_Campus_GetDishRatings_0 = runtime.ForwardResponseMessage - forward_Campus_NewCafeteriaRating_0 = runtime.ForwardResponseMessage + forward_Campus_NewCanteenRating_0 = runtime.ForwardResponseMessage forward_Campus_NewDishRating_0 = runtime.ForwardResponseMessage @@ -2760,22 +2603,14 @@ var ( forward_Campus_GetNameTags_0 = runtime.ForwardResponseMessage - forward_Campus_GetAvailableCafeteriaTags_0 = runtime.ForwardResponseMessage + forward_Campus_GetAvailableCanteenTags_0 = runtime.ForwardResponseMessage - forward_Campus_GetCafeterias_0 = runtime.ForwardResponseMessage + forward_Campus_GetCanteens_0 = runtime.ForwardResponseMessage forward_Campus_GetDishes_0 = runtime.ForwardResponseMessage forward_Campus_GetResponsiblePerson_0 = runtime.ForwardResponseMessage - forward_Campus_GetBuilding2Gps_0 = runtime.ForwardResponseMessage - - forward_Campus_GetAreaFacilitiesByBuildingNr_0 = runtime.ForwardResponseMessage - - forward_Campus_GetListOfToilets_0 = runtime.ForwardResponseMessage - - forward_Campus_GetListOfElevators_0 = runtime.ForwardResponseMessage - forward_Campus_GetMoreInformation_0 = runtime.ForwardResponseMessage forward_Campus_GetOpeningTimes_0 = runtime.ForwardResponseMessage diff --git a/server/api/tumdev/campus_backend.proto b/server/api/tumdev/campus_backend.proto index 4cd8775e..852afd75 100644 --- a/server/api/tumdev/campus_backend.proto +++ b/server/api/tumdev/campus_backend.proto @@ -1,205 +1,149 @@ syntax = "proto3"; -option go_package = "github.com/TUM-Dev/Campus-Backend/api"; -option java_multiple_files = true; -option java_package = "app.tum.campus.api"; -option java_outer_classname = "CampusApiProto"; -option csharp_namespace = "CampusApiProto"; - package api; import "google/api/annotations.proto"; -import "google/protobuf/empty.proto"; import "google/protobuf/timestamp.proto"; +option csharp_namespace = "CampusApiProto"; +option go_package = "github.com/TUM-Dev/Campus-Backend/api"; +option java_multiple_files = true; +option java_outer_classname = "CampusApiProto"; +option java_package = "app.tum.campus.api"; + service Campus { - rpc GetTopNews (google.protobuf.Empty) returns (GetTopNewsReply) { - option (google.api.http) = { - get: "/news/top" - }; + rpc GetTopNews(GetTopNewsRequest) returns (GetTopNewsReply) { + option (google.api.http) = {get: "/news/top"}; } - rpc GetNewsSources (google.protobuf.Empty) returns (NewsSourceReply) { + rpc GetNewsSources(GetNewsSourcesRequest) returns (GetNewsSourcesReply) { option (google.api.http) = { get: "/news/sources", response_body: "sources" }; } + rpc GetNews(GetNewsRequest) returns (GetNewsReply) { + option (google.api.http) = { + get: "/news/{last_news_id}", + response_body: "news" + }; + } - // This endpoint retrieves Cafeteria Ratings from the Backend. - rpc GetCafeteriaRatings (CafeteriaRatingRequest) returns (CafeteriaRatingReply) { + // This endpoint retrieves Canteen Ratings from the Backend. + rpc GetCanteenRatings(GetCanteenRatingsRequest) returns (GetCanteenRatingsReply) { option (google.api.http) = { - post: "/cafeteria/rating/get", + post: "/canteen/rating/get", body: "*", }; } - - rpc GetDishRatings (DishRatingRequest) returns (DishRatingReply) { + rpc GetDishRatings(GetDishRatingsRequest) returns (GetDishRatingsReply) { option (google.api.http) = { post: "/dish/rating/get", body: "*", }; } - - - rpc NewCafeteriaRating (NewCafeteriaRatingRequest) returns (google.protobuf.Empty) { + rpc NewCanteenRating(NewCanteenRatingRequest) returns (NewCanteenRatingReply) { option (google.api.http) = { - post: "/cafeteria/rating/new", + post: "/canteen/rating/new", body: "*", }; } - rpc NewDishRating (NewDishRatingRequest) returns (google.protobuf.Empty) { + rpc NewDishRating(NewDishRatingRequest) returns (NewDishRatingReply) { option (google.api.http) = { post: "/dish/rating/new", body: "*", }; } - rpc GetAvailableDishTags (google.protobuf.Empty) returns (GetTagsReply) { + rpc GetAvailableDishTags(GetAvailableDishTagsRequest) returns (GetAvailableDishTagsReply) { option (google.api.http) = { get: "/dish/rating/allRatingTags", - response_body: "ratingTags" + response_body: "rating_tags" }; } - rpc GetNameTags (google.protobuf.Empty) returns (GetTagsReply) { + rpc GetNameTags(GetNameTagsRequest) returns (GetNameTagsReply) { option (google.api.http) = { get: "/dish/rating/allDishTags", - response_body: "ratingTags" + response_body: "rating_tags" }; } - rpc GetAvailableCafeteriaTags (google.protobuf.Empty) returns (GetTagsReply) { + rpc GetAvailableCanteenTags(GetAvailableCanteenTagsRequest) returns (GetAvailableCanteenTagsReply) { option (google.api.http) = { - get: "/cafeteria/rating/allRatingTags", - response_body: "ratingTags" + get: "/canteen/rating/allRatingTags", + response_body: "rating_tags" }; } - rpc GetCafeterias (google.protobuf.Empty) returns (GetCafeteriaReply) { + rpc GetCanteens(GetCanteensRequest) returns (GetCanteensReply) { option (google.api.http) = { - get: "/cafeteria/allCafeterias", - response_body: "cafeteria" + get: "/canteen/allCanteens", + response_body: "canteen" }; } - rpc GetDishes (GetDishesRequest) returns (GetDishesReply) { + rpc GetDishes(GetDishesRequest) returns (GetDishesReply) { option (google.api.http) = { get: "/dish/allDishes", response_body: "dish" }; } - - rpc GetResponsiblePerson (google.protobuf.Empty) returns (GetResponsiblePersonReply) { - option (google.api.http) = { - get: "/barrierfree/contacts", - }; + rpc GetResponsiblePerson(GetResponsiblePersonRequest) returns (GetResponsiblePersonReply) { + option (google.api.http) = {get: "/barrierfree/contacts"}; } - rpc GetBuilding2Gps (google.protobuf.Empty) returns (GetBuilding2GpsReply) { - option (google.api.http) = { - get: "/barrierfree/building2Gps", - }; + rpc GetMoreInformation(GetMoreInformationRequest) returns (GetMoreInformationReply) { + option (google.api.http) = {get: "/barrierfree/moreInformation"}; } - rpc GetAreaFacilitiesByBuildingNr (GetAreaFacilitiesByBuildingNrRequest) returns (GetAreaFacilitiesByBuildingNrReply) { - option (google.api.http) = { - get: "/barrierfree/nearby", - }; + rpc GetOpeningTimes(GetOpeningTimesRequest) returns (GetOpeningTimesReply) { + option (google.api.http) = {get: "/openingtimes/{language}"}; } - rpc GetListOfToilets (google.protobuf.Empty) returns (GetListOfToiletsReply) { - option (google.api.http) = { - get: "/barrierfree/toilets", - }; + rpc GetUpdateNote(GetUpdateNoteRequest) returns (GetUpdateNoteReply) { + option (google.api.http) = {get: "/updatenote/{version}"}; } - rpc GetListOfElevators (google.protobuf.Empty) returns (GetListOfElevatorsReply) { - option (google.api.http) = { - get: "/barrierfree/elevators", - }; + rpc GetStudyRoomList(GetStudyRoomListRequest) returns (GetStudyRoomListReply) { + option (google.api.http) = {get: "/studyrooms"}; } - rpc GetMoreInformation (google.protobuf.Empty) returns (GetMoreInformationReply) { - option (google.api.http) = { - get: "/barrierfree/moreInformation", - }; - } - - - rpc GetOpeningTimes (GetOpeningTimesRequest) returns (GetOpeningTimesReply) { - option (google.api.http) = { - get: "/openingtimes/{language}", - }; - } - - - rpc GetUpdateNote (GetUpdateNoteRequest) returns (GetUpdateNoteReply) { - option (google.api.http) = { - get: "/updatenote/{version}", - }; - } - - - rpc GetStudyRoomList (google.protobuf.Empty) returns (GetStudyRoomListReply) { - option (google.api.http) = { - get: "/studyrooms", - }; - } - - rpc GetKino(GetKinoRequest) returns (GetKinoReply) { - option (google.api.http) = { - get: "/kino/{lastId}", - }; + option (google.api.http) = {get: "/kino/{last_id}"}; } - rpc SendFeedback(SendFeedbackRequest) returns (SendFeedbackImageReply) { - option (google.api.http) = { - post: "/feedback", - }; + rpc SendFeedback(SendFeedbackRequest) returns (SendFeedbackReply) { + option (google.api.http) = {post: "/feedback"}; } rpc SendFeedbackImage(SendFeedbackImageRequest) returns (SendFeedbackImageReply) { - option (google.api.http) = { - post: "/feedback/{id}/{imageNr}", - }; + option (google.api.http) = {post: "/feedback/{id}/{image_nr}"}; } rpc GetUploadStatus(GetUploadStatusRequest) returns (GetUploadStatusReply) { - option (google.api.http) = { - get: "/device/uploaded/{lrzId}", - }; + option (google.api.http) = {get: "/device/uploaded/{lrz_id}"}; } - - rpc GetNotification(NotificationsRequest) returns (GetNotificationsReply) { - option (google.api.http) = { - get: "/notifications/{notificationId}", - }; + rpc GetNotification(GetNotificationRequest) returns (GetNotificationReply) { + option (google.api.http) = {get: "/notifications/{notification_id}"}; } - rpc GetNotificationConfirm(NotificationsRequest) returns (GetNotificationsConfirmReply) { - option (google.api.http) = { - get: "/notifications/confirm/{notificationId}", - }; + rpc GetNotificationConfirm(GetNotificationConfirmRequest) returns (GetNotificationConfirmReply) { + option (google.api.http) = {get: "/notifications/confirm/{notification_id}"}; } rpc GetMembers(GetMembersRequest) returns (GetMembersReply) { - option (google.api.http) = { - get: "/members/{lrzId}", - }; + option (google.api.http) = {get: "/members/{lrz_id}"}; } rpc GetCanteenHeadCount(GetCanteenHeadCountRequest) returns (GetCanteenHeadCountReply) { - option (google.api.http) = { - get: "/canteen/headCount/{canteenId}", - }; + option (google.api.http) = {get: "/canteen/headCount/{canteen_id}"}; } // Endpoint for the iOS app to respond to background notifications requests @@ -220,9 +164,7 @@ service Campus { // Unregister it from push notifications rpc RemoveDevice(RemoveDeviceRequest) returns (RemoveDeviceReply) { - option (google.api.http) = { - delete: "/device/{deviceId}", - }; + option (google.api.http) = {delete: "/device/{device_id}"}; } } @@ -233,26 +175,26 @@ enum DeviceType { } message RegisterDeviceRequest { - string deviceId = 1; - optional string publicKey = 2; - DeviceType deviceType = 3; + string device_id = 1; + optional string public_key = 2; + DeviceType device_type = 3; } message RegisterDeviceReply { - string deviceId = 1; + string device_id = 1; } message RemoveDeviceRequest { - string deviceId = 1; - DeviceType deviceType = 2; + string device_id = 1; + DeviceType device_type = 2; } message RemoveDeviceReply { - string deviceId = 1; + string device_id = 1; } message IOSDeviceRequestResponseRequest { - string requestId = 1; + string request_id = 1; string payload = 2; } @@ -260,7 +202,30 @@ message IOSDeviceRequestResponseReply { string message = 1; } -message NewsSourceReply { +message NewsItem { + int64 id = 1; + string title = 2; + string text = 3; + string link = 4; + string image_url = 5; + string source = 6; + google.protobuf.Timestamp created = 7; +} + +message GetNewsReply { + repeated NewsItem news = 1; +} + +message GetNewsRequest { + // the last id of the news item received. 0 to get all news items + int32 last_news_id = 1; + // filter by news source id. 0 to get all news items + int32 news_source = 2; +} + +message GetNewsSourcesRequest {} + +message GetNewsSourcesReply { repeated NewsSource sources = 1; } @@ -270,6 +235,7 @@ message NewsSource { string icon = 3; } +message GetTopNewsRequest {} message GetTopNewsReply { string image_url = 1; string link = 2; @@ -278,9 +244,9 @@ message GetTopNewsReply { google.protobuf.Timestamp to = 5; } -message CafeteriaRatingRequest { - // cafeteriaId Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") - string cafeteriaId = 1; +message GetCanteenRatingsRequest { + // canteenId Mandatory Name of the canteen (EAT-API naming scheme "MENSA_GARCHING") + string canteen_id = 1; // Optional Parameter to define an interval for the ratings (Lower bound) google.protobuf.Timestamp from = 2; // Optional Parameter to define an interval for the ratings (Upper bound) @@ -289,10 +255,18 @@ message CafeteriaRatingRequest { // Optional Parameter defines how many ratings are queried. If all ratings should be queried, enter "-1" int32 limit = 4; } +message GetCanteenRatingsReply { + repeated SingleRatingReply rating = 1; + double avg = 2; + double std = 3; + int32 min = 4; + int32 max = 5; + repeated RatingTagResult rating_tags = 6; +} -message DishRatingRequest { - // Mandatory Name of the cafeteria (EAT-API naming scheme "MENSA_GARCHING") - string cafeteriaId = 1; +message GetDishRatingsRequest { + // Mandatory Name of the canteen (EAT-API naming scheme "MENSA_GARCHING") + string canteen_id = 1; // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa string dish = 2; // Optional Parameter to define an interval for the ratings (Lower bound) @@ -303,104 +277,109 @@ message DishRatingRequest { int32 limit = 5; } -message CafeteriaRatingReply { - repeated SingleRatingReply rating = 1; - double avg = 2; - double std = 3; - int32 min = 4; - int32 max = 5; - repeated RatingTagResult ratingTags = 6; -} - -message DishRatingReply { +message GetDishRatingsReply { repeated SingleRatingReply rating = 1; double avg = 2; double std = 3; int32 min = 4; int32 max = 5; - repeated RatingTagResult ratingTags = 6; - repeated RatingTagResult nameTags = 7; + repeated RatingTagResult rating_tags = 6; + repeated RatingTagResult name_tags = 7; } -message SingleRatingReply{ +message SingleRatingReply { // number in the range 1-5 int32 points = 1; // Optional JPEG image in Base64 bytes image = 2; // Optional comment (max 256 chars) string comment = 3; - repeated RatingTagNewRequest ratingTags = 4; + repeated RatingTagNewRequest rating_tags = 4; google.protobuf.Timestamp visited = 5; } -message NewCafeteriaRatingRequest{ +message NewCanteenRatingReply {} + +message NewCanteenRatingRequest { // number in the range 1-5 int32 points = 1; - string cafeteriaId = 2; + string canteen_id = 2; bytes image = 3; - // Optional list of tag ratings add as many tags with a rating (1-5) of the list of cafeteriaRatingTags - repeated RatingTag ratingTags = 4; + // Optional list of tag ratings add as many tags with a rating (1-5) of the list of canteenRatingTags + repeated RatingTag rating_tags = 4; // Optional comment (max 256 chars) string comment = 6; } -message NewDishRatingRequest{ +message NewDishRatingReply {} +message NewDishRatingRequest { // number in the range 1-5 int32 points = 1; // Mandatory Name of the dish (EAT-API naming scheme "MENSA_GARCHING") Must be available int the given mensa - string cafeteriaId = 2; + string canteen_id = 2; // Mandatory Name of the dish (EAT-API naming scheme) Must be available int the given mensa string dish = 3; // Optional JPEG image in Base64 bytes image = 4; // Optional list of tag ratings add as many tags with a rating (1-5) of the list of dishRatingTags - repeated RatingTag ratingTags = 5; + repeated RatingTag rating_tags = 5; // Optional comment (max 256 chars) string comment = 7; } -message GetTagsReply{ - repeated TagsOverview ratingTags = 1; +message GetAvailableDishTagsRequest {} +message GetAvailableDishTagsReply { + repeated TagsOverview rating_tags = 1; +} + +message GetNameTagsRequest {} +message GetNameTagsReply { + repeated TagsOverview rating_tags = 1; +} + +message GetAvailableCanteenTagsRequest {} +message GetAvailableCanteenTagsReply { + repeated TagsOverview rating_tags = 1; } message TagsOverview { - int32 tagId = 1; + int32 tag_id = 1; string de = 2; string en = 3; } message RatingTag { - int32 tagId = 1; + int64 tag_id = 1; double points = 2; } message RatingTagNewRequest { - int32 tagId = 1; + int32 tag_id = 1; int32 points = 2; } message RatingTagResult { - int32 tagId = 1; + int32 tag_id = 1; double avg = 2; double std = 3; int32 min = 4; int32 max = 5; } -message GetCafeteriaReply{ - repeated Cafeteria cafeteria = 1; +message GetCanteensRequest {} +message GetCanteensReply { + repeated Canteen canteen = 1; } -message Cafeteria{ +message Canteen { string id = 1; string address = 2; double longitude = 3; double latitude = 4; } - -message GetDishesRequest{ - string cafeteriaId = 1; +message GetDishesRequest { + string canteen_id = 1; // >=2022 until the current year int32 year = 2; // range 1 - 53 @@ -409,50 +388,25 @@ message GetDishesRequest{ int32 day = 4; } -message GetDishesReply{ +message GetDishesReply { repeated string dish = 1; } +message GetResponsiblePersonRequest {} message GetResponsiblePersonReply { - repeated ResponsiblePersonElement responsiblePerson = 1; + repeated ResponsiblePerson responsible_person = 1; } -message ResponsiblePersonElement{ +message ResponsiblePerson { string name = 1; string telephone = 2; string email = 3; string faculty = 4; - string tumID = 5; - + string tum_id = 5; } -message GetBuilding2GpsReply { - repeated Building2GpsElement building2Gps = 1; -} - -message Building2GpsElement{ - string id = 1; - string latitude = 2; - string longitude = 3; - -} - -message GetAreaFacilitiesByBuildingNrReply { - repeated RoomInformationElement areaFacilitiesByBuildingNr = 1; -} - - - -message GetAreaFacilitiesByBuildingNrRequest { - string building_nr = 1; -} - -message GetListOfToiletsReply { - repeated RoomInformationElement listOfToilets = 1; -} - -message RoomInformationElement{ - int32 roomId = 1; +message RoomInformationElement { + int32 room_id = 1; string room_code = 2; string building_nr = 3; string arch_id = 4; @@ -463,83 +417,75 @@ message RoomInformationElement{ string name = 9; } -message GetListOfElevatorsReply { - repeated RoomInformationElement listOfElevators = 1; -} - - - +message GetMoreInformationRequest {} message GetMoreInformationReply { - repeated MoreInformationElement information = 1; -} - -message MoreInformationElement{ - string title = 1; - string category = 2; - string url = 3; + message MoreInformation { + string title = 1; + string category = 2; + string url = 3; + } + repeated MoreInformation infos = 1; } - -message GetOpeningTimesRequest{ +message GetOpeningTimesRequest { string language = 1; } - - -message GetOpeningTimesReply{ +message GetOpeningTimesReply { repeated OpeningTimesMsgElement facilities = 1; } -message OpeningTimesMsgElement{ +message OpeningTimesMsgElement { int32 id = 1; string category = 2; - string name = 3; + string name = 3; string address = 4; - string room = 5; + string room = 5; string transport_station = 6; string opening_hours = 7; string infos = 8; - string url = 9; + string url = 9; string language = 10; int32 reference_id = 11; } -message GetUpdateNoteRequest{ - int32 version = 1; +message GetUpdateNoteRequest { + int64 version = 1; } -message GetUpdateNoteReply{ +message GetUpdateNoteReply { string message = 1; + string version_name = 2; } -message GetStudyRoomListReply{ +message GetStudyRoomListRequest {} +message GetStudyRoomListReply { repeated StudyRoomMsgElement rooms = 1; - } -message StudyRoomMsgElement{ +message StudyRoomMsgElement { int32 id = 1; - string name = 2; - string details = 3; + string name = 2; + string details = 3; repeated StudyRoom rooms = 4; } -message StudyRoom{ +message StudyRoom { int32 group_id = 1; - int32 roomId = 2; + int32 room_id = 2; string room_code = 3; string room_name = 4; string building_name = 5; } -message GetKinoRequest{ - int32 lastId = 1; +message GetKinoRequest { + int32 last_id = 1; } -message GetKinoReply{ +message GetKinoReply { repeated KinoMsgElement kinos = 1; } -message KinoMsgElement{ +message KinoMsgElement { string name = 1; string path = 2; int32 kino = 3; @@ -558,44 +504,44 @@ message KinoMsgElement{ string link = 16; } -message SendFeedbackRequest{ +message SendFeedbackReply {} +message SendFeedbackRequest { string topic = 1; string email = 2; - string emailId = 3; + string email_id = 3; string message = 4; int32 image_count = 5; double latitude = 6; double longitude = 7; - string osVersion = 8; - string appVersion = 9; + string os_version = 8; + string app_version = 9; } -message SendFeedbackImageReply{ +message SendFeedbackImageReply { string status = 1; } -message SendFeedbackImageRequest{ +message SendFeedbackImageRequest { int32 id = 1; - int32 imageNr = 2; + int32 image_nr = 2; //todo where does the file come from? } - -message GetMembersRequest{ - string lrzId = 1; +message GetMembersRequest { + string lrz_id = 1; } -message GetMembersReply{ - string lrzId = 1; +message GetMembersReply { + string lrz_id = 1; string name = 2; - int32 memberId = 3; + int32 member_id = 3; } -message GetUploadStatusRequest{ - string lrzId = 1; +message GetUploadStatusRequest { + string lrz_id = 1; } -message GetUploadStatusReply{ +message GetUploadStatusReply { string fcm_token = 1; string public_key = 2; bool student_id = 3; @@ -603,33 +549,34 @@ message GetUploadStatusReply{ bool external_id = 5; } -message GetNotificationsReply{ - int32 notificationId=1; - int32 type=2; - string title=3; - string description=4; - string signature=5; +message GetNotificationRequest { + int32 notification_id = 1; } - - -message NotificationsRequest{ - int32 notificationId=1; +message GetNotificationReply { + int32 notification_id = 1; + int32 type = 2; + string title = 3; + string description = 4; + string signature = 5; } -message GetNotificationsConfirmReply{ - string status=1; +message GetNotificationConfirmRequest { + int32 notification_id = 1; +} +message GetNotificationConfirmReply { + string status = 1; } message GetCanteenHeadCountRequest { // The requested canteen ID - string canteenId = 1; + string canteen_id = 1; } message GetCanteenHeadCountReply { // The absolut count of humans in the canteen. Only valid in case percent != -1. uint32 count = 1; // The maximum nunmber of humans in the canteen for the percent to be 100.00. Only valid in case percent != -1. - uint32 maxCount = 2; + uint32 max_count = 2; // Current capacity utilization of the canteen clamped to 0 and 100 or -1 in case no data is available. float percent = 3; // A time stamp indicating how up to date the response is. Only valid in case percent != -1. diff --git a/server/api/tumdev/campus_backend.swagger.json b/server/api/tumdev/campus_backend.swagger.json index 2f17c490..c67431d6 100644 --- a/server/api/tumdev/campus_backend.swagger.json +++ b/server/api/tumdev/campus_backend.swagger.json @@ -17,28 +17,6 @@ "application/json" ], "paths": { - "/barrierfree/building2Gps": { - "get": { - "operationId": "Campus_GetBuilding2Gps", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/apiGetBuilding2GpsReply" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/rpcStatus" - } - } - }, - "tags": [ - "Campus" - ] - } - }, "/barrierfree/contacts": { "get": { "operationId": "Campus_GetResponsiblePerson", @@ -61,14 +39,14 @@ ] } }, - "/barrierfree/elevators": { + "/barrierfree/moreInformation": { "get": { - "operationId": "Campus_GetListOfElevators", + "operationId": "Campus_GetMoreInformation", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/apiGetListOfElevatorsReply" + "$ref": "#/definitions/apiGetMoreInformationReply" } }, "default": { @@ -83,14 +61,18 @@ ] } }, - "/barrierfree/moreInformation": { + "/canteen/allCanteens": { "get": { - "operationId": "Campus_GetMoreInformation", + "operationId": "Campus_GetCanteens", "responses": { "200": { - "description": "A successful response.", + "description": "", "schema": { - "$ref": "#/definitions/apiGetMoreInformationReply" + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiCanteen" + } } }, "default": { @@ -105,14 +87,14 @@ ] } }, - "/barrierfree/nearby": { + "/canteen/headCount/{canteenId}": { "get": { - "operationId": "Campus_GetAreaFacilitiesByBuildingNr", + "operationId": "Campus_GetCanteenHeadCount", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/apiGetAreaFacilitiesByBuildingNrReply" + "$ref": "#/definitions/apiGetCanteenHeadCountReply" } }, "default": { @@ -124,9 +106,10 @@ }, "parameters": [ { - "name": "buildingNr", - "in": "query", - "required": false, + "name": "canteenId", + "description": "The requested canteen ID", + "in": "path", + "required": true, "type": "string" } ], @@ -135,57 +118,9 @@ ] } }, - "/barrierfree/toilets": { + "/canteen/rating/allRatingTags": { "get": { - "operationId": "Campus_GetListOfToilets", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/apiGetListOfToiletsReply" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/rpcStatus" - } - } - }, - "tags": [ - "Campus" - ] - } - }, - "/cafeteria/allCafeterias": { - "get": { - "operationId": "Campus_GetCafeterias", - "responses": { - "200": { - "description": "", - "schema": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/apiCafeteria" - } - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/rpcStatus" - } - } - }, - "tags": [ - "Campus" - ] - } - }, - "/cafeteria/rating/allRatingTags": { - "get": { - "operationId": "Campus_GetAvailableCafeteriaTags", + "operationId": "Campus_GetAvailableCanteenTags", "responses": { "200": { "description": "", @@ -209,15 +144,15 @@ ] } }, - "/cafeteria/rating/get": { + "/canteen/rating/get": { "post": { - "summary": "This endpoint retrieves Cafeteria Ratings from the Backend.", - "operationId": "Campus_GetCafeteriaRatings", + "summary": "This endpoint retrieves Canteen Ratings from the Backend.", + "operationId": "Campus_GetCanteenRatings", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/apiCafeteriaRatingReply" + "$ref": "#/definitions/apiGetCanteenRatingsReply" } }, "default": { @@ -233,7 +168,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/apiCafeteriaRatingRequest" + "$ref": "#/definitions/apiGetCanteenRatingsRequest" } } ], @@ -242,15 +177,14 @@ ] } }, - "/cafeteria/rating/new": { + "/canteen/rating/new": { "post": { - "operationId": "Campus_NewCafeteriaRating", + "operationId": "Campus_NewCanteenRating", "responses": { "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/apiNewCanteenRatingReply" } }, "default": { @@ -266,7 +200,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/apiNewCafeteriaRatingRequest" + "$ref": "#/definitions/apiNewCanteenRatingRequest" } } ], @@ -275,37 +209,6 @@ ] } }, - "/canteen/headCount/{canteenId}": { - "get": { - "operationId": "Campus_GetCanteenHeadCount", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/apiGetCanteenHeadCountReply" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/rpcStatus" - } - } - }, - "parameters": [ - { - "name": "canteenId", - "description": "The requested canteen ID", - "in": "path", - "required": true, - "type": "string" - } - ], - "tags": [ - "Campus" - ] - } - }, "/device": { "post": { "summary": "Register an Android, iOS or Windows device for push notifications", @@ -434,7 +337,7 @@ }, "parameters": [ { - "name": "cafeteriaId", + "name": "canteenId", "in": "query", "required": false, "type": "string" @@ -528,7 +431,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/apiDishRatingReply" + "$ref": "#/definitions/apiGetDishRatingsReply" } }, "default": { @@ -544,7 +447,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/apiDishRatingRequest" + "$ref": "#/definitions/apiGetDishRatingsRequest" } } ], @@ -560,8 +463,7 @@ "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/apiNewDishRatingReply" } }, "default": { @@ -593,7 +495,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/apiSendFeedbackImageReply" + "$ref": "#/definitions/apiSendFeedbackReply" } }, "default": { @@ -848,6 +750,50 @@ ] } }, + "/news/{lastNewsId}": { + "get": { + "operationId": "Campus_GetNews", + "responses": { + "200": { + "description": "", + "schema": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiNewsItem" + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "lastNewsId", + "description": "the last id of the news item received. 0 to get all news items", + "in": "path", + "required": true, + "type": "integer", + "format": "int32" + }, + { + "name": "newsSource", + "description": "filter by news source id. 0 to get all news items", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "tags": [ + "Campus" + ] + } + }, "/notifications/confirm/{notificationId}": { "get": { "operationId": "Campus_GetNotificationConfirm", @@ -855,7 +801,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/apiGetNotificationsConfirmReply" + "$ref": "#/definitions/apiGetNotificationConfirmReply" } }, "default": { @@ -886,7 +832,7 @@ "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/apiGetNotificationsReply" + "$ref": "#/definitions/apiGetNotificationReply" } }, "default": { @@ -984,8 +930,8 @@ "name": "version", "in": "path", "required": true, - "type": "integer", - "format": "int32" + "type": "string", + "format": "int64" } ], "tags": [ @@ -995,21 +941,21 @@ } }, "definitions": { - "apiBuilding2GpsElement": { + "GetMoreInformationReplyMoreInformation": { "type": "object", "properties": { - "id": { + "title": { "type": "string" }, - "latitude": { + "category": { "type": "string" }, - "longitude": { + "url": { "type": "string" } } }, - "apiCafeteria": { + "apiCanteen": { "type": "object", "properties": { "id": { @@ -1028,7 +974,65 @@ } } }, - "apiCafeteriaRatingReply": { + "apiDeviceType": { + "type": "string", + "enum": [ + "IOS", + "ANDROID", + "WINDOWS" + ], + "default": "IOS" + }, + "apiGetAvailableCanteenTagsReply": { + "type": "object", + "properties": { + "ratingTags": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiTagsOverview" + } + } + } + }, + "apiGetAvailableDishTagsReply": { + "type": "object", + "properties": { + "ratingTags": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiTagsOverview" + } + } + } + }, + "apiGetCanteenHeadCountReply": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "format": "int64", + "description": "The absolut count of humans in the canteen. Only valid in case percent != -1." + }, + "maxCount": { + "type": "integer", + "format": "int64", + "description": "The maximum nunmber of humans in the canteen for the percent to be 100.00. Only valid in case percent != -1." + }, + "percent": { + "type": "number", + "format": "float", + "description": "Current capacity utilization of the canteen clamped to 0 and 100 or -1 in case no data is available." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "description": "A time stamp indicating how up to date the response is. Only valid in case percent != -1." + } + } + }, + "apiGetCanteenRatingsReply": { "type": "object", "properties": { "rating": { @@ -1063,12 +1067,12 @@ } } }, - "apiCafeteriaRatingRequest": { + "apiGetCanteenRatingsRequest": { "type": "object", "properties": { - "cafeteriaId": { + "canteenId": { "type": "string", - "title": "cafeteriaId Mandatory Name of the cafeteria (EAT-API naming scheme \"MENSA_GARCHING\")" + "title": "canteenId Mandatory Name of the canteen (EAT-API naming scheme \"MENSA_GARCHING\")" }, "from": { "type": "string", @@ -1087,16 +1091,19 @@ } } }, - "apiDeviceType": { - "type": "string", - "enum": [ - "IOS", - "ANDROID", - "WINDOWS" - ], - "default": "IOS" + "apiGetCanteensReply": { + "type": "object", + "properties": { + "canteen": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/apiCanteen" + } + } + } }, - "apiDishRatingReply": { + "apiGetDishRatingsReply": { "type": "object", "properties": { "rating": { @@ -1138,12 +1145,12 @@ } } }, - "apiDishRatingRequest": { + "apiGetDishRatingsRequest": { "type": "object", "properties": { - "cafeteriaId": { + "canteenId": { "type": "string", - "title": "Mandatory Name of the cafeteria (EAT-API naming scheme \"MENSA_GARCHING\")" + "title": "Mandatory Name of the canteen (EAT-API naming scheme \"MENSA_GARCHING\")" }, "dish": { "type": "string", @@ -1166,142 +1173,93 @@ } } }, - "apiGetAreaFacilitiesByBuildingNrReply": { - "type": "object", - "properties": { - "areaFacilitiesByBuildingNr": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/apiRoomInformationElement" - } - } - } - }, - "apiGetBuilding2GpsReply": { + "apiGetDishesReply": { "type": "object", "properties": { - "building2Gps": { + "dish": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/apiBuilding2GpsElement" + "type": "string" } } } }, - "apiGetCafeteriaReply": { + "apiGetKinoReply": { "type": "object", "properties": { - "cafeteria": { + "kinos": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/apiCafeteria" + "$ref": "#/definitions/apiKinoMsgElement" } } } }, - "apiGetCanteenHeadCountReply": { + "apiGetMembersReply": { "type": "object", "properties": { - "count": { - "type": "integer", - "format": "int64", - "description": "The absolut count of humans in the canteen. Only valid in case percent != -1." - }, - "maxCount": { - "type": "integer", - "format": "int64", - "description": "The maximum nunmber of humans in the canteen for the percent to be 100.00. Only valid in case percent != -1." + "lrzId": { + "type": "string" }, - "percent": { - "type": "number", - "format": "float", - "description": "Current capacity utilization of the canteen clamped to 0 and 100 or -1 in case no data is available." + "name": { + "type": "string" }, - "timestamp": { - "type": "string", - "format": "date-time", - "description": "A time stamp indicating how up to date the response is. Only valid in case percent != -1." - } - } - }, - "apiGetDishesReply": { - "type": "object", - "properties": { - "dish": { - "type": "array", - "items": { - "type": "string" - } + "memberId": { + "type": "integer", + "format": "int32" } } }, - "apiGetKinoReply": { + "apiGetMoreInformationReply": { "type": "object", "properties": { - "kinos": { + "infos": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/apiKinoMsgElement" + "$ref": "#/definitions/GetMoreInformationReplyMoreInformation" } } } }, - "apiGetListOfElevatorsReply": { + "apiGetNameTagsReply": { "type": "object", "properties": { - "listOfElevators": { + "ratingTags": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/apiRoomInformationElement" + "$ref": "#/definitions/apiTagsOverview" } } } }, - "apiGetListOfToiletsReply": { + "apiGetNewsReply": { "type": "object", "properties": { - "listOfToilets": { + "news": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/apiRoomInformationElement" + "$ref": "#/definitions/apiNewsItem" } } } }, - "apiGetMembersReply": { + "apiGetNewsSourcesReply": { "type": "object", "properties": { - "lrzId": { - "type": "string" - }, - "name": { - "type": "string" - }, - "memberId": { - "type": "integer", - "format": "int32" - } - } - }, - "apiGetMoreInformationReply": { - "type": "object", - "properties": { - "information": { + "sources": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/apiMoreInformationElement" + "$ref": "#/definitions/apiNewsSource" } } } }, - "apiGetNotificationsConfirmReply": { + "apiGetNotificationConfirmReply": { "type": "object", "properties": { "status": { @@ -1309,7 +1267,7 @@ } } }, - "apiGetNotificationsReply": { + "apiGetNotificationReply": { "type": "object", "properties": { "notificationId": { @@ -1350,7 +1308,7 @@ "type": "array", "items": { "type": "object", - "$ref": "#/definitions/apiResponsiblePersonElement" + "$ref": "#/definitions/apiResponsiblePerson" } } } @@ -1367,18 +1325,6 @@ } } }, - "apiGetTagsReply": { - "type": "object", - "properties": { - "ratingTags": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/apiTagsOverview" - } - } - } - }, "apiGetTopNewsReply": { "type": "object", "properties": { @@ -1407,6 +1353,9 @@ "properties": { "message": { "type": "string" + }, + "versionName": { + "type": "string" } } }, @@ -1506,21 +1455,10 @@ } } }, - "apiMoreInformationElement": { - "type": "object", - "properties": { - "title": { - "type": "string" - }, - "category": { - "type": "string" - }, - "url": { - "type": "string" - } - } + "apiNewCanteenRatingReply": { + "type": "object" }, - "apiNewCafeteriaRatingRequest": { + "apiNewCanteenRatingRequest": { "type": "object", "properties": { "points": { @@ -1528,7 +1466,7 @@ "format": "int32", "title": "number in the range 1-5" }, - "cafeteriaId": { + "canteenId": { "type": "string" }, "image": { @@ -1541,7 +1479,7 @@ "type": "object", "$ref": "#/definitions/apiRatingTag" }, - "title": "Optional list of tag ratings add as many tags with a rating (1-5) of the list of cafeteriaRatingTags" + "title": "Optional list of tag ratings add as many tags with a rating (1-5) of the list of canteenRatingTags" }, "comment": { "type": "string", @@ -1549,6 +1487,9 @@ } } }, + "apiNewDishRatingReply": { + "type": "object" + }, "apiNewDishRatingRequest": { "type": "object", "properties": { @@ -1557,7 +1498,7 @@ "format": "int32", "title": "number in the range 1-5" }, - "cafeteriaId": { + "canteenId": { "type": "string", "title": "Mandatory Name of the dish (EAT-API naming scheme \"MENSA_GARCHING\") Must be available int the given mensa" }, @@ -1584,29 +1525,45 @@ } } }, - "apiNewsSource": { + "apiNewsItem": { "type": "object", "properties": { - "source": { - "type": "string" + "id": { + "type": "string", + "format": "int64" }, "title": { "type": "string" }, - "icon": { + "text": { + "type": "string" + }, + "link": { + "type": "string" + }, + "imageUrl": { + "type": "string" + }, + "source": { "type": "string" + }, + "created": { + "type": "string", + "format": "date-time" } } }, - "apiNewsSourceReply": { + "apiNewsSource": { "type": "object", "properties": { - "sources": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/apiNewsSource" - } + "source": { + "type": "string" + }, + "title": { + "type": "string" + }, + "icon": { + "type": "string" } } }, @@ -1654,8 +1611,8 @@ "type": "object", "properties": { "tagId": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "int64" }, "points": { "type": "number", @@ -1731,7 +1688,7 @@ } } }, - "apiResponsiblePersonElement": { + "apiResponsiblePerson": { "type": "object", "properties": { "name": { @@ -1746,40 +1703,7 @@ "faculty": { "type": "string" }, - "tumID": { - "type": "string" - } - } - }, - "apiRoomInformationElement": { - "type": "object", - "properties": { - "roomId": { - "type": "integer", - "format": "int32" - }, - "roomCode": { - "type": "string" - }, - "buildingNr": { - "type": "string" - }, - "archId": { - "type": "string" - }, - "info": { - "type": "string" - }, - "address": { - "type": "string" - }, - "purpose": { - "type": "string" - }, - "campus": { - "type": "string" - }, - "name": { + "tumId": { "type": "string" } } @@ -1792,6 +1716,9 @@ } } }, + "apiSendFeedbackReply": { + "type": "object" + }, "apiSingleRatingReply": { "type": "object", "properties": { diff --git a/server/api/tumdev/campus_backend_grpc.pb.go b/server/api/tumdev/campus_backend_grpc.pb.go index af68c745..3d86d8ab 100644 --- a/server/api/tumdev/campus_backend_grpc.pb.go +++ b/server/api/tumdev/campus_backend_grpc.pb.go @@ -8,10 +8,10 @@ package api import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" ) // This is a compile-time assertion to ensure that this generated file @@ -20,81 +20,64 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - Campus_GetTopNews_FullMethodName = "/api.Campus/GetTopNews" - Campus_GetNewsSources_FullMethodName = "/api.Campus/GetNewsSources" - Campus_SearchRooms_FullMethodName = "/api.Campus/SearchRooms" - Campus_GetLocations_FullMethodName = "/api.Campus/GetLocations" - Campus_GetRoomMaps_FullMethodName = "/api.Campus/GetRoomMaps" - Campus_GetRoomCoordinates_FullMethodName = "/api.Campus/GetRoomCoordinates" - Campus_GetRoomSchedule_FullMethodName = "/api.Campus/GetRoomSchedule" - Campus_GetCafeteriaRatings_FullMethodName = "/api.Campus/GetCafeteriaRatings" - Campus_GetDishRatings_FullMethodName = "/api.Campus/GetDishRatings" - Campus_NewCafeteriaRating_FullMethodName = "/api.Campus/NewCafeteriaRating" - Campus_NewDishRating_FullMethodName = "/api.Campus/NewDishRating" - Campus_GetAvailableDishTags_FullMethodName = "/api.Campus/GetAvailableDishTags" - Campus_GetNameTags_FullMethodName = "/api.Campus/GetNameTags" - Campus_GetAvailableCafeteriaTags_FullMethodName = "/api.Campus/GetAvailableCafeteriaTags" - Campus_GetCafeterias_FullMethodName = "/api.Campus/GetCafeterias" - Campus_GetDishes_FullMethodName = "/api.Campus/GetDishes" - Campus_GetResponsiblePerson_FullMethodName = "/api.Campus/GetResponsiblePerson" - Campus_GetBuilding2Gps_FullMethodName = "/api.Campus/GetBuilding2Gps" - Campus_GetAreaFacilitiesByBuildingNr_FullMethodName = "/api.Campus/GetAreaFacilitiesByBuildingNr" - Campus_GetListOfToilets_FullMethodName = "/api.Campus/GetListOfToilets" - Campus_GetListOfElevators_FullMethodName = "/api.Campus/GetListOfElevators" - Campus_GetMoreInformation_FullMethodName = "/api.Campus/GetMoreInformation" - Campus_GetOpeningTimes_FullMethodName = "/api.Campus/GetOpeningTimes" - Campus_GetUpdateNote_FullMethodName = "/api.Campus/GetUpdateNote" - Campus_GetStudyRoomList_FullMethodName = "/api.Campus/GetStudyRoomList" - Campus_GetKino_FullMethodName = "/api.Campus/GetKino" - Campus_SendFeedback_FullMethodName = "/api.Campus/SendFeedback" - Campus_SendFeedbackImage_FullMethodName = "/api.Campus/SendFeedbackImage" - Campus_GetUploadStatus_FullMethodName = "/api.Campus/GetUploadStatus" - Campus_GetNotification_FullMethodName = "/api.Campus/GetNotification" - Campus_GetNotificationConfirm_FullMethodName = "/api.Campus/GetNotificationConfirm" - Campus_GetMembers_FullMethodName = "/api.Campus/GetMembers" - Campus_GetCanteenHeadCount_FullMethodName = "/api.Campus/GetCanteenHeadCount" - Campus_IOSDeviceRequestResponse_FullMethodName = "/api.Campus/IOSDeviceRequestResponse" - Campus_RegisterDevice_FullMethodName = "/api.Campus/RegisterDevice" - Campus_RemoveDevice_FullMethodName = "/api.Campus/RemoveDevice" + Campus_GetTopNews_FullMethodName = "/api.Campus/GetTopNews" + Campus_GetNewsSources_FullMethodName = "/api.Campus/GetNewsSources" + Campus_GetNews_FullMethodName = "/api.Campus/GetNews" + Campus_GetCanteenRatings_FullMethodName = "/api.Campus/GetCanteenRatings" + Campus_GetDishRatings_FullMethodName = "/api.Campus/GetDishRatings" + Campus_NewCanteenRating_FullMethodName = "/api.Campus/NewCanteenRating" + Campus_NewDishRating_FullMethodName = "/api.Campus/NewDishRating" + Campus_GetAvailableDishTags_FullMethodName = "/api.Campus/GetAvailableDishTags" + Campus_GetNameTags_FullMethodName = "/api.Campus/GetNameTags" + Campus_GetAvailableCanteenTags_FullMethodName = "/api.Campus/GetAvailableCanteenTags" + Campus_GetCanteens_FullMethodName = "/api.Campus/GetCanteens" + Campus_GetDishes_FullMethodName = "/api.Campus/GetDishes" + Campus_GetResponsiblePerson_FullMethodName = "/api.Campus/GetResponsiblePerson" + Campus_GetMoreInformation_FullMethodName = "/api.Campus/GetMoreInformation" + Campus_GetOpeningTimes_FullMethodName = "/api.Campus/GetOpeningTimes" + Campus_GetUpdateNote_FullMethodName = "/api.Campus/GetUpdateNote" + Campus_GetStudyRoomList_FullMethodName = "/api.Campus/GetStudyRoomList" + Campus_GetKino_FullMethodName = "/api.Campus/GetKino" + Campus_SendFeedback_FullMethodName = "/api.Campus/SendFeedback" + Campus_SendFeedbackImage_FullMethodName = "/api.Campus/SendFeedbackImage" + Campus_GetUploadStatus_FullMethodName = "/api.Campus/GetUploadStatus" + Campus_GetNotification_FullMethodName = "/api.Campus/GetNotification" + Campus_GetNotificationConfirm_FullMethodName = "/api.Campus/GetNotificationConfirm" + Campus_GetMembers_FullMethodName = "/api.Campus/GetMembers" + Campus_GetCanteenHeadCount_FullMethodName = "/api.Campus/GetCanteenHeadCount" + Campus_IOSDeviceRequestResponse_FullMethodName = "/api.Campus/IOSDeviceRequestResponse" + Campus_RegisterDevice_FullMethodName = "/api.Campus/RegisterDevice" + Campus_RemoveDevice_FullMethodName = "/api.Campus/RemoveDevice" ) // CampusClient is the client API for Campus service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type CampusClient interface { - GetTopNews(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTopNewsReply, error) - GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceReply, error) - SearchRooms(ctx context.Context, in *SearchRoomsRequest, opts ...grpc.CallOption) (*SearchRoomsReply, error) - // a location is a campus location/building, e.g. "Garching Forschungszentrum" - GetLocations(ctx context.Context, in *GetLocationsRequest, opts ...grpc.CallOption) (*GetLocationsReply, error) - GetRoomMaps(ctx context.Context, in *GetRoomMapsRequest, opts ...grpc.CallOption) (*GetRoomMapsReply, error) - GetRoomCoordinates(ctx context.Context, in *GetRoomCoordinatesRequest, opts ...grpc.CallOption) (*GetRoomCoordinatesReply, error) - GetRoomSchedule(ctx context.Context, in *GetRoomScheduleRequest, opts ...grpc.CallOption) (*GetRoomScheduleReply, error) - // This endpoint retrieves Cafeteria Ratings from the Backend. - GetCafeteriaRatings(ctx context.Context, in *CafeteriaRatingRequest, opts ...grpc.CallOption) (*CafeteriaRatingReply, error) - GetDishRatings(ctx context.Context, in *DishRatingRequest, opts ...grpc.CallOption) (*DishRatingReply, error) - NewCafeteriaRating(ctx context.Context, in *NewCafeteriaRatingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - NewDishRating(ctx context.Context, in *NewDishRatingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - GetAvailableDishTags(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTagsReply, error) - GetNameTags(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTagsReply, error) - GetAvailableCafeteriaTags(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTagsReply, error) - GetCafeterias(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetCafeteriaReply, error) + GetTopNews(ctx context.Context, in *GetTopNewsRequest, opts ...grpc.CallOption) (*GetTopNewsReply, error) + GetNewsSources(ctx context.Context, in *GetNewsSourcesRequest, opts ...grpc.CallOption) (*GetNewsSourcesReply, error) + GetNews(ctx context.Context, in *GetNewsRequest, opts ...grpc.CallOption) (*GetNewsReply, error) + // This endpoint retrieves Canteen Ratings from the Backend. + GetCanteenRatings(ctx context.Context, in *GetCanteenRatingsRequest, opts ...grpc.CallOption) (*GetCanteenRatingsReply, error) + GetDishRatings(ctx context.Context, in *GetDishRatingsRequest, opts ...grpc.CallOption) (*GetDishRatingsReply, error) + NewCanteenRating(ctx context.Context, in *NewCanteenRatingRequest, opts ...grpc.CallOption) (*NewCanteenRatingReply, error) + NewDishRating(ctx context.Context, in *NewDishRatingRequest, opts ...grpc.CallOption) (*NewDishRatingReply, error) + GetAvailableDishTags(ctx context.Context, in *GetAvailableDishTagsRequest, opts ...grpc.CallOption) (*GetAvailableDishTagsReply, error) + GetNameTags(ctx context.Context, in *GetNameTagsRequest, opts ...grpc.CallOption) (*GetNameTagsReply, error) + GetAvailableCanteenTags(ctx context.Context, in *GetAvailableCanteenTagsRequest, opts ...grpc.CallOption) (*GetAvailableCanteenTagsReply, error) + GetCanteens(ctx context.Context, in *GetCanteensRequest, opts ...grpc.CallOption) (*GetCanteensReply, error) GetDishes(ctx context.Context, in *GetDishesRequest, opts ...grpc.CallOption) (*GetDishesReply, error) - GetResponsiblePerson(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetResponsiblePersonReply, error) - GetBuilding2Gps(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetBuilding2GpsReply, error) - GetAreaFacilitiesByBuildingNr(ctx context.Context, in *GetAreaFacilitiesByBuildingNrRequest, opts ...grpc.CallOption) (*GetAreaFacilitiesByBuildingNrReply, error) - GetListOfToilets(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetListOfToiletsReply, error) - GetListOfElevators(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetListOfElevatorsReply, error) - GetMoreInformation(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetMoreInformationReply, error) + GetResponsiblePerson(ctx context.Context, in *GetResponsiblePersonRequest, opts ...grpc.CallOption) (*GetResponsiblePersonReply, error) + GetMoreInformation(ctx context.Context, in *GetMoreInformationRequest, opts ...grpc.CallOption) (*GetMoreInformationReply, error) GetOpeningTimes(ctx context.Context, in *GetOpeningTimesRequest, opts ...grpc.CallOption) (*GetOpeningTimesReply, error) GetUpdateNote(ctx context.Context, in *GetUpdateNoteRequest, opts ...grpc.CallOption) (*GetUpdateNoteReply, error) - GetStudyRoomList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetStudyRoomListReply, error) + GetStudyRoomList(ctx context.Context, in *GetStudyRoomListRequest, opts ...grpc.CallOption) (*GetStudyRoomListReply, error) GetKino(ctx context.Context, in *GetKinoRequest, opts ...grpc.CallOption) (*GetKinoReply, error) - SendFeedback(ctx context.Context, in *SendFeedbackRequest, opts ...grpc.CallOption) (*SendFeedbackImageReply, error) + SendFeedback(ctx context.Context, in *SendFeedbackRequest, opts ...grpc.CallOption) (*SendFeedbackReply, error) SendFeedbackImage(ctx context.Context, in *SendFeedbackImageRequest, opts ...grpc.CallOption) (*SendFeedbackImageReply, error) GetUploadStatus(ctx context.Context, in *GetUploadStatusRequest, opts ...grpc.CallOption) (*GetUploadStatusReply, error) - GetNotification(ctx context.Context, in *NotificationsRequest, opts ...grpc.CallOption) (*GetNotificationsReply, error) - GetNotificationConfirm(ctx context.Context, in *NotificationsRequest, opts ...grpc.CallOption) (*GetNotificationsConfirmReply, error) + GetNotification(ctx context.Context, in *GetNotificationRequest, opts ...grpc.CallOption) (*GetNotificationReply, error) + GetNotificationConfirm(ctx context.Context, in *GetNotificationConfirmRequest, opts ...grpc.CallOption) (*GetNotificationConfirmReply, error) GetMembers(ctx context.Context, in *GetMembersRequest, opts ...grpc.CallOption) (*GetMembersReply, error) GetCanteenHeadCount(ctx context.Context, in *GetCanteenHeadCountRequest, opts ...grpc.CallOption) (*GetCanteenHeadCountReply, error) // Endpoint for the iOS app to respond to background notifications requests @@ -113,7 +96,7 @@ func NewCampusClient(cc grpc.ClientConnInterface) CampusClient { return &campusClient{cc} } -func (c *campusClient) GetTopNews(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTopNewsReply, error) { +func (c *campusClient) GetTopNews(ctx context.Context, in *GetTopNewsRequest, opts ...grpc.CallOption) (*GetTopNewsReply, error) { out := new(GetTopNewsReply) err := c.cc.Invoke(ctx, Campus_GetTopNews_FullMethodName, in, out, opts...) if err != nil { @@ -122,8 +105,8 @@ func (c *campusClient) GetTopNews(ctx context.Context, in *emptypb.Empty, opts . return out, nil } -func (c *campusClient) GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceReply, error) { - out := new(NewsSourceReply) +func (c *campusClient) GetNewsSources(ctx context.Context, in *GetNewsSourcesRequest, opts ...grpc.CallOption) (*GetNewsSourcesReply, error) { + out := new(GetNewsSourcesReply) err := c.cc.Invoke(ctx, Campus_GetNewsSources_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -131,62 +114,26 @@ func (c *campusClient) GetNewsSources(ctx context.Context, in *emptypb.Empty, op return out, nil } -func (c *campusClient) SearchRooms(ctx context.Context, in *SearchRoomsRequest, opts ...grpc.CallOption) (*SearchRoomsReply, error) { - out := new(SearchRoomsReply) - err := c.cc.Invoke(ctx, Campus_SearchRooms_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *campusClient) GetLocations(ctx context.Context, in *GetLocationsRequest, opts ...grpc.CallOption) (*GetLocationsReply, error) { - out := new(GetLocationsReply) - err := c.cc.Invoke(ctx, Campus_GetLocations_FullMethodName, in, out, opts...) +func (c *campusClient) GetNews(ctx context.Context, in *GetNewsRequest, opts ...grpc.CallOption) (*GetNewsReply, error) { + out := new(GetNewsReply) + err := c.cc.Invoke(ctx, Campus_GetNews_FullMethodName, in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *campusClient) GetRoomMaps(ctx context.Context, in *GetRoomMapsRequest, opts ...grpc.CallOption) (*GetRoomMapsReply, error) { - out := new(GetRoomMapsReply) - err := c.cc.Invoke(ctx, Campus_GetRoomMaps_FullMethodName, in, out, opts...) +func (c *campusClient) GetCanteenRatings(ctx context.Context, in *GetCanteenRatingsRequest, opts ...grpc.CallOption) (*GetCanteenRatingsReply, error) { + out := new(GetCanteenRatingsReply) + err := c.cc.Invoke(ctx, Campus_GetCanteenRatings_FullMethodName, in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *campusClient) GetRoomCoordinates(ctx context.Context, in *GetRoomCoordinatesRequest, opts ...grpc.CallOption) (*GetRoomCoordinatesReply, error) { - out := new(GetRoomCoordinatesReply) - err := c.cc.Invoke(ctx, Campus_GetRoomCoordinates_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *campusClient) GetRoomSchedule(ctx context.Context, in *GetRoomScheduleRequest, opts ...grpc.CallOption) (*GetRoomScheduleReply, error) { - out := new(GetRoomScheduleReply) - err := c.cc.Invoke(ctx, Campus_GetRoomSchedule_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *campusClient) GetCafeteriaRatings(ctx context.Context, in *CafeteriaRatingRequest, opts ...grpc.CallOption) (*CafeteriaRatingReply, error) { - out := new(CafeteriaRatingReply) - err := c.cc.Invoke(ctx, Campus_GetCafeteriaRatings_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *campusClient) GetDishRatings(ctx context.Context, in *DishRatingRequest, opts ...grpc.CallOption) (*DishRatingReply, error) { - out := new(DishRatingReply) +func (c *campusClient) GetDishRatings(ctx context.Context, in *GetDishRatingsRequest, opts ...grpc.CallOption) (*GetDishRatingsReply, error) { + out := new(GetDishRatingsReply) err := c.cc.Invoke(ctx, Campus_GetDishRatings_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -194,17 +141,17 @@ func (c *campusClient) GetDishRatings(ctx context.Context, in *DishRatingRequest return out, nil } -func (c *campusClient) NewCafeteriaRating(ctx context.Context, in *NewCafeteriaRatingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Campus_NewCafeteriaRating_FullMethodName, in, out, opts...) +func (c *campusClient) NewCanteenRating(ctx context.Context, in *NewCanteenRatingRequest, opts ...grpc.CallOption) (*NewCanteenRatingReply, error) { + out := new(NewCanteenRatingReply) + err := c.cc.Invoke(ctx, Campus_NewCanteenRating_FullMethodName, in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *campusClient) NewDishRating(ctx context.Context, in *NewDishRatingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) +func (c *campusClient) NewDishRating(ctx context.Context, in *NewDishRatingRequest, opts ...grpc.CallOption) (*NewDishRatingReply, error) { + out := new(NewDishRatingReply) err := c.cc.Invoke(ctx, Campus_NewDishRating_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -212,8 +159,8 @@ func (c *campusClient) NewDishRating(ctx context.Context, in *NewDishRatingReque return out, nil } -func (c *campusClient) GetAvailableDishTags(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTagsReply, error) { - out := new(GetTagsReply) +func (c *campusClient) GetAvailableDishTags(ctx context.Context, in *GetAvailableDishTagsRequest, opts ...grpc.CallOption) (*GetAvailableDishTagsReply, error) { + out := new(GetAvailableDishTagsReply) err := c.cc.Invoke(ctx, Campus_GetAvailableDishTags_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -221,8 +168,8 @@ func (c *campusClient) GetAvailableDishTags(ctx context.Context, in *emptypb.Emp return out, nil } -func (c *campusClient) GetNameTags(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTagsReply, error) { - out := new(GetTagsReply) +func (c *campusClient) GetNameTags(ctx context.Context, in *GetNameTagsRequest, opts ...grpc.CallOption) (*GetNameTagsReply, error) { + out := new(GetNameTagsReply) err := c.cc.Invoke(ctx, Campus_GetNameTags_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -230,18 +177,18 @@ func (c *campusClient) GetNameTags(ctx context.Context, in *emptypb.Empty, opts return out, nil } -func (c *campusClient) GetAvailableCafeteriaTags(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTagsReply, error) { - out := new(GetTagsReply) - err := c.cc.Invoke(ctx, Campus_GetAvailableCafeteriaTags_FullMethodName, in, out, opts...) +func (c *campusClient) GetAvailableCanteenTags(ctx context.Context, in *GetAvailableCanteenTagsRequest, opts ...grpc.CallOption) (*GetAvailableCanteenTagsReply, error) { + out := new(GetAvailableCanteenTagsReply) + err := c.cc.Invoke(ctx, Campus_GetAvailableCanteenTags_FullMethodName, in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *campusClient) GetCafeterias(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetCafeteriaReply, error) { - out := new(GetCafeteriaReply) - err := c.cc.Invoke(ctx, Campus_GetCafeterias_FullMethodName, in, out, opts...) +func (c *campusClient) GetCanteens(ctx context.Context, in *GetCanteensRequest, opts ...grpc.CallOption) (*GetCanteensReply, error) { + out := new(GetCanteensReply) + err := c.cc.Invoke(ctx, Campus_GetCanteens_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -257,7 +204,7 @@ func (c *campusClient) GetDishes(ctx context.Context, in *GetDishesRequest, opts return out, nil } -func (c *campusClient) GetResponsiblePerson(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetResponsiblePersonReply, error) { +func (c *campusClient) GetResponsiblePerson(ctx context.Context, in *GetResponsiblePersonRequest, opts ...grpc.CallOption) (*GetResponsiblePersonReply, error) { out := new(GetResponsiblePersonReply) err := c.cc.Invoke(ctx, Campus_GetResponsiblePerson_FullMethodName, in, out, opts...) if err != nil { @@ -266,43 +213,7 @@ func (c *campusClient) GetResponsiblePerson(ctx context.Context, in *emptypb.Emp return out, nil } -func (c *campusClient) GetBuilding2Gps(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetBuilding2GpsReply, error) { - out := new(GetBuilding2GpsReply) - err := c.cc.Invoke(ctx, Campus_GetBuilding2Gps_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *campusClient) GetAreaFacilitiesByBuildingNr(ctx context.Context, in *GetAreaFacilitiesByBuildingNrRequest, opts ...grpc.CallOption) (*GetAreaFacilitiesByBuildingNrReply, error) { - out := new(GetAreaFacilitiesByBuildingNrReply) - err := c.cc.Invoke(ctx, Campus_GetAreaFacilitiesByBuildingNr_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *campusClient) GetListOfToilets(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetListOfToiletsReply, error) { - out := new(GetListOfToiletsReply) - err := c.cc.Invoke(ctx, Campus_GetListOfToilets_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *campusClient) GetListOfElevators(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetListOfElevatorsReply, error) { - out := new(GetListOfElevatorsReply) - err := c.cc.Invoke(ctx, Campus_GetListOfElevators_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *campusClient) GetMoreInformation(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetMoreInformationReply, error) { +func (c *campusClient) GetMoreInformation(ctx context.Context, in *GetMoreInformationRequest, opts ...grpc.CallOption) (*GetMoreInformationReply, error) { out := new(GetMoreInformationReply) err := c.cc.Invoke(ctx, Campus_GetMoreInformation_FullMethodName, in, out, opts...) if err != nil { @@ -329,7 +240,7 @@ func (c *campusClient) GetUpdateNote(ctx context.Context, in *GetUpdateNoteReque return out, nil } -func (c *campusClient) GetStudyRoomList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetStudyRoomListReply, error) { +func (c *campusClient) GetStudyRoomList(ctx context.Context, in *GetStudyRoomListRequest, opts ...grpc.CallOption) (*GetStudyRoomListReply, error) { out := new(GetStudyRoomListReply) err := c.cc.Invoke(ctx, Campus_GetStudyRoomList_FullMethodName, in, out, opts...) if err != nil { @@ -347,8 +258,8 @@ func (c *campusClient) GetKino(ctx context.Context, in *GetKinoRequest, opts ... return out, nil } -func (c *campusClient) SendFeedback(ctx context.Context, in *SendFeedbackRequest, opts ...grpc.CallOption) (*SendFeedbackImageReply, error) { - out := new(SendFeedbackImageReply) +func (c *campusClient) SendFeedback(ctx context.Context, in *SendFeedbackRequest, opts ...grpc.CallOption) (*SendFeedbackReply, error) { + out := new(SendFeedbackReply) err := c.cc.Invoke(ctx, Campus_SendFeedback_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -374,8 +285,8 @@ func (c *campusClient) GetUploadStatus(ctx context.Context, in *GetUploadStatusR return out, nil } -func (c *campusClient) GetNotification(ctx context.Context, in *NotificationsRequest, opts ...grpc.CallOption) (*GetNotificationsReply, error) { - out := new(GetNotificationsReply) +func (c *campusClient) GetNotification(ctx context.Context, in *GetNotificationRequest, opts ...grpc.CallOption) (*GetNotificationReply, error) { + out := new(GetNotificationReply) err := c.cc.Invoke(ctx, Campus_GetNotification_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -383,8 +294,8 @@ func (c *campusClient) GetNotification(ctx context.Context, in *NotificationsReq return out, nil } -func (c *campusClient) GetNotificationConfirm(ctx context.Context, in *NotificationsRequest, opts ...grpc.CallOption) (*GetNotificationsConfirmReply, error) { - out := new(GetNotificationsConfirmReply) +func (c *campusClient) GetNotificationConfirm(ctx context.Context, in *GetNotificationConfirmRequest, opts ...grpc.CallOption) (*GetNotificationConfirmReply, error) { + out := new(GetNotificationConfirmReply) err := c.cc.Invoke(ctx, Campus_GetNotificationConfirm_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -441,39 +352,30 @@ func (c *campusClient) RemoveDevice(ctx context.Context, in *RemoveDeviceRequest // All implementations must embed UnimplementedCampusServer // for forward compatibility type CampusServer interface { - GetTopNews(context.Context, *emptypb.Empty) (*GetTopNewsReply, error) - GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceReply, error) - SearchRooms(context.Context, *SearchRoomsRequest) (*SearchRoomsReply, error) - // a location is a campus location/building, e.g. "Garching Forschungszentrum" - GetLocations(context.Context, *GetLocationsRequest) (*GetLocationsReply, error) - GetRoomMaps(context.Context, *GetRoomMapsRequest) (*GetRoomMapsReply, error) - GetRoomCoordinates(context.Context, *GetRoomCoordinatesRequest) (*GetRoomCoordinatesReply, error) - GetRoomSchedule(context.Context, *GetRoomScheduleRequest) (*GetRoomScheduleReply, error) - // This endpoint retrieves Cafeteria Ratings from the Backend. - GetCafeteriaRatings(context.Context, *CafeteriaRatingRequest) (*CafeteriaRatingReply, error) - GetDishRatings(context.Context, *DishRatingRequest) (*DishRatingReply, error) - NewCafeteriaRating(context.Context, *NewCafeteriaRatingRequest) (*emptypb.Empty, error) - NewDishRating(context.Context, *NewDishRatingRequest) (*emptypb.Empty, error) - GetAvailableDishTags(context.Context, *emptypb.Empty) (*GetTagsReply, error) - GetNameTags(context.Context, *emptypb.Empty) (*GetTagsReply, error) - GetAvailableCafeteriaTags(context.Context, *emptypb.Empty) (*GetTagsReply, error) - GetCafeterias(context.Context, *emptypb.Empty) (*GetCafeteriaReply, error) + GetTopNews(context.Context, *GetTopNewsRequest) (*GetTopNewsReply, error) + GetNewsSources(context.Context, *GetNewsSourcesRequest) (*GetNewsSourcesReply, error) + GetNews(context.Context, *GetNewsRequest) (*GetNewsReply, error) + // This endpoint retrieves Canteen Ratings from the Backend. + GetCanteenRatings(context.Context, *GetCanteenRatingsRequest) (*GetCanteenRatingsReply, error) + GetDishRatings(context.Context, *GetDishRatingsRequest) (*GetDishRatingsReply, error) + NewCanteenRating(context.Context, *NewCanteenRatingRequest) (*NewCanteenRatingReply, error) + NewDishRating(context.Context, *NewDishRatingRequest) (*NewDishRatingReply, error) + GetAvailableDishTags(context.Context, *GetAvailableDishTagsRequest) (*GetAvailableDishTagsReply, error) + GetNameTags(context.Context, *GetNameTagsRequest) (*GetNameTagsReply, error) + GetAvailableCanteenTags(context.Context, *GetAvailableCanteenTagsRequest) (*GetAvailableCanteenTagsReply, error) + GetCanteens(context.Context, *GetCanteensRequest) (*GetCanteensReply, error) GetDishes(context.Context, *GetDishesRequest) (*GetDishesReply, error) - GetResponsiblePerson(context.Context, *emptypb.Empty) (*GetResponsiblePersonReply, error) - GetBuilding2Gps(context.Context, *emptypb.Empty) (*GetBuilding2GpsReply, error) - GetAreaFacilitiesByBuildingNr(context.Context, *GetAreaFacilitiesByBuildingNrRequest) (*GetAreaFacilitiesByBuildingNrReply, error) - GetListOfToilets(context.Context, *emptypb.Empty) (*GetListOfToiletsReply, error) - GetListOfElevators(context.Context, *emptypb.Empty) (*GetListOfElevatorsReply, error) - GetMoreInformation(context.Context, *emptypb.Empty) (*GetMoreInformationReply, error) + GetResponsiblePerson(context.Context, *GetResponsiblePersonRequest) (*GetResponsiblePersonReply, error) + GetMoreInformation(context.Context, *GetMoreInformationRequest) (*GetMoreInformationReply, error) GetOpeningTimes(context.Context, *GetOpeningTimesRequest) (*GetOpeningTimesReply, error) GetUpdateNote(context.Context, *GetUpdateNoteRequest) (*GetUpdateNoteReply, error) - GetStudyRoomList(context.Context, *emptypb.Empty) (*GetStudyRoomListReply, error) + GetStudyRoomList(context.Context, *GetStudyRoomListRequest) (*GetStudyRoomListReply, error) GetKino(context.Context, *GetKinoRequest) (*GetKinoReply, error) - SendFeedback(context.Context, *SendFeedbackRequest) (*SendFeedbackImageReply, error) + SendFeedback(context.Context, *SendFeedbackRequest) (*SendFeedbackReply, error) SendFeedbackImage(context.Context, *SendFeedbackImageRequest) (*SendFeedbackImageReply, error) GetUploadStatus(context.Context, *GetUploadStatusRequest) (*GetUploadStatusReply, error) - GetNotification(context.Context, *NotificationsRequest) (*GetNotificationsReply, error) - GetNotificationConfirm(context.Context, *NotificationsRequest) (*GetNotificationsConfirmReply, error) + GetNotification(context.Context, *GetNotificationRequest) (*GetNotificationReply, error) + GetNotificationConfirm(context.Context, *GetNotificationConfirmRequest) (*GetNotificationConfirmReply, error) GetMembers(context.Context, *GetMembersRequest) (*GetMembersReply, error) GetCanteenHeadCount(context.Context, *GetCanteenHeadCountRequest) (*GetCanteenHeadCountReply, error) // Endpoint for the iOS app to respond to background notifications requests @@ -489,70 +391,46 @@ type CampusServer interface { type UnimplementedCampusServer struct { } -func (UnimplementedCampusServer) GetTopNews(context.Context, *emptypb.Empty) (*GetTopNewsReply, error) { +func (UnimplementedCampusServer) GetTopNews(context.Context, *GetTopNewsRequest) (*GetTopNewsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTopNews not implemented") } -func (UnimplementedCampusServer) GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceReply, error) { +func (UnimplementedCampusServer) GetNewsSources(context.Context, *GetNewsSourcesRequest) (*GetNewsSourcesReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNewsSources not implemented") } -func (UnimplementedCampusServer) SearchRooms(context.Context, *SearchRoomsRequest) (*SearchRoomsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SearchRooms not implemented") -} -func (UnimplementedCampusServer) GetLocations(context.Context, *GetLocationsRequest) (*GetLocationsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetLocations not implemented") +func (UnimplementedCampusServer) GetNews(context.Context, *GetNewsRequest) (*GetNewsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetNews not implemented") } -func (UnimplementedCampusServer) GetRoomMaps(context.Context, *GetRoomMapsRequest) (*GetRoomMapsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoomMaps not implemented") +func (UnimplementedCampusServer) GetCanteenRatings(context.Context, *GetCanteenRatingsRequest) (*GetCanteenRatingsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetCanteenRatings not implemented") } -func (UnimplementedCampusServer) GetRoomCoordinates(context.Context, *GetRoomCoordinatesRequest) (*GetRoomCoordinatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoomCoordinates not implemented") -} -func (UnimplementedCampusServer) GetRoomSchedule(context.Context, *GetRoomScheduleRequest) (*GetRoomScheduleReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoomSchedule not implemented") -} -func (UnimplementedCampusServer) GetCafeteriaRatings(context.Context, *CafeteriaRatingRequest) (*CafeteriaRatingReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetCafeteriaRatings not implemented") -} -func (UnimplementedCampusServer) GetDishRatings(context.Context, *DishRatingRequest) (*DishRatingReply, error) { +func (UnimplementedCampusServer) GetDishRatings(context.Context, *GetDishRatingsRequest) (*GetDishRatingsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDishRatings not implemented") } -func (UnimplementedCampusServer) NewCafeteriaRating(context.Context, *NewCafeteriaRatingRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewCafeteriaRating not implemented") +func (UnimplementedCampusServer) NewCanteenRating(context.Context, *NewCanteenRatingRequest) (*NewCanteenRatingReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewCanteenRating not implemented") } -func (UnimplementedCampusServer) NewDishRating(context.Context, *NewDishRatingRequest) (*emptypb.Empty, error) { +func (UnimplementedCampusServer) NewDishRating(context.Context, *NewDishRatingRequest) (*NewDishRatingReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewDishRating not implemented") } -func (UnimplementedCampusServer) GetAvailableDishTags(context.Context, *emptypb.Empty) (*GetTagsReply, error) { +func (UnimplementedCampusServer) GetAvailableDishTags(context.Context, *GetAvailableDishTagsRequest) (*GetAvailableDishTagsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAvailableDishTags not implemented") } -func (UnimplementedCampusServer) GetNameTags(context.Context, *emptypb.Empty) (*GetTagsReply, error) { +func (UnimplementedCampusServer) GetNameTags(context.Context, *GetNameTagsRequest) (*GetNameTagsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNameTags not implemented") } -func (UnimplementedCampusServer) GetAvailableCafeteriaTags(context.Context, *emptypb.Empty) (*GetTagsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAvailableCafeteriaTags not implemented") +func (UnimplementedCampusServer) GetAvailableCanteenTags(context.Context, *GetAvailableCanteenTagsRequest) (*GetAvailableCanteenTagsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAvailableCanteenTags not implemented") } -func (UnimplementedCampusServer) GetCafeterias(context.Context, *emptypb.Empty) (*GetCafeteriaReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetCafeterias not implemented") +func (UnimplementedCampusServer) GetCanteens(context.Context, *GetCanteensRequest) (*GetCanteensReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetCanteens not implemented") } func (UnimplementedCampusServer) GetDishes(context.Context, *GetDishesRequest) (*GetDishesReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDishes not implemented") } -func (UnimplementedCampusServer) GetResponsiblePerson(context.Context, *emptypb.Empty) (*GetResponsiblePersonReply, error) { +func (UnimplementedCampusServer) GetResponsiblePerson(context.Context, *GetResponsiblePersonRequest) (*GetResponsiblePersonReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetResponsiblePerson not implemented") } -func (UnimplementedCampusServer) GetBuilding2Gps(context.Context, *emptypb.Empty) (*GetBuilding2GpsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetBuilding2Gps not implemented") -} -func (UnimplementedCampusServer) GetAreaFacilitiesByBuildingNr(context.Context, *GetAreaFacilitiesByBuildingNrRequest) (*GetAreaFacilitiesByBuildingNrReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAreaFacilitiesByBuildingNr not implemented") -} -func (UnimplementedCampusServer) GetListOfToilets(context.Context, *emptypb.Empty) (*GetListOfToiletsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetListOfToilets not implemented") -} -func (UnimplementedCampusServer) GetListOfElevators(context.Context, *emptypb.Empty) (*GetListOfElevatorsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetListOfElevators not implemented") -} -func (UnimplementedCampusServer) GetMoreInformation(context.Context, *emptypb.Empty) (*GetMoreInformationReply, error) { +func (UnimplementedCampusServer) GetMoreInformation(context.Context, *GetMoreInformationRequest) (*GetMoreInformationReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetMoreInformation not implemented") } func (UnimplementedCampusServer) GetOpeningTimes(context.Context, *GetOpeningTimesRequest) (*GetOpeningTimesReply, error) { @@ -561,13 +439,13 @@ func (UnimplementedCampusServer) GetOpeningTimes(context.Context, *GetOpeningTim func (UnimplementedCampusServer) GetUpdateNote(context.Context, *GetUpdateNoteRequest) (*GetUpdateNoteReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetUpdateNote not implemented") } -func (UnimplementedCampusServer) GetStudyRoomList(context.Context, *emptypb.Empty) (*GetStudyRoomListReply, error) { +func (UnimplementedCampusServer) GetStudyRoomList(context.Context, *GetStudyRoomListRequest) (*GetStudyRoomListReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetStudyRoomList not implemented") } func (UnimplementedCampusServer) GetKino(context.Context, *GetKinoRequest) (*GetKinoReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetKino not implemented") } -func (UnimplementedCampusServer) SendFeedback(context.Context, *SendFeedbackRequest) (*SendFeedbackImageReply, error) { +func (UnimplementedCampusServer) SendFeedback(context.Context, *SendFeedbackRequest) (*SendFeedbackReply, error) { return nil, status.Errorf(codes.Unimplemented, "method SendFeedback not implemented") } func (UnimplementedCampusServer) SendFeedbackImage(context.Context, *SendFeedbackImageRequest) (*SendFeedbackImageReply, error) { @@ -576,10 +454,10 @@ func (UnimplementedCampusServer) SendFeedbackImage(context.Context, *SendFeedbac func (UnimplementedCampusServer) GetUploadStatus(context.Context, *GetUploadStatusRequest) (*GetUploadStatusReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetUploadStatus not implemented") } -func (UnimplementedCampusServer) GetNotification(context.Context, *NotificationsRequest) (*GetNotificationsReply, error) { +func (UnimplementedCampusServer) GetNotification(context.Context, *GetNotificationRequest) (*GetNotificationReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNotification not implemented") } -func (UnimplementedCampusServer) GetNotificationConfirm(context.Context, *NotificationsRequest) (*GetNotificationsConfirmReply, error) { +func (UnimplementedCampusServer) GetNotificationConfirm(context.Context, *GetNotificationConfirmRequest) (*GetNotificationConfirmReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNotificationConfirm not implemented") } func (UnimplementedCampusServer) GetMembers(context.Context, *GetMembersRequest) (*GetMembersReply, error) { @@ -611,7 +489,7 @@ func RegisterCampusServer(s grpc.ServiceRegistrar, srv CampusServer) { } func _Campus_GetTopNews_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(GetTopNewsRequest) if err := dec(in); err != nil { return nil, err } @@ -623,13 +501,13 @@ func _Campus_GetTopNews_Handler(srv interface{}, ctx context.Context, dec func(i FullMethod: Campus_GetTopNews_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetTopNews(ctx, req.(*emptypb.Empty)) + return srv.(CampusServer).GetTopNews(ctx, req.(*GetTopNewsRequest)) } return interceptor(ctx, in, info, handler) } func _Campus_GetNewsSources_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(GetNewsSourcesRequest) if err := dec(in); err != nil { return nil, err } @@ -641,121 +519,49 @@ func _Campus_GetNewsSources_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: Campus_GetNewsSources_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetNewsSources(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Campus_SearchRooms_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SearchRoomsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CampusServer).SearchRooms(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Campus_SearchRooms_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).SearchRooms(ctx, req.(*SearchRoomsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Campus_GetLocations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetLocationsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CampusServer).GetLocations(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Campus_GetLocations_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetLocations(ctx, req.(*GetLocationsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Campus_GetRoomMaps_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRoomMapsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CampusServer).GetRoomMaps(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Campus_GetRoomMaps_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetRoomMaps(ctx, req.(*GetRoomMapsRequest)) + return srv.(CampusServer).GetNewsSources(ctx, req.(*GetNewsSourcesRequest)) } return interceptor(ctx, in, info, handler) } -func _Campus_GetRoomCoordinates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRoomCoordinatesRequest) +func _Campus_GetNews_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetNewsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CampusServer).GetRoomCoordinates(ctx, in) + return srv.(CampusServer).GetNews(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Campus_GetRoomCoordinates_FullMethodName, + FullMethod: Campus_GetNews_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetRoomCoordinates(ctx, req.(*GetRoomCoordinatesRequest)) + return srv.(CampusServer).GetNews(ctx, req.(*GetNewsRequest)) } return interceptor(ctx, in, info, handler) } -func _Campus_GetRoomSchedule_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRoomScheduleRequest) +func _Campus_GetCanteenRatings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCanteenRatingsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CampusServer).GetRoomSchedule(ctx, in) + return srv.(CampusServer).GetCanteenRatings(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Campus_GetRoomSchedule_FullMethodName, + FullMethod: Campus_GetCanteenRatings_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetRoomSchedule(ctx, req.(*GetRoomScheduleRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Campus_GetCafeteriaRatings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CafeteriaRatingRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CampusServer).GetCafeteriaRatings(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Campus_GetCafeteriaRatings_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetCafeteriaRatings(ctx, req.(*CafeteriaRatingRequest)) + return srv.(CampusServer).GetCanteenRatings(ctx, req.(*GetCanteenRatingsRequest)) } return interceptor(ctx, in, info, handler) } func _Campus_GetDishRatings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DishRatingRequest) + in := new(GetDishRatingsRequest) if err := dec(in); err != nil { return nil, err } @@ -767,25 +573,25 @@ func _Campus_GetDishRatings_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: Campus_GetDishRatings_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetDishRatings(ctx, req.(*DishRatingRequest)) + return srv.(CampusServer).GetDishRatings(ctx, req.(*GetDishRatingsRequest)) } return interceptor(ctx, in, info, handler) } -func _Campus_NewCafeteriaRating_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewCafeteriaRatingRequest) +func _Campus_NewCanteenRating_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewCanteenRatingRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CampusServer).NewCafeteriaRating(ctx, in) + return srv.(CampusServer).NewCanteenRating(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Campus_NewCafeteriaRating_FullMethodName, + FullMethod: Campus_NewCanteenRating_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).NewCafeteriaRating(ctx, req.(*NewCafeteriaRatingRequest)) + return srv.(CampusServer).NewCanteenRating(ctx, req.(*NewCanteenRatingRequest)) } return interceptor(ctx, in, info, handler) } @@ -809,7 +615,7 @@ func _Campus_NewDishRating_Handler(srv interface{}, ctx context.Context, dec fun } func _Campus_GetAvailableDishTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(GetAvailableDishTagsRequest) if err := dec(in); err != nil { return nil, err } @@ -821,13 +627,13 @@ func _Campus_GetAvailableDishTags_Handler(srv interface{}, ctx context.Context, FullMethod: Campus_GetAvailableDishTags_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetAvailableDishTags(ctx, req.(*emptypb.Empty)) + return srv.(CampusServer).GetAvailableDishTags(ctx, req.(*GetAvailableDishTagsRequest)) } return interceptor(ctx, in, info, handler) } func _Campus_GetNameTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(GetNameTagsRequest) if err := dec(in); err != nil { return nil, err } @@ -839,43 +645,43 @@ func _Campus_GetNameTags_Handler(srv interface{}, ctx context.Context, dec func( FullMethod: Campus_GetNameTags_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetNameTags(ctx, req.(*emptypb.Empty)) + return srv.(CampusServer).GetNameTags(ctx, req.(*GetNameTagsRequest)) } return interceptor(ctx, in, info, handler) } -func _Campus_GetAvailableCafeteriaTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) +func _Campus_GetAvailableCanteenTags_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAvailableCanteenTagsRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CampusServer).GetAvailableCafeteriaTags(ctx, in) + return srv.(CampusServer).GetAvailableCanteenTags(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Campus_GetAvailableCafeteriaTags_FullMethodName, + FullMethod: Campus_GetAvailableCanteenTags_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetAvailableCafeteriaTags(ctx, req.(*emptypb.Empty)) + return srv.(CampusServer).GetAvailableCanteenTags(ctx, req.(*GetAvailableCanteenTagsRequest)) } return interceptor(ctx, in, info, handler) } -func _Campus_GetCafeterias_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) +func _Campus_GetCanteens_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCanteensRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CampusServer).GetCafeterias(ctx, in) + return srv.(CampusServer).GetCanteens(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: Campus_GetCafeterias_FullMethodName, + FullMethod: Campus_GetCanteens_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetCafeterias(ctx, req.(*emptypb.Empty)) + return srv.(CampusServer).GetCanteens(ctx, req.(*GetCanteensRequest)) } return interceptor(ctx, in, info, handler) } @@ -899,7 +705,7 @@ func _Campus_GetDishes_Handler(srv interface{}, ctx context.Context, dec func(in } func _Campus_GetResponsiblePerson_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(GetResponsiblePersonRequest) if err := dec(in); err != nil { return nil, err } @@ -911,85 +717,13 @@ func _Campus_GetResponsiblePerson_Handler(srv interface{}, ctx context.Context, FullMethod: Campus_GetResponsiblePerson_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetResponsiblePerson(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Campus_GetBuilding2Gps_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CampusServer).GetBuilding2Gps(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Campus_GetBuilding2Gps_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetBuilding2Gps(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Campus_GetAreaFacilitiesByBuildingNr_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetAreaFacilitiesByBuildingNrRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CampusServer).GetAreaFacilitiesByBuildingNr(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Campus_GetAreaFacilitiesByBuildingNr_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetAreaFacilitiesByBuildingNr(ctx, req.(*GetAreaFacilitiesByBuildingNrRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Campus_GetListOfToilets_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CampusServer).GetListOfToilets(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Campus_GetListOfToilets_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetListOfToilets(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Campus_GetListOfElevators_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CampusServer).GetListOfElevators(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Campus_GetListOfElevators_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetListOfElevators(ctx, req.(*emptypb.Empty)) + return srv.(CampusServer).GetResponsiblePerson(ctx, req.(*GetResponsiblePersonRequest)) } return interceptor(ctx, in, info, handler) } func _Campus_GetMoreInformation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(GetMoreInformationRequest) if err := dec(in); err != nil { return nil, err } @@ -1001,7 +735,7 @@ func _Campus_GetMoreInformation_Handler(srv interface{}, ctx context.Context, de FullMethod: Campus_GetMoreInformation_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetMoreInformation(ctx, req.(*emptypb.Empty)) + return srv.(CampusServer).GetMoreInformation(ctx, req.(*GetMoreInformationRequest)) } return interceptor(ctx, in, info, handler) } @@ -1043,7 +777,7 @@ func _Campus_GetUpdateNote_Handler(srv interface{}, ctx context.Context, dec fun } func _Campus_GetStudyRoomList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) + in := new(GetStudyRoomListRequest) if err := dec(in); err != nil { return nil, err } @@ -1055,7 +789,7 @@ func _Campus_GetStudyRoomList_Handler(srv interface{}, ctx context.Context, dec FullMethod: Campus_GetStudyRoomList_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetStudyRoomList(ctx, req.(*emptypb.Empty)) + return srv.(CampusServer).GetStudyRoomList(ctx, req.(*GetStudyRoomListRequest)) } return interceptor(ctx, in, info, handler) } @@ -1133,7 +867,7 @@ func _Campus_GetUploadStatus_Handler(srv interface{}, ctx context.Context, dec f } func _Campus_GetNotification_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NotificationsRequest) + in := new(GetNotificationRequest) if err := dec(in); err != nil { return nil, err } @@ -1145,13 +879,13 @@ func _Campus_GetNotification_Handler(srv interface{}, ctx context.Context, dec f FullMethod: Campus_GetNotification_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetNotification(ctx, req.(*NotificationsRequest)) + return srv.(CampusServer).GetNotification(ctx, req.(*GetNotificationRequest)) } return interceptor(ctx, in, info, handler) } func _Campus_GetNotificationConfirm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NotificationsRequest) + in := new(GetNotificationConfirmRequest) if err := dec(in); err != nil { return nil, err } @@ -1163,7 +897,7 @@ func _Campus_GetNotificationConfirm_Handler(srv interface{}, ctx context.Context FullMethod: Campus_GetNotificationConfirm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).GetNotificationConfirm(ctx, req.(*NotificationsRequest)) + return srv.(CampusServer).GetNotificationConfirm(ctx, req.(*GetNotificationConfirmRequest)) } return interceptor(ctx, in, info, handler) } @@ -1274,36 +1008,20 @@ var Campus_ServiceDesc = grpc.ServiceDesc{ Handler: _Campus_GetNewsSources_Handler, }, { - MethodName: "SearchRooms", - Handler: _Campus_SearchRooms_Handler, - }, - { - MethodName: "GetLocations", - Handler: _Campus_GetLocations_Handler, - }, - { - MethodName: "GetRoomMaps", - Handler: _Campus_GetRoomMaps_Handler, - }, - { - MethodName: "GetRoomCoordinates", - Handler: _Campus_GetRoomCoordinates_Handler, - }, - { - MethodName: "GetRoomSchedule", - Handler: _Campus_GetRoomSchedule_Handler, + MethodName: "GetNews", + Handler: _Campus_GetNews_Handler, }, { - MethodName: "GetCafeteriaRatings", - Handler: _Campus_GetCafeteriaRatings_Handler, + MethodName: "GetCanteenRatings", + Handler: _Campus_GetCanteenRatings_Handler, }, { MethodName: "GetDishRatings", Handler: _Campus_GetDishRatings_Handler, }, { - MethodName: "NewCafeteriaRating", - Handler: _Campus_NewCafeteriaRating_Handler, + MethodName: "NewCanteenRating", + Handler: _Campus_NewCanteenRating_Handler, }, { MethodName: "NewDishRating", @@ -1318,12 +1036,12 @@ var Campus_ServiceDesc = grpc.ServiceDesc{ Handler: _Campus_GetNameTags_Handler, }, { - MethodName: "GetAvailableCafeteriaTags", - Handler: _Campus_GetAvailableCafeteriaTags_Handler, + MethodName: "GetAvailableCanteenTags", + Handler: _Campus_GetAvailableCanteenTags_Handler, }, { - MethodName: "GetCafeterias", - Handler: _Campus_GetCafeterias_Handler, + MethodName: "GetCanteens", + Handler: _Campus_GetCanteens_Handler, }, { MethodName: "GetDishes", @@ -1333,22 +1051,6 @@ var Campus_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetResponsiblePerson", Handler: _Campus_GetResponsiblePerson_Handler, }, - { - MethodName: "GetBuilding2Gps", - Handler: _Campus_GetBuilding2Gps_Handler, - }, - { - MethodName: "GetAreaFacilitiesByBuildingNr", - Handler: _Campus_GetAreaFacilitiesByBuildingNr_Handler, - }, - { - MethodName: "GetListOfToilets", - Handler: _Campus_GetListOfToilets_Handler, - }, - { - MethodName: "GetListOfElevators", - Handler: _Campus_GetListOfElevators_Handler, - }, { MethodName: "GetMoreInformation", Handler: _Campus_GetMoreInformation_Handler, diff --git a/server/backend/cafeteriaRatingDBInitializer.go b/server/backend/cafeteriaRatingDBInitializer.go index 500a93d4..3a0eade6 100644 --- a/server/backend/cafeteriaRatingDBInitializer.go +++ b/server/backend/cafeteriaRatingDBInitializer.go @@ -1,10 +1,8 @@ package backend import ( - "database/sql" + "embed" "encoding/json" - "os" - "path/filepath" "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/guregu/null" @@ -30,13 +28,16 @@ type nameTag struct { CanBeIncluded []string `json:"canbeincluded"` } +//go:embed static_data +var staticData embed.FS + /* Writes all available tags from the json file into tables in order to make them easier to use. Will be executed once while the server is started. */ func initTagRatingOptions(db *gorm.DB) { - updateTagTable("backend/static_data/dishRatingTags.json", db, DISH) - updateTagTable("backend/static_data/cafeteriaRatingTags.json", db, CAFETERIA) + updateTagTable("static_data/dishRatingTags.json", db, DISH) + updateTagTable("static_data/cafeteriaRatingTags.json", db, CAFETERIA) updateNameTagOptions(db) addEntriesForCronJob(db, "averageRatingComputation", 300) addEntriesForCronJob(db, "dishNameDownload", 302400) //run twice every week @@ -55,7 +56,7 @@ func addEntriesForCronJob(db *gorm.DB, cronName string, interval int32) { errCreate := db.Model(&model.Crontab{}). Create(&model.Crontab{ Interval: interval, - Type: null.String{NullString: sql.NullString{String: cronName, Valid: true}}, + Type: null.StringFrom(cronName), LastRun: 0, }).Error if errCreate != nil { @@ -70,10 +71,9 @@ If a tag with the exact german and english name does not exist yet, it will be c Old tags won't be removed to prevent problems with foreign keys. */ func updateNameTagOptions(db *gorm.DB) { - absPathDishNames, _ := filepath.Abs("backend/static_data/dishNameTags.json") - tagsNames := generateNameTagListFromFile(absPathDishNames) + tagsNames := generateNameTagListFromFile("static_data/dishNameTags.json") for _, v := range tagsNames.MultiLanguageNameTags { - var parentId int32 + var parentId int64 res := db.Model(&model.DishNameTagOption{}). Where("EN LIKE ? AND DE LIKE ?", v.TagNameEnglish, v.TagNameGerman). Select("DishNameTagOption"). @@ -99,7 +99,7 @@ func updateNameTagOptions(db *gorm.DB) { } } -func addNotIncluded(parentId int32, db *gorm.DB, v nameTag) { +func addNotIncluded(parentId int64, db *gorm.DB, v nameTag) { var count int64 for _, expression := range v.NotIncluded { fields := log.Fields{"expression": expression, "parentId": parentId} @@ -123,7 +123,7 @@ func addNotIncluded(parentId int32, db *gorm.DB, v nameTag) { } } -func addCanBeIncluded(parentId int32, db *gorm.DB, v nameTag) { +func addCanBeIncluded(parentId int64, db *gorm.DB, v nameTag) { var count int64 for _, expression := range v.CanBeIncluded { fields := log.Fields{"expression": expression, "parentId": parentId} @@ -154,8 +154,7 @@ If an entry with the same German and English name exists, the entry won't be add The TagType is used to identify the corresponding model */ func updateTagTable(path string, db *gorm.DB, tagType modelType) { - absPathDish, _ := filepath.Abs(path) - tagsDish := generateRatingTagListFromFile(absPathDish) + tagsDish := generateRatingTagListFromFile(path) insertModel := getTagModel(tagType, db) for _, v := range tagsDish.MultiLanguageTags { var count int64 @@ -200,42 +199,29 @@ func getTagModel(tagType modelType, db *gorm.DB) *gorm.DB { } func generateNameTagListFromFile(path string) multiLanguageNameTags { - file := readFromFile(path) + file, err := staticData.ReadFile(path) + if err != nil { + log.WithError(err).Error("Error including json.") + } var tags multiLanguageNameTags - errjson := json.NewDecoder(file).Decode(&tags) + errjson := json.Unmarshal(file, &tags) if errjson != nil { - log.WithError(errjson).Error("Error while reading the file.") + log.WithError(errjson).Error("Error parsing nameTagList to json.") } - defer func(jsonFile *os.File) { - if err := jsonFile.Close(); err != nil { - log.WithError(err).Error("Error in parsing json.") - } - }(file) return tags } func generateRatingTagListFromFile(path string) multiLanguageTags { - file := readFromFile(path) + file, err := staticData.ReadFile(path) + if err != nil { + log.WithError(err).Error("Error including json.") + } + var tags multiLanguageTags - errjson := json.NewDecoder(file).Decode(&tags) + errjson := json.Unmarshal(file, &tags) if errjson != nil { - log.WithError(errjson).Error("Error while reading or parsing the file.") + log.WithError(errjson).Error("Error parsing ratingTagList to json.") } - defer func(jsonFile *os.File) { - if err := jsonFile.Close(); err != nil { - log.WithError(err).Error("Error in parsing json.") - } - }(file) return tags } - -func readFromFile(path string) *os.File { - jsonFile, err := os.Open(path) - - if err != nil { - log.WithError(err).Error("Unable to open file with path: ", path) - } - - return jsonFile -} diff --git a/server/backend/cafeteriaService.go b/server/backend/cafeteriaService.go index 8e2565c0..2d8699b6 100644 --- a/server/backend/cafeteriaService.go +++ b/server/backend/cafeteriaService.go @@ -7,7 +7,6 @@ import ( "crypto/md5" "errors" "fmt" - pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "image" "image/jpeg" "math" @@ -15,12 +14,13 @@ import ( "strings" "time" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/disintegration/imaging" log "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/timestamppb" "gorm.io/gorm" ) @@ -41,10 +41,11 @@ const ( // The parameter limit defines how many actual ratings should be returned. // The optional parameters from and to can define an interval in which the queried ratings have been stored. // If these aren't specified, the newest ratings will be returned as the default -func (s *CampusServer) GetCafeteriaRatings(_ context.Context, input *pb.CafeteriaRatingRequest) (*pb.CafeteriaRatingReply, error) { +func (s *CampusServer) GetCafeteriaRatings(ctx context.Context, input *pb.GetCanteenRatingsRequest) (*pb.GetCanteenRatingsReply, error) { var result model.CafeteriaRatingAverage //get the average rating for this specific cafeteria - cafeteriaId := getIDForCafeteriaName(input.CafeteriaId, s.db) - res := s.db.Model(&model.CafeteriaRatingAverage{}). + tx := s.db.WithContext(ctx) + cafeteriaId := getIDForCafeteriaName(input.CanteenId, tx) + res := tx.Model(&model.CafeteriaRatingAverage{}). Where("cafeteriaId = ?", cafeteriaId). First(&result) @@ -54,19 +55,19 @@ func (s *CampusServer) GetCafeteriaRatings(_ context.Context, input *pb.Cafeteri } if res.RowsAffected > 0 { - ratings := queryLastCafeteriaRatingsWithLimit(input, cafeteriaId, s) - cafeteriaTags := queryTags(s.db, cafeteriaId, -1, CAFETERIA) - - return &pb.CafeteriaRatingReply{ - Avg: float64(result.Average), - Std: float64(result.Std), - Min: int32(result.Min), - Max: int32(result.Max), + ratings := queryLastCafeteriaRatingsWithLimit(input, cafeteriaId, tx) + cafeteriaTags := queryTags(cafeteriaId, -1, CAFETERIA, tx) + + return &pb.GetCanteenRatingsReply{ + Avg: result.Average, + Std: result.Std, + Min: result.Min, + Max: result.Max, Rating: ratings, RatingTags: cafeteriaTags, }, nil } else { - return &pb.CafeteriaRatingReply{ + return &pb.GetCanteenRatingsReply{ Avg: -1, Std: -1, Min: -1, @@ -77,7 +78,7 @@ func (s *CampusServer) GetCafeteriaRatings(_ context.Context, input *pb.Cafeteri // queryLastCafeteriaRatingsWithLimit // Queries the actual ratings for a cafeteria and attaches the tag ratings which belong to the ratings -func queryLastCafeteriaRatingsWithLimit(input *pb.CafeteriaRatingRequest, cafeteriaID int32, s *CampusServer) []*pb.SingleRatingReply { +func queryLastCafeteriaRatingsWithLimit(input *pb.GetCanteenRatingsRequest, cafeteriaID int32, tx *gorm.DB) []*pb.SingleRatingReply { var ratings []model.CafeteriaRating var err error @@ -101,13 +102,13 @@ func queryLastCafeteriaRatingsWithLimit(input *pb.CafeteriaRatingRequest, cafete } else { to = input.To.AsTime() } - err = s.db.Model(&model.CafeteriaRating{}). + err = tx.Model(&model.CafeteriaRating{}). Where("cafeteriaID = ? AND timestamp < ? AND timestamp > ?", cafeteriaID, to, from). Order("timestamp desc, cafeteriaRating desc"). Limit(limit). Find(&ratings).Error } else { - err = s.db.Model(&model.CafeteriaRating{}). + err = tx.Model(&model.CafeteriaRating{}). Where("cafeteriaID = ?", cafeteriaID). Order("timestamp desc, cafeteriaRating desc"). Limit(limit). @@ -122,7 +123,7 @@ func queryLastCafeteriaRatingsWithLimit(input *pb.CafeteriaRatingRequest, cafete for i, v := range ratings { - tagRatings := queryTagRatingsOverviewForRating(s, v.CafeteriaRating, CAFETERIA) + tagRatings := queryTagRatingsOverviewForRating(v.CafeteriaRating, CAFETERIA, tx) ratingResults[i] = &pb.SingleRatingReply{ Points: v.Points, Comment: v.Comment, @@ -145,12 +146,13 @@ func queryLastCafeteriaRatingsWithLimit(input *pb.CafeteriaRatingRequest, cafete // The parameter limit defines how many actual ratings should be returned. // The optional parameters from and to can define a interval in which the queried ratings have been stored. // If these aren't specified, the newest ratings will be returned as the default -func (s *CampusServer) GetDishRatings(_ context.Context, input *pb.DishRatingRequest) (*pb.DishRatingReply, error) { +func (s *CampusServer) GetDishRatings(ctx context.Context, input *pb.GetDishRatingsRequest) (*pb.GetDishRatingsReply, error) { var result model.DishRatingAverage //get the average rating for this specific dish - cafeteriaID := getIDForCafeteriaName(input.CafeteriaId, s.db) - dishID := getIDForDishName(input.Dish, cafeteriaID, s.db) + tx := s.db.WithContext(ctx) + cafeteriaID := getIDForCafeteriaName(input.CanteenId, tx) + dishID := getIDForDishName(input.Dish, cafeteriaID, tx) - err := s.db.Model(&model.DishRatingAverage{}). + err := tx.Model(&model.DishRatingAverage{}). Where("cafeteriaID = ? AND dishID = ?", cafeteriaID, dishID). First(&result) @@ -161,21 +163,21 @@ func (s *CampusServer) GetDishRatings(_ context.Context, input *pb.DishRatingReq } if err.RowsAffected > 0 { - ratings := queryLastDishRatingsWithLimit(input, cafeteriaID, dishID, s) - dishTags := queryTags(s.db, cafeteriaID, dishID, DISH) - nameTags := queryTags(s.db, cafeteriaID, dishID, NAME) - - return &pb.DishRatingReply{ - Avg: float64(result.Average), - Std: float64(result.Std), - Min: int32(result.Min), - Max: int32(result.Max), + ratings := queryLastDishRatingsWithLimit(input, cafeteriaID, dishID, tx) + dishTags := queryTags(cafeteriaID, dishID, DISH, tx) + nameTags := queryTags(cafeteriaID, dishID, NAME, tx) + + return &pb.GetDishRatingsReply{ + Avg: result.Average, + Std: result.Std, + Min: result.Min, + Max: result.Max, Rating: ratings, RatingTags: dishTags, NameTags: nameTags, }, nil } else { - return &pb.DishRatingReply{ + return &pb.GetDishRatingsReply{ Avg: -1, Min: -1, Max: -1, @@ -187,7 +189,7 @@ func (s *CampusServer) GetDishRatings(_ context.Context, input *pb.DishRatingReq // queryLastDishRatingsWithLimit // Queries the actual ratings for a dish in a cafeteria and attaches the tag ratings which belong to the ratings -func queryLastDishRatingsWithLimit(input *pb.DishRatingRequest, cafeteriaID int32, dishID int32, s *CampusServer) []*pb.SingleRatingReply { +func queryLastDishRatingsWithLimit(input *pb.GetDishRatingsRequest, cafeteriaID int32, dishID int32, tx *gorm.DB) []*pb.SingleRatingReply { var ratings []model.DishRating var err error var limit = int(input.Limit) @@ -210,13 +212,13 @@ func queryLastDishRatingsWithLimit(input *pb.DishRatingRequest, cafeteriaID int3 to = input.To.AsTime() } - err = s.db.Model(&model.DishRating{}). + err = tx.Model(&model.DishRating{}). Where("cafeteriaID = ? AND dishID = ? AND timestamp < ? AND timestamp > ?", cafeteriaID, dishID, to, from). Order("timestamp desc, dishRating desc"). Limit(limit). Find(&ratings).Error } else { - err = s.db.Model(&model.DishRating{}). + err = tx.Model(&model.DishRating{}). Where("cafeteriaID = ? AND dishID = ?", cafeteriaID, dishID). Order("timestamp desc, dishRating desc"). Limit(limit). @@ -233,7 +235,7 @@ func queryLastDishRatingsWithLimit(input *pb.DishRatingRequest, cafeteriaID int3 ratingResults[i] = &pb.SingleRatingReply{ Points: v.Points, Comment: v.Comment, - RatingTags: queryTagRatingsOverviewForRating(s, v.DishRating, DISH), + RatingTags: queryTagRatingsOverviewForRating(v.DishRating, DISH, tx), Image: getImageToBytes(v.Image), Visited: timestamppb.New(v.Timestamp), } @@ -282,25 +284,25 @@ type queryRatingTag struct { // queryTags // Queries the average ratings for either cafeteriaRatingTags, dishRatingTags or NameTags. // Since the db only stores IDs in the results, the tags must be joined to retrieve their names form the rating_options tables. -func queryTags(db *gorm.DB, cafeteriaID int32, dishID int32, ratingType modelType) []*pb.RatingTagResult { +func queryTags(cafeteriaID int32, dishID int32, ratingType modelType, tx *gorm.DB) []*pb.RatingTagResult { var results []queryRatingTag var err error if ratingType == DISH { - err = db.Table("dish_rating_tag_option options"). + err = tx.Table("dish_rating_tag_option options"). Joins("JOIN dish_rating_tag_average results ON options.dishRatingTagOption = results.tagID"). Select("options.dishRatingTagOption as tagId, results.average as avg, "+ "results.min as min, results.max as max, results.std as std"). Where("results.cafeteriaID = ? AND results.dishID = ?", cafeteriaID, dishID). Scan(&results).Error } else if ratingType == CAFETERIA { - err = db.Table("cafeteria_rating_tag_option options"). + err = tx.Table("cafeteria_rating_tag_option options"). Joins("JOIN cafeteria_rating_tag_average results ON options.cafeteriaRatingTagOption = results.tagID"). Select("options.cafeteriaRatingTagOption as tagId, results.average as avg, "+ "results.min as min, results.max as max, results.std as std"). Where("results.cafeteriaID = ?", cafeteriaID). Scan(&results).Error } else { //Query for name tags - err = db.Table("dish_to_dish_name_tag mapping"). + err = tx.Table("dish_to_dish_name_tag mapping"). Where("mapping.dishID = ?", dishID). Select("mapping.nameTagID as tag"). Joins("JOIN dish_name_tag_average results ON mapping.nameTagID = results.tagID"). @@ -331,16 +333,16 @@ func queryTags(db *gorm.DB, cafeteriaID int32, dishID int32, ratingType modelTyp // queryTagRatingOverviewForRating // Query all rating tags which belong to a specific rating given with an ID and return it as TagRatingOverviews -func queryTagRatingsOverviewForRating(s *CampusServer, dishID int32, ratingType modelType) []*pb.RatingTagNewRequest { +func queryTagRatingsOverviewForRating(dishID int64, ratingType modelType, tx *gorm.DB) []*pb.RatingTagNewRequest { var results []*pb.RatingTagNewRequest var err error if ratingType == DISH { - err = s.db.Table("dish_rating_tag_option options"). + err = tx.Table("dish_rating_tag_option options"). Joins("JOIN dish_rating_tag rating ON options.dishRatingTagOption = rating.tagID"). Select("dishRatingTagOption as tagId, points, parentRating"). Find(&results, "parentRating = ?", dishID).Error } else { - err = s.db.Table("cafeteria_rating_tag_option options"). + err = tx.Table("cafeteria_rating_tag_option options"). Joins("JOIN cafeteria_rating_tag rating ON options.cafeteriaRatingTagOption = rating.tagID"). Select("cafeteriaRatingTagOption as tagId, points, correspondingRating"). Find(&results, "correspondingRating = ?", dishID).Error @@ -352,13 +354,14 @@ func queryTagRatingsOverviewForRating(s *CampusServer, dishID int32, ratingType return results } -// NewCafeteriaRating RPC Endpoint +// NewCanteenRating RPC Endpoint // Allows to store a new cafeteria Rating. // If one of the parameters is invalid, an error will be returned. Otherwise, the rating will be saved. // All rating tags which were given with the new rating are stored if they are valid tags, if at least one tag was // invalid, an error is returned, all valid ratings tags will be stored nevertheless. Either the german or the english name can be returned to successfully store tags -func (s *CampusServer) NewCafeteriaRating(_ context.Context, input *pb.NewCafeteriaRatingRequest) (*emptypb.Empty, error) { - cafeteriaID, errorRes := inputSanitizationForNewRatingElements(input.Points, input.Comment, input.CafeteriaId, s) +func (s *CampusServer) NewCanteenRating(ctx context.Context, input *pb.NewCanteenRatingRequest) (*pb.NewCanteenRatingReply, error) { + tx := s.db.WithContext(ctx) + cafeteriaID, errorRes := inputSanitizationForNewRatingElements(input.Points, input.Comment, input.CanteenId, tx) if errorRes != nil { return nil, errorRes } @@ -371,16 +374,18 @@ func (s *CampusServer) NewCafeteriaRating(_ context.Context, input *pb.NewCafete Timestamp: time.Now(), Image: resPath, } - - if err := s.db.Model(&model.CafeteriaRating{}).Create(&rating).Error; err != nil { + if err := tx.Model(&model.CafeteriaRating{}).Create(&rating).Error; err != nil { log.WithError(err).Error("Error occurred while creating the new cafeteria rating.") return nil, status.Error(codes.InvalidArgument, "Error while creating new cafeteria rating. Rating has not been saved.") } - return storeRatingTags(s, rating.CafeteriaRating, input.RatingTags, CAFETERIA) + if err := storeRatingTags(rating.CafeteriaRating, input.RatingTags, CAFETERIA, tx); err != nil { + return &pb.NewCanteenRatingReply{}, err + } + return &pb.NewCanteenRatingReply{}, nil } -func imageWrapper(image []byte, path string, id int32) string { +func imageWrapper(image []byte, path string, id int64) string { var resPath = "" if len(image) > 0 { var resError error @@ -439,15 +444,15 @@ func storeImage(path string, i []byte) (string, error) { // The ratingNumber will be saved for each corresponding DishNameTag. // All rating tags which were given with the new rating are stored if they are valid tags, if at least one tag was // invalid, an error is returned, all valid ratings tags will be stored nevertheless. Either the german or the english name can be returned to successfully store tags -func (s *CampusServer) NewDishRating(_ context.Context, input *pb.NewDishRatingRequest) (*emptypb.Empty, error) { - - cafeteriaID, errorRes := inputSanitizationForNewRatingElements(input.Points, input.Comment, input.CafeteriaId, s) +func (s *CampusServer) NewDishRating(ctx context.Context, input *pb.NewDishRatingRequest) (*pb.NewDishRatingReply, error) { + tx := s.db.WithContext(ctx) + cafeteriaID, errorRes := inputSanitizationForNewRatingElements(input.Points, input.Comment, input.CanteenId, tx) if errorRes != nil { return nil, errorRes } var dish *model.Dish - errDish := s.db.Model(&model.Dish{}). //Dish must exist in the given mensa + errDish := tx.Model(&model.Dish{}). //Dish must exist in the given mensa Where("name LIKE ? AND cafeteriaID = ?", input.Dish, cafeteriaID). First(&dish).Error if errDish != nil || dish == nil { @@ -466,20 +471,24 @@ func (s *CampusServer) NewDishRating(_ context.Context, input *pb.NewDishRatingR Image: resPath, } - if err := s.db.Model(&model.DishRating{}).Create(&rating).Error; err != nil { + if err := tx.Model(&model.DishRating{}).Create(&rating).Error; err != nil { log.WithError(err).Error("while creating a new dish rating.") return nil, status.Error(codes.Internal, "Error while creating the new rating in the database. Rating has not been saved.") } - assignDishNameTag(s, rating, dish.Dish) - return storeRatingTags(s, rating.DishRating, input.RatingTags, DISH) + assignDishNameTag(rating, dish.Dish, tx) + + if err := storeRatingTags(rating.DishRating, input.RatingTags, DISH, tx); err != nil { + return &pb.NewDishRatingReply{}, err + } + return &pb.NewDishRatingReply{}, nil } // assignDishNameTag // Query all name tags for this specific dish and generate the DishNameTag Ratings ffor each name tag -func assignDishNameTag(s *CampusServer, rating model.DishRating, dishID int32) { - var result []int - err := s.db.Model(&model.DishToDishNameTag{}). +func assignDishNameTag(rating model.DishRating, dishID int64, tx *gorm.DB) { + var result []int64 + err := tx.Model(&model.DishToDishNameTag{}). Where("dishID = ? ", dishID). Select("nameTagID"). Scan(&result).Error @@ -487,7 +496,7 @@ func assignDishNameTag(s *CampusServer, rating model.DishRating, dishID int32) { log.WithError(err).Error("while loading the dishID for the given name.") } else { for _, tagID := range result { - err := s.db.Model(&model.DishNameTag{}).Create(&model.DishNameTag{ + err := tx.Model(&model.DishNameTag{}).Create(&model.DishNameTag{ CorrespondingRating: rating.DishRating, Points: rating.Points, TagNameID: tagID, @@ -501,7 +510,7 @@ func assignDishNameTag(s *CampusServer, rating model.DishRating, dishID int32) { // inputSanitizationForNewRatingElements Checks parameters of the new rating for all cafeteria and dish ratings. // Additionally, queries the cafeteria ID, since it checks whether the cafeteria actually exists. -func inputSanitizationForNewRatingElements(rating int32, comment string, cafeteriaName string, s *CampusServer) (int32, error) { +func inputSanitizationForNewRatingElements(rating int32, comment string, cafeteriaName string, tx *gorm.DB) (int64, error) { if rating > 5 || rating < 0 { return -1, status.Error(codes.InvalidArgument, "Rating must be a positive number not larger than 10. Rating has not been saved.") } @@ -515,7 +524,7 @@ func inputSanitizationForNewRatingElements(rating int32, comment string, cafeter } var result *model.Cafeteria - res := s.db.Model(&model.Cafeteria{}). + res := tx.Model(&model.Cafeteria{}). Where("name LIKE ?", cafeteriaName). First(&result) if errors.Is(res.Error, gorm.ErrRecordNotFound) || res.RowsAffected == 0 { @@ -529,27 +538,27 @@ func inputSanitizationForNewRatingElements(rating int32, comment string, cafeter // storeRatingTags // Checks whether the rating-tag name is a valid option and if so, // it will be saved with a reference to the rating -func storeRatingTags(s *CampusServer, parentRatingID int32, tags []*pb.RatingTag, tagType modelType) (*emptypb.Empty, error) { +func storeRatingTags(parentRatingID int64, tags []*pb.RatingTag, tagType modelType, tx *gorm.DB) error { var errorOccurred = "" var warningOccurred = "" if len(tags) > 0 { usedTagIds := make(map[int]int) - insertModel := getModelStoreTag(tagType, s.db) + insertModel := getModelStoreTag(tagType, tx) for _, currentTag := range tags { var err error var count int64 if tagType == DISH { - err = s.db.Model(&model.DishRatingTagOption{}). + err = tx.Model(&model.DishRatingTagOption{}). Where("dishRatingTagOption LIKE ?", currentTag.TagId). Count(&count).Error } else { - err = s.db.Model(&model.CafeteriaRatingTagOption{}). + err = tx.Model(&model.CafeteriaRatingTagOption{}). Where("cafeteriaRatingTagOption LIKE ?", currentTag.TagId). Count(&count).Error } - if err == gorm.ErrRecordNotFound || count == 0 { + if errors.Is(err, gorm.ErrRecordNotFound) || count == 0 { fields := log.Fields{ "tagid": currentTag.TagId, "count": count, @@ -562,7 +571,7 @@ func storeRatingTags(s *CampusServer, parentRatingID int32, tags []*pb.RatingTag Create(&model.DishRatingTag{ CorrespondingRating: parentRatingID, Points: int32(currentTag.Points), - TagID: int(currentTag.TagId), + TagID: currentTag.TagId, }).Error if err != nil { log.WithError(err).Error("while Creating a currentTag rating for a new rating.") @@ -579,28 +588,28 @@ func storeRatingTags(s *CampusServer, parentRatingID int32, tags []*pb.RatingTag } if len(errorOccurred) > 0 && len(warningOccurred) > 0 { - return &emptypb.Empty{}, status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s does not exist. Remaining rating was saved without this rating tag. The tag(s) %s occurred more than once in this rating.", errorOccurred, warningOccurred)) + return status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s does not exist. Remaining rating was saved without this rating tag. The tag(s) %s occurred more than once in this rating.", errorOccurred, warningOccurred)) } else if len(errorOccurred) > 0 { - return &emptypb.Empty{}, status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s does not exist. Remaining rating was saved without this rating tag.", errorOccurred)) + return status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s does not exist. Remaining rating was saved without this rating tag.", errorOccurred)) } else if len(warningOccurred) > 0 { - return &emptypb.Empty{}, status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s occurred more than once in this rating.", warningOccurred)) + return status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s occurred more than once in this rating.", warningOccurred)) } else { - return &emptypb.Empty{}, nil + return nil } } -func getModelStoreTag(tagType modelType, db *gorm.DB) *gorm.DB { +func getModelStoreTag(tagType modelType, tx *gorm.DB) *gorm.DB { if tagType == DISH { - return db.Model(&model.DishRatingTag{}) + return tx.Model(&model.DishRatingTag{}) } else { - return db.Model(&model.CafeteriaRatingTag{}) + return tx.Model(&model.CafeteriaRatingTag{}) } } -func getIDForCafeteriaName(name string, db *gorm.DB) int32 { +func getIDForCafeteriaName(name string, tx *gorm.DB) int32 { var result int32 = -1 - err := db.Model(&model.Cafeteria{}). + err := tx.Model(&model.Cafeteria{}). Where("name LIKE ?", name). Select("cafeteria"). Scan(&result).Error @@ -611,9 +620,9 @@ func getIDForCafeteriaName(name string, db *gorm.DB) int32 { return result } -func getIDForDishName(name string, cafeteriaID int32, db *gorm.DB) int32 { +func getIDForDishName(name string, cafeteriaID int32, tx *gorm.DB) int32 { var result int32 = -1 - err := db.Model(&model.Dish{}). + err := tx.Model(&model.Dish{}). Where("name LIKE ? AND cafeteriaID = ?", name, cafeteriaID). Select("dish"). Scan(&result).Error @@ -627,69 +636,69 @@ func getIDForDishName(name string, cafeteriaID int32, db *gorm.DB) int32 { // GetAvailableDishTags RPC Endpoint // Returns all valid Tags to quickly rate dishes in english and german with the corresponding Id -func (s *CampusServer) GetAvailableDishTags(_ context.Context, _ *emptypb.Empty) (*pb.GetTagsReply, error) { +func (s *CampusServer) GetAvailableDishTags(ctx context.Context, _ *pb.GetAvailableDishTagsRequest) (*pb.GetAvailableDishTagsReply, error) { var result []*pb.TagsOverview var requestStatus error = nil - err := s.db.Model(&model.DishRatingTagOption{}).Select("DE as de, EN as en, dishRatingTagOption as TagId").Find(&result).Error + err := s.db.WithContext(ctx).Model(&model.DishRatingTagOption{}).Select("DE as de, EN as en, dishRatingTagOption as TagId").Find(&result).Error if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") requestStatus = status.Error(codes.Internal, "Available dish tags could not be loaded from the database.") } - return &pb.GetTagsReply{ + return &pb.GetAvailableDishTagsReply{ RatingTags: result, }, requestStatus } // GetNameTags RPC Endpoint // Returns all valid Tags to quickly rate dishes in english and german with the corresponding Id -func (s *CampusServer) GetNameTags(_ context.Context, _ *emptypb.Empty) (*pb.GetTagsReply, error) { +func (s *CampusServer) GetNameTags(ctx context.Context, _ *pb.GetNameTagsRequest) (*pb.GetNameTagsReply, error) { var result []*pb.TagsOverview var requestStatus error = nil - err := s.db.Model(&model.DishNameTagOption{}).Select("DE as de, EN as en, dishNameTagOption as TagId").Find(&result).Error + err := s.db.WithContext(ctx).Model(&model.DishNameTagOption{}).Select("DE as de, EN as en, dishNameTagOption as TagId").Find(&result).Error if err != nil { log.WithError(err).Error("while loading available Name Tags from database.") requestStatus = status.Error(codes.Internal, "Available dish tags could not be loaded from the database.") } - return &pb.GetTagsReply{ + return &pb.GetNameTagsReply{ RatingTags: result, }, requestStatus } // GetAvailableCafeteriaTags RPC Endpoint // Returns all valid Tags to quickly rate dishes in english and german -func (s *CampusServer) GetAvailableCafeteriaTags(_ context.Context, _ *emptypb.Empty) (*pb.GetTagsReply, error) { +func (s *CampusServer) GetAvailableCafeteriaTags(ctx context.Context, _ *pb.GetAvailableCanteenTagsRequest) (*pb.GetAvailableCanteenTagsReply, error) { var result []*pb.TagsOverview var requestStatus error = nil - err := s.db.Model(&model.CafeteriaRatingTagOption{}).Select("DE as de, EN as en, cafeteriaRatingsTagOption as TagId").Find(&result).Error + err := s.db.WithContext(ctx).Model(&model.CafeteriaRatingTagOption{}).Select("DE as de, EN as en, cafeteriaRatingsTagOption as TagId").Find(&result).Error if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") requestStatus = status.Error(codes.Internal, "Available cafeteria tags could not be loaded from the database.") } - return &pb.GetTagsReply{ + return &pb.GetAvailableCanteenTagsReply{ RatingTags: result, }, requestStatus } // GetCafeterias RPC endpoint // Returns all cafeterias with meta information which are available in the eat-api -func (s *CampusServer) GetCafeterias(_ context.Context, _ *emptypb.Empty) (*pb.GetCafeteriaReply, error) { - var result []*pb.Cafeteria +func (s *CampusServer) GetCafeterias(ctx context.Context, _ *pb.GetCanteensRequest) (*pb.GetCanteensReply, error) { + var result []*pb.Canteen var requestStatus error = nil - err := s.db.Model(&model.Cafeteria{}).Select("cafeteria as id,address,latitude,longitude").Scan(&result).Error + err := s.db.WithContext(ctx).Model(&model.Cafeteria{}).Select("cafeteria as id,address,latitude,longitude").Scan(&result).Error if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") requestStatus = status.Error(codes.Internal, "Cafeterias could not be loaded from the database.") } - return &pb.GetCafeteriaReply{ - Cafeteria: result, + return &pb.GetCanteensReply{ + Canteen: result, }, requestStatus } -func (s *CampusServer) GetDishes(_ context.Context, request *pb.GetDishesRequest) (*pb.GetDishesReply, error) { +func (s *CampusServer) GetDishes(ctx context.Context, request *pb.GetDishesRequest) (*pb.GetDishesReply, error) { if request.Year < 2022 { return &pb.GetDishesReply{}, status.Error(codes.Internal, "Years must be larger or equal to 2022 ") // currently, no previous values have been added } @@ -702,12 +711,12 @@ func (s *CampusServer) GetDishes(_ context.Context, request *pb.GetDishesRequest var requestStatus error = nil var results []string - err := s.db.Table("dishes_of_the_week weekly"). + err := s.db.WithContext(ctx).Table("dishes_of_the_week weekly"). Where("weekly.day = ? AND weekly.week = ? and weekly.year = ?", request.Day, request.Week, request.Year). Select("weekly.dishID"). Joins("JOIN dish d ON d.dish = weekly.dishID"). Joins("JOIN cafeteria c ON c.cafeteria = d.cafeteriaID"). - Where("c.name LIKE ?", request.CafeteriaId). + Where("c.name LIKE ?", request.CanteenId). Select("d.name"). Find(&results).Error diff --git a/server/backend/campus_api/campusApi.go b/server/backend/campus_api/campusApi.go index 23d6754e..b79ec94e 100644 --- a/server/backend/campus_api/campusApi.go +++ b/server/backend/campus_api/campusApi.go @@ -4,10 +4,11 @@ package campus_api import ( "encoding/xml" "errors" - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" "io" "net/http" + + "github.com/TUM-Dev/Campus-Backend/server/model" + log "github.com/sirupsen/logrus" ) const ( diff --git a/server/backend/canteenHeadCount.go b/server/backend/canteenHeadCount.go index 589b2b7e..5aa1c8fc 100644 --- a/server/backend/canteenHeadCount.go +++ b/server/backend/canteenHeadCount.go @@ -12,9 +12,9 @@ import ( ) // GetCanteenHeadCount RPC Endpoint -func (s *CampusServer) GetCanteenHeadCount(_ context.Context, input *pb.GetCanteenHeadCountRequest) (*pb.GetCanteenHeadCountReply, error) { +func (s *CampusServer) GetCanteenHeadCount(ctx context.Context, input *pb.GetCanteenHeadCountRequest) (*pb.GetCanteenHeadCountReply, error) { data := model.CanteenHeadCount{Count: 0, MaxCount: 0, Percent: -1} // Initialize with an empty (not found) value - err := s.db.Model(&model.CanteenHeadCount{}).Where(model.CanteenHeadCount{CanteenId: input.CanteenId}).FirstOrInit(&data).Error + err := s.db.WithContext(ctx).Model(&model.CanteenHeadCount{}).Where(model.CanteenHeadCount{CanteenId: input.CanteenId}).FirstOrInit(&data).Error if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { log.WithError(err).Error("while querying the canteen head count for: ", input.CanteenId) return nil, errors.New("failed to query head count") diff --git a/server/backend/cron/canteenHeadCount.go b/server/backend/cron/canteenHeadCount.go index 1eecc9c2..23892602 100644 --- a/server/backend/cron/canteenHeadCount.go +++ b/server/backend/cron/canteenHeadCount.go @@ -163,7 +163,7 @@ func sumApCounts(aps []AccessPoint) uint32 { log.WithError(err).Error("Canteen HeadCount getting the count failed for access point: ", ap.Target) continue } - total += uint32(count) + total += count } return total } diff --git a/server/backend/cron/cronjobs.go b/server/backend/cron/cronjobs.go index b09fc17a..5d2bd422 100644 --- a/server/backend/cron/cronjobs.go +++ b/server/backend/cron/cronjobs.go @@ -1,9 +1,10 @@ package cron import ( + "time" + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "github.com/TUM-Dev/Campus-Backend/server/env" - "time" "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/mmcdole/gofeed" diff --git a/server/backend/cron/dishNameDownload.go b/server/backend/cron/dishNameDownload.go index 5db223e7..b51e1627 100644 --- a/server/backend/cron/dishNameDownload.go +++ b/server/backend/cron/dishNameDownload.go @@ -19,7 +19,7 @@ type cafeteriaName struct { type cafeteriaWithID struct { Name string `json:"name"` - Cafeteria int32 `json:"cafeteria"` + Cafeteria int64 `json:"cafeteria"` } type location struct { @@ -98,7 +98,7 @@ func downloadDailyDishes(c *CronService) { } var count int64 - var dishId int32 + var dishId int64 errCount := c.db.Model(&model.Dish{}). Where("name = ? AND cafeteriaID = ?", dish.Name, dish.CafeteriaID). Select("dish").First(&dishId). @@ -176,9 +176,9 @@ func downloadCanteenNames(c *CronService) { // addDishTagsToMapping // Checks whether the dish name includes one of the expressions for the excluded tags as well as the included tags. // The corresponding tags for all identified DishNames will be saved in the table DishNameTags. -func addDishTagsToMapping(dishID int32, dishName string, db *gorm.DB) { +func addDishTagsToMapping(dishID int64, dishName string, db *gorm.DB) { lowercaseDish := strings.ToLower(dishName) - var includedTags []int32 + var includedTags []int64 errIncluded := db.Model(&model.DishNameTagOptionIncluded{}). Where("? LIKE CONCAT('%', expression ,'%')", lowercaseDish). Select("nameTagID"). @@ -187,7 +187,7 @@ func addDishTagsToMapping(dishID int32, dishName string, db *gorm.DB) { log.WithError(errIncluded).Error("Error while querying all included expressions for the dish: ", lowercaseDish) } - var excludedTags []int32 + var excludedTags []int64 errExcluded := db.Model(&model.DishNameTagOptionExcluded{}). Where("? LIKE CONCAT('%', expression ,'%')", lowercaseDish). Select("nameTagID"). @@ -219,10 +219,10 @@ func addDishTagsToMapping(dishID int32, dishName string, db *gorm.DB) { } } } -func contains(s []int32, e int32) int32 { +func contains(s []int64, e int64) int64 { for i, a := range s { if a == e { - return int32(i) + return int64(i) } } return -1 diff --git a/server/backend/cron/fileDownload.go b/server/backend/cron/fileDownload.go index 32f36757..f70e1f10 100644 --- a/server/backend/cron/fileDownload.go +++ b/server/backend/cron/fileDownload.go @@ -3,16 +3,17 @@ package cron import ( "bytes" "fmt" - "github.com/TUM-Dev/Campus-Backend/server/model" - "github.com/disintegration/imaging" - "github.com/gabriel-vasile/mimetype" - log "github.com/sirupsen/logrus" - "gorm.io/gorm" "image" "io" "net/http" "os" "strings" + + "github.com/TUM-Dev/Campus-Backend/server/model" + "github.com/disintegration/imaging" + "github.com/gabriel-vasile/mimetype" + log "github.com/sirupsen/logrus" + "gorm.io/gorm" ) // fileDownloadCron Downloads all files that are not marked as finished in the database. diff --git a/server/backend/cron/news.go b/server/backend/cron/news.go index d48dd805..e1f7eeb7 100644 --- a/server/backend/cron/news.go +++ b/server/backend/cron/news.go @@ -2,18 +2,18 @@ package cron import ( "crypto/md5" - "database/sql" "errors" "fmt" + "regexp" + "strings" + "time" + "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/guregu/null" "github.com/microcosm-cc/bluemonday" "github.com/mmcdole/gofeed" log "github.com/sirupsen/logrus" "gorm.io/gorm" - "regexp" - "strings" - "time" ) const ( @@ -90,7 +90,6 @@ func (c *CronService) parseNewsFeed(source model.NewsSource) error { if !skipNews(existingNewsLinksForSource, item.Link) { // pick the first enclosure that is an image (if any) var pickedEnclosure *gofeed.Enclosure - var enclosureUrl = null.String{NullString: sql.NullString{Valid: true, String: ""}} for _, enclosure := range item.Enclosures { if strings.HasSuffix(enclosure.URL, "jpg") || strings.HasSuffix(enclosure.URL, "jpeg") || @@ -100,13 +99,14 @@ func (c *CronService) parseNewsFeed(source model.NewsSource) error { break } } - var fileId = null.Int{NullInt64: sql.NullInt64{Valid: false}} + var enclosureUrl = null.StringFrom("") + var file *model.Files if pickedEnclosure != nil { - fileId, err = c.saveImage(pickedEnclosure.URL) + file, err = c.saveImage(pickedEnclosure.URL) if err != nil { log.WithError(err).Error("can't save news image") } - enclosureUrl = null.String{NullString: sql.NullString{String: pickedEnclosure.URL, Valid: true}} + enclosureUrl = null.StringFrom(pickedEnclosure.URL) } bm := bluemonday.StrictPolicy() sanitizedDesc := bm.Sanitize(item.Description) @@ -119,7 +119,8 @@ func (c *CronService) parseNewsFeed(source model.NewsSource) error { Src: source.Source, Link: item.Link, Image: enclosureUrl, - File: fileId, + FilesID: null.IntFrom(file.File), + Files: file, } newNews = append(newNews, newsItem) } @@ -137,38 +138,30 @@ func (c *CronService) parseNewsFeed(source model.NewsSource) error { } // saveImage Saves an image to the database so it can be downloaded by another cronjob and returns its id -func (c *CronService) saveImage(url string) (null.Int, error) { +func (c *CronService) saveImage(url string) (*model.Files, error) { targetFileName := fmt.Sprintf("%x.jpg", md5.Sum([]byte(url))) - var fileId null.Int - if err := c.db.Model(model.Files{}). - Where("name = ?", targetFileName). - Select("file").Scan(&fileId).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { - log.WithError(err).WithField("targetFileName", targetFileName).Error("Couldn't query database for file") - return null.Int{}, err + file := model.Files{ + Name: targetFileName, // path intentionally omitted } - if fileId.Valid { // file already in database -> return for current news. - return fileId, nil + if err := c.db.First(&file).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + log.WithError(err).WithField("targetFileName", targetFileName).Error("Couldn't query database for file") + return nil, err + } else if err == nil { + return &file, nil } - // otherwise store in database: - file := model.Files{ + // does not exist, store in database + file = model.Files{ Name: targetFileName, Path: ImageDirectory, - URL: sql.NullString{String: url, Valid: true}, - Downloaded: sql.NullBool{Bool: false, Valid: true}, + URL: null.StringFrom(url), + Downloaded: null.BoolFrom(false), } - err := c.db.Transaction(func(tx *gorm.DB) error { - if err := tx.Create(&file).Error; err != nil { - log.WithError(err).Error("Could not store new file to database") - return err - } - return nil - }) - if err != nil { - return null.Int{}, err + if err := c.db.Create(&file).Error; err != nil { + log.WithError(err).Error("Could not store new file to database") + return nil, err } - // creating this int is annoying but i'm too afraid to use real ORM in the model - return null.Int{NullInt64: sql.NullInt64{Int64: int64(file.File), Valid: true}}, nil + return &file, nil } // skipNews returns true if link is in existingLinks or link is invalid @@ -184,7 +177,7 @@ func skipNews(existingLinks []string, link string) bool { return false } -func (c *CronService) cleanOldNewsForSource(source int32) error { +func (c *CronService) cleanOldNewsForSource(source int64) error { log.WithField("source", source).Trace("Truncating old entries") if res := c.db.Delete(&model.News{}, "`src` = ? AND `created` < ?", source, time.Now().Add(time.Hour*24*365*-1)); res.Error == nil { log.WithField("RowsAffected", res.RowsAffected).Info("cleaned up old news") diff --git a/server/backend/device.go b/server/backend/device.go index 436758d2..0250f4e7 100644 --- a/server/backend/device.go +++ b/server/backend/device.go @@ -2,10 +2,11 @@ package backend import ( "context" - pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "sync" "time" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" diff --git a/server/backend/firebase/messaging.go b/server/backend/firebase/messaging.go deleted file mode 100644 index 4d2f909e..00000000 --- a/server/backend/firebase/messaging.go +++ /dev/null @@ -1,17 +0,0 @@ -package firebase - -import "gorm.io/gorm" - -type MessagingService struct { - db *gorm.DB -} - -func New(db *gorm.DB) *MessagingService { - - return &MessagingService{db: db} -} - -func (c *MessagingService) Run() error { - - return nil -} diff --git a/server/backend/influx/influxClient.go b/server/backend/influx/influxClient.go index 266047e4..afb985d6 100644 --- a/server/backend/influx/influxClient.go +++ b/server/backend/influx/influxClient.go @@ -5,12 +5,13 @@ import ( "crypto/sha256" "encoding/hex" "errors" + "os" + "github.com/TUM-Dev/Campus-Backend/server/env" influxdb2 "github.com/influxdata/influxdb-client-go/v2" "github.com/influxdata/influxdb-client-go/v2/api" "github.com/influxdata/influxdb-client-go/v2/api/write" log "github.com/sirupsen/logrus" - "os" ) var ( diff --git a/server/backend/influxdb.go b/server/backend/influxdb.go index 1028186d..28ae23d9 100644 --- a/server/backend/influxdb.go +++ b/server/backend/influxdb.go @@ -3,9 +3,10 @@ package backend import ( "context" "errors" + "os" + "github.com/TUM-Dev/Campus-Backend/server/backend/influx" influxdb2 "github.com/influxdata/influxdb-client-go/v2" - "os" ) const ( diff --git a/server/backend/iosNotifications.go b/server/backend/iosNotifications.go index 42b54f78..bc759e92 100644 --- a/server/backend/iosNotifications.go +++ b/server/backend/iosNotifications.go @@ -2,6 +2,7 @@ package backend import ( "context" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" diff --git a/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go b/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go index 338b0d31..3108b090 100644 --- a/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go +++ b/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go @@ -4,16 +4,17 @@ import ( "bytes" "encoding/json" "errors" + "io" + "net/http" + "strconv" + "time" + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" "github.com/TUM-Dev/Campus-Backend/server/env" "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "golang.org/x/net/http2" "gorm.io/gorm" - "io" - "net/http" - "strconv" - "time" ) const ( diff --git a/server/backend/ios_notifications/ios_apns/iosAPNsService.go b/server/backend/ios_notifications/ios_apns/iosAPNsService.go index 37427fca..ef79c2e1 100644 --- a/server/backend/ios_notifications/ios_apns/iosAPNsService.go +++ b/server/backend/ios_notifications/ios_apns/iosAPNsService.go @@ -4,6 +4,7 @@ package ios_apns import ( "errors" + "github.com/TUM-Dev/Campus-Backend/server/backend/influx" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" "github.com/TUM-Dev/Campus-Backend/server/model" diff --git a/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go b/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go index bf00d984..cb9cecd3 100644 --- a/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go +++ b/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go @@ -6,12 +6,13 @@ import ( "crypto/x509" "encoding/pem" "errors" - "github.com/golang-jwt/jwt" - log "github.com/sirupsen/logrus" "os" "path/filepath" "sync" "time" + + "github.com/golang-jwt/jwt" + log "github.com/sirupsen/logrus" ) const ( diff --git a/server/backend/ios_notifications/ios_crypto/encryptedString.go b/server/backend/ios_notifications/ios_crypto/encryptedString.go index 5ee0aa4b..24a7aac4 100644 --- a/server/backend/ios_notifications/ios_crypto/encryptedString.go +++ b/server/backend/ios_notifications/ios_crypto/encryptedString.go @@ -11,6 +11,7 @@ import ( "encoding/base64" "encoding/pem" "errors" + log "github.com/sirupsen/logrus" ) diff --git a/server/backend/ios_notifications/ios_device/iosDeviceRepository.go b/server/backend/ios_notifications/ios_device/iosDeviceRepository.go index 334fe82a..969256c0 100644 --- a/server/backend/ios_notifications/ios_device/iosDeviceRepository.go +++ b/server/backend/ios_notifications/ios_device/iosDeviceRepository.go @@ -2,6 +2,7 @@ package ios_device import ( "errors" + "github.com/TUM-Dev/Campus-Backend/server/model" "gorm.io/gorm" ) diff --git a/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetRepository.go b/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetRepository.go index 12f7207c..e2c02b0d 100644 --- a/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetRepository.go +++ b/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetRepository.go @@ -1,11 +1,12 @@ package ios_devices_activity_reset import ( + "time" + "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "gorm.io/gorm" "gorm.io/gorm/clause" - "time" ) type Repository struct { diff --git a/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetService.go b/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetService.go index ddea9248..764c590e 100644 --- a/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetService.go +++ b/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetService.go @@ -1,10 +1,11 @@ package ios_devices_activity_reset import ( + "time" + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_device" log "github.com/sirupsen/logrus" "gorm.io/gorm" - "time" ) type Service struct { diff --git a/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go b/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go index cbd57102..4bc9bfec 100644 --- a/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go +++ b/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go @@ -5,6 +5,7 @@ package ios_request_response import ( "fmt" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/campus_api" "github.com/TUM-Dev/Campus-Backend/server/backend/influx" diff --git a/server/backend/ios_notifications/ios_scheduling/iosSchedulingService.go b/server/backend/ios_notifications/ios_scheduling/iosSchedulingService.go index 1e1f9ee6..715684db 100644 --- a/server/backend/ios_notifications/ios_scheduling/iosSchedulingService.go +++ b/server/backend/ios_notifications/ios_scheduling/iosSchedulingService.go @@ -3,13 +3,14 @@ package ios_scheduling import ( + "sync" + "github.com/TUM-Dev/Campus-Backend/server/backend/influx" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_device" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_scheduled_update_log" "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" - "sync" ) const ( diff --git a/server/backend/migration/20210709193000.go b/server/backend/migration/20210709193000.go index f3945cb7..98c98255 100644 --- a/server/backend/migration/20210709193000.go +++ b/server/backend/migration/20210709193000.go @@ -1,7 +1,6 @@ package migration import ( - "database/sql" "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/go-gormigrate/gormigrate/v2" "github.com/guregu/null" @@ -17,8 +16,8 @@ func (m TumDBMigrator) migrate20210709193000() *gormigrate.Migration { ID: "20210709193000", Migrate: func(tx *gorm.DB) error { type Files struct { - URL sql.NullString `gorm:"column:url;default:null;" json:"url"` // URL of the file source (if any) - Downloaded sql.NullBool `gorm:"column:downloaded;type:boolean;default:1;" json:"downloaded"` // true when file is ready to be served, false when still being downloaded + URL null.String `gorm:"column:url;default:null;" json:"url"` // URL of the file source (if any) + Downloaded null.Bool `gorm:"column:downloaded;type:boolean;default:1;" json:"downloaded"` // true when file is ready to be served, false when still being downloaded } if err := tx.AutoMigrate( &Files{}, @@ -28,7 +27,7 @@ func (m TumDBMigrator) migrate20210709193000() *gormigrate.Migration { } return tx.Create(&model.Crontab{ Interval: 300, - Type: null.String{NullString: sql.NullString{String: "fileDownload", Valid: true}}, + Type: null.StringFrom("fileDownload"), }).Error }, Rollback: func(tx *gorm.DB) error { diff --git a/server/backend/migration/20221119131300.go b/server/backend/migration/20221119131300.go index 2f4588dc..ffdbb938 100644 --- a/server/backend/migration/20221119131300.go +++ b/server/backend/migration/20221119131300.go @@ -1,9 +1,9 @@ package migration import ( - "database/sql" _ "embed" "encoding/json" + "github.com/TUM-Dev/Campus-Backend/server/backend/cron" "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/go-gormigrate/gormigrate/v2" @@ -52,7 +52,7 @@ func (m TumDBMigrator) migrate20221119131300() *gormigrate.Migration { err := tx.Create(&model.Crontab{ Interval: 60, - Type: null.String{NullString: sql.NullString{String: cron.IOSNotifications, Valid: true}}, + Type: null.StringFrom(cron.IOSNotifications), }).Error if err != nil { @@ -61,12 +61,7 @@ func (m TumDBMigrator) migrate20221119131300() *gormigrate.Migration { } return tx.Create(&model.Crontab{ - Type: null.String{ - NullString: sql.NullString{ - String: cron.IOSActivityReset, - Valid: true, - }, - }, + Type: null.StringFrom(cron.IOSActivityReset), Interval: 86400, }).Error }, diff --git a/server/backend/migration/20221210000000.go b/server/backend/migration/20221210000000.go index 4baac263..54dc7f3f 100644 --- a/server/backend/migration/20221210000000.go +++ b/server/backend/migration/20221210000000.go @@ -1,8 +1,6 @@ package migration import ( - "database/sql" - "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/go-gormigrate/gormigrate/v2" "github.com/guregu/null" @@ -30,7 +28,7 @@ func (m TumDBMigrator) migrate20221210000000() *gormigrate.Migration { return tx.Create(&model.Crontab{ Interval: 60 * 5, // Every 5 minutes - Type: null.String{NullString: sql.NullString{String: "canteenHeadCount", Valid: true}}, + Type: null.StringFrom("canteenHeadCount"), }).Error }, diff --git a/server/backend/migration/20230825000000.go b/server/backend/migration/20230825000000.go index 6f64ea82..c426ed13 100644 --- a/server/backend/migration/20230825000000.go +++ b/server/backend/migration/20230825000000.go @@ -3,6 +3,7 @@ package migration import ( "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/go-gormigrate/gormigrate/v2" + "github.com/guregu/null" "gorm.io/gorm" ) @@ -12,14 +13,19 @@ func (m TumDBMigrator) migrate20230825000000() *gormigrate.Migration { return &gormigrate.Migration{ ID: "20230825000000", Migrate: func(tx *gorm.DB) error { - // deactivete the crontab (Rollback deletes this from the enum) - // given that previously, not cronjobs for this type existed there is no need to remove offending entries first + if err := tx.Delete(&model.Crontab{}, "type = 'chat'").Error; err != nil { + return err + } return SafeEnumRollback(tx, &model.Crontab{}, "type", "chat") }, Rollback: func(tx *gorm.DB) error { - // activete the crontab (Migrate adds this from to the enum) - // given that previously, not cronjobs for this type existed there is no need to add entries first - return SafeEnumMigrate(tx, &model.Crontab{}, "type", "chat") + if err := SafeEnumMigrate(tx, &model.Crontab{}, "type", "chat"); err != nil { + return err + } + return tx.Create(&model.Crontab{ + Interval: 60 * 10, // Every 10 minutes + Type: null.StringFrom("chat"), + }).Error }, } } diff --git a/server/backend/migration/20230904000000.go b/server/backend/migration/20230904000000.go index dd75988d..d9c0a227 100644 --- a/server/backend/migration/20230904000000.go +++ b/server/backend/migration/20230904000000.go @@ -1,8 +1,6 @@ package migration import ( - "database/sql" - "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/go-gormigrate/gormigrate/v2" "github.com/guregu/null" @@ -16,7 +14,7 @@ func (m TumDBMigrator) migrate20230904000000() *gormigrate.Migration { ID: "20230904000000", Migrate: func(tx *gorm.DB) error { // remove "canteenHeadCount" in the enum - if err := tx.Where("type = ?", "ticketsales").Delete(&model.Crontab{}).Error; err != nil { + if err := tx.Delete(&model.Crontab{}, "type = 'ticketsales'").Error; err != nil { return err } if err := SafeEnumRollback(tx, model.Crontab{}, "type", "ticketsales"); err != nil { @@ -31,7 +29,7 @@ func (m TumDBMigrator) migrate20230904000000() *gormigrate.Migration { } return tx.Create(&model.Crontab{ Interval: 60 * 10, // Every 10 minutes - Type: null.String{NullString: sql.NullString{String: "ticketsales", Valid: true}}, + Type: null.StringFrom("ticketsales"), }).Error }, } diff --git a/server/backend/migration/migration.go b/server/backend/migration/migration.go index 1613c268..7cd9acf6 100644 --- a/server/backend/migration/migration.go +++ b/server/backend/migration/migration.go @@ -35,14 +35,21 @@ func (m TumDBMigrator) Migrate() error { return err } log.Info("Using manual migration") - mig := gormigrate.New(m.database, gormigrate.DefaultOptions, []*gormigrate.Migration{ + gormigrateOptions := &gormigrate.Options{ + TableName: gormigrate.DefaultOptions.TableName, + IDColumnName: gormigrate.DefaultOptions.IDColumnName, + IDColumnSize: gormigrate.DefaultOptions.IDColumnSize, + UseTransaction: true, + ValidateUnknownMigrations: true, + } + mig := gormigrate.New(m.database, gormigrateOptions, []*gormigrate.Migration{ m.migrate20210709193000(), m.migrate20220126230000(), m.migrate20220713000000(), m.migrate20221119131300(), m.migrate20221210000000(), - m.migrate20230904000000(), m.migrate20230825000000(), + m.migrate20230904000000(), }) err := mig.Migrate() return err diff --git a/server/backend/migration/safeEnumMigrate.go b/server/backend/migration/safeEnumMigrate.go index 0d106b9a..376bdaa4 100644 --- a/server/backend/migration/safeEnumMigrate.go +++ b/server/backend/migration/safeEnumMigrate.go @@ -3,8 +3,9 @@ package migration import ( "errors" "fmt" - "gorm.io/gorm" "strings" + + "gorm.io/gorm" ) func SafeEnumMigrate(tx *gorm.DB, table interface{}, column string, additionalTypes ...string) error { diff --git a/server/backend/migration/safeEnumMigrate_test.go b/server/backend/migration/safeEnumMigrate_test.go index 920bcc2a..bbec8d44 100644 --- a/server/backend/migration/safeEnumMigrate_test.go +++ b/server/backend/migration/safeEnumMigrate_test.go @@ -2,13 +2,14 @@ package migration_test import ( "fmt" - "github.com/TUM-Dev/Campus-Backend/server/backend/migration" - log "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" "math/rand" "regexp" "strings" "testing" + + "github.com/TUM-Dev/Campus-Backend/server/backend/migration" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" ) var ( diff --git a/server/backend/migration/static_data/iosInitialSchedulingPriorities.json b/server/backend/migration/static_data/iosInitialSchedulingPriorities.json index 603b4205..4f78e940 100644 --- a/server/backend/migration/static_data/iosInitialSchedulingPriorities.json +++ b/server/backend/migration/static_data/iosInitialSchedulingPriorities.json @@ -20,4 +20,4 @@ "to_hour": 6, "priority": 1 } -] \ No newline at end of file +] diff --git a/server/backend/news.go b/server/backend/news.go index fac84b5c..013b3fba 100644 --- a/server/backend/news.go +++ b/server/backend/news.go @@ -3,21 +3,23 @@ package backend import ( "context" "fmt" + + "google.golang.org/protobuf/types/known/timestamppb" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" ) -func (s *CampusServer) GetNewsSources(ctx context.Context, _ *emptypb.Empty) (newsSources *pb.NewsSourceReply, err error) { - if err = s.checkDevice(ctx); err != nil { - return +func (s *CampusServer) GetNewsSources(ctx context.Context, _ *pb.GetNewsSourcesRequest) (*pb.GetNewsSourcesReply, error) { + if err := s.checkDevice(ctx); err != nil { + return nil, err } var sources []model.NewsSource - if err := s.db.Joins("Files").Find(&sources).Error; err != nil { + if err := s.db.WithContext(ctx).Joins("Files").Find(&sources).Error; err != nil { log.WithError(err).Error("could not find newsSources") return nil, status.Error(codes.Internal, "could not GetNewsSources") } @@ -31,5 +33,39 @@ func (s *CampusServer) GetNewsSources(ctx context.Context, _ *emptypb.Empty) (ne Icon: source.Files.URL.String, }) } - return &pb.NewsSourceReply{Sources: resp}, nil + return &pb.GetNewsSourcesReply{Sources: resp}, nil +} + +func (s *CampusServer) GetNews(ctx context.Context, req *pb.GetNewsRequest) (*pb.GetNewsReply, error) { + if err := s.checkDevice(ctx); err != nil { + return nil, err + } + + var newsEntries []model.News + tx := s.db.WithContext(ctx).Joins("Files") + if req.NewsSource != 0 { + tx = tx.Where("src = ?", req.NewsSource) + } + if req.LastNewsId != 0 { + tx = tx.Where("news > ?", req.LastNewsId) + } + if err := tx.Find(&newsEntries).Error; err != nil { + log.WithError(err).Error("could not find news item") + return nil, status.Error(codes.Internal, "could not GetNews") + } + + resp := make([]*pb.NewsItem, len(newsEntries)) + for i, item := range newsEntries { + log.WithField("title", item.Title).Trace("sending news") + resp[i] = &pb.NewsItem{ + Id: item.News, + Title: item.Title, + Text: item.Description, + Link: item.Link, + ImageUrl: item.Image.String, + Source: fmt.Sprintf("%d", item.Src), + Created: timestamppb.New(item.Created), + } + } + return &pb.GetNewsReply{News: resp}, nil } diff --git a/server/backend/newsAlerts.go b/server/backend/newsAlerts.go index b9addc25..6189b256 100644 --- a/server/backend/newsAlerts.go +++ b/server/backend/newsAlerts.go @@ -3,23 +3,23 @@ package backend import ( "context" "errors" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/timestamppb" "gorm.io/gorm" ) -func (s *CampusServer) GetTopNews(ctx context.Context, _ *emptypb.Empty) (*pb.GetTopNewsReply, error) { +func (s *CampusServer) GetTopNews(ctx context.Context, _ *pb.GetTopNewsRequest) (*pb.GetTopNewsReply, error) { if err := s.checkDevice(ctx); err != nil { return nil, err } var res *model.NewsAlert - err := s.db.Joins("Files").Where("NOW() between `from` and `to`").First(&res).Error + err := s.db.WithContext(ctx).Joins("Files").Where("NOW() between `from` and `to`").First(&res).Error if errors.Is(err, gorm.ErrRecordNotFound) { return nil, status.Error(codes.NotFound, "no current active top news") } else if err != nil { diff --git a/server/backend/newsAlerts_test.go b/server/backend/newsAlerts_test.go index dd11cd30..ffbb0579 100644 --- a/server/backend/newsAlerts_test.go +++ b/server/backend/newsAlerts_test.go @@ -3,6 +3,10 @@ package backend import ( "context" "database/sql" + "regexp" + "testing" + "time" + "github.com/DATA-DOG/go-sqlmock" pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/model" @@ -15,9 +19,6 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" "gorm.io/driver/mysql" "gorm.io/gorm" - "regexp" - "testing" - "time" ) type NewsAlertSuite struct { @@ -59,11 +60,11 @@ func (s *NewsAlertSuite) Test_GetTopNewsOne() { Name: "Tournament_app_02-02.png", Path: "newsalerts/", Downloads: 0, - URL: sql.NullString{Valid: false}, - Downloaded: sql.NullBool{Bool: true, Valid: true}, + URL: null.String{}, + Downloaded: null.Bool{}, }, - Name: null.String{NullString: sql.NullString{String: "Exzellenzuniversität", Valid: true}}, - Link: null.String{NullString: sql.NullString{String: "https://tum.de", Valid: true}}, + Name: null.StringFrom("Exzellenzuniversität"), + Link: null.StringFrom("https://tum.de"), Created: time.Time.Add(time.Now(), time.Hour*-4), From: time.Time.Add(time.Now(), time.Hour*-2), To: time.Time.Add(time.Now(), time.Hour*2), diff --git a/server/backend/news_test.go b/server/backend/news_test.go index c0f175c1..36cb8710 100644 --- a/server/backend/news_test.go +++ b/server/backend/news_test.go @@ -4,6 +4,11 @@ import ( "context" "database/sql" "fmt" + "regexp" + "testing" + + "google.golang.org/protobuf/types/known/timestamppb" + "github.com/DATA-DOG/go-sqlmock" pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/model" @@ -13,8 +18,6 @@ import ( "google.golang.org/grpc/metadata" "gorm.io/driver/mysql" "gorm.io/gorm" - "regexp" - "testing" ) type NewsSuite struct { @@ -45,14 +48,14 @@ func (s *NewsSuite) SetupSuite() { s.deviceBuf = newDeviceBuffer() } -func file(id int32) *model.Files { +func file(id int64) *model.Files { return &model.Files{ File: id, Name: fmt.Sprintf("src_%d.png", id), Path: "news/sources", Downloads: 1, - URL: sql.NullString{Valid: false}, - Downloaded: sql.NullBool{Bool: true, Valid: true}, + URL: null.String{}, + Downloaded: null.BoolFrom(true), } } @@ -60,10 +63,10 @@ func source1() *model.NewsSource { return &model.NewsSource{ Source: 1, Title: "Amazing News 1", - URL: null.String{NullString: sql.NullString{String: "https://example.com/amazing1", Valid: true}}, + URL: null.StringFrom("https://example.com/amazing1"), FilesID: file(2).File, Files: *file(2), - Hook: null.String{NullString: sql.NullString{String: "", Valid: true}}, + Hook: null.StringFrom(""), } } @@ -71,10 +74,10 @@ func source2() *model.NewsSource { return &model.NewsSource{ Source: 2, Title: "Amazing News 2", - URL: null.String{NullString: sql.NullString{String: "https://example.com/amazing2", Valid: true}}, + URL: null.StringFrom("https://example.com/amazing2"), FilesID: file(2).File, Files: *file(2), - Hook: null.String{NullString: sql.NullString{String: "hook", Valid: true}}, + Hook: null.StringFrom("hook"), } } @@ -90,7 +93,7 @@ func (s *NewsSuite) Test_GetNewsSourcesMultiple() { server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} response, err := server.GetNewsSources(metadata.NewIncomingContext(context.Background(), meta), nil) require.NoError(s.T(), err) - expectedResp := &pb.NewsSourceReply{ + expectedResp := &pb.GetNewsSourcesReply{ Sources: []*pb.NewsSource{ {Source: fmt.Sprintf("%d", source1().Source), Title: source1().Title, Icon: source1().Files.URL.String}, {Source: fmt.Sprintf("%d", source2().Source), Title: source2().Title, Icon: source2().Files.URL.String}, @@ -99,6 +102,26 @@ func (s *NewsSuite) Test_GetNewsSourcesMultiple() { require.Equal(s.T(), expectedResp, response) } +func news1() *model.News { + return &model.News{ + News: 1, + Title: "Amazing News 1", + Link: "https://example.com/amazing2", + FilesID: null.Int{NullInt64: sql.NullInt64{Int64: file(1).File, Valid: true}}, + Files: file(1), + } +} + +func news2() *model.News { + return &model.News{ + News: 2, + Title: "Amazing News 2", + Link: "https://example.com/amazing2", + FilesID: null.Int{}, + Files: nil, + } +} + func (s *NewsSuite) Test_GetNewsSourcesNone() { s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetSourceQuery)). WillReturnRows(sqlmock.NewRows([]string{"source", "title", "url", "icon", "hook", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"})) @@ -107,12 +130,62 @@ func (s *NewsSuite) Test_GetNewsSourcesNone() { server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} response, err := server.GetNewsSources(metadata.NewIncomingContext(context.Background(), meta), nil) require.NoError(s.T(), err) - expectedResp := &pb.NewsSourceReply{ + expectedResp := &pb.GetNewsSourcesReply{ Sources: []*pb.NewsSource(nil), } require.Equal(s.T(), expectedResp, response) } +const ExpectedGetNewsQuery = "SELECT `news`.`news`,`news`.`date`,`news`.`created`,`news`.`title`,`news`.`description`,`news`.`src`,`news`.`link`,`news`.`image`,`news`.`file`,`Files`.`file` AS `Files__file`,`Files`.`name` AS `Files__name`,`Files`.`path` AS `Files__path`,`Files`.`downloads` AS `Files__downloads`,`Files`.`url` AS `Files__url`,`Files`.`downloaded` AS `Files__downloaded` FROM `news` LEFT JOIN `files` `Files` ON `news`.`file` = `Files`.`file`" + +func (s *NewsSuite) Test_GetNewsNone_withFilters() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetNewsQuery+" WHERE src = ? AND news > ?")). + WithArgs(1, 2). + WillReturnRows(sqlmock.NewRows([]string{"news", "date", "created", "title", "description", "src", "link", "image", "file", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"})) + + meta := metadata.NewIncomingContext(context.Background(), metadata.MD{}) + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetNews(meta, &pb.GetNewsRequest{NewsSource: 1, LastNewsId: 2}) + require.NoError(s.T(), err) + expectedResp := &pb.GetNewsReply{ + News: []*pb.NewsItem{}, + } + require.Equal(s.T(), expectedResp, response) +} +func (s *NewsSuite) Test_GetNewsNone() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetNewsQuery)). + WillReturnRows(sqlmock.NewRows([]string{"news", "date", "created", "title", "description", "src", "link", "image", "file", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"})) + + meta := metadata.NewIncomingContext(context.Background(), metadata.MD{}) + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetNews(meta, &pb.GetNewsRequest{}) + require.NoError(s.T(), err) + expectedResp := &pb.GetNewsReply{ + News: []*pb.NewsItem{}, + } + require.Equal(s.T(), expectedResp, response) +} +func (s *NewsSuite) Test_GetNewsMultiple() { + n1 := news1() + n2 := news2() + s.mock.ExpectQuery(regexp.QuoteMeta(" ")). + WillReturnRows(sqlmock.NewRows([]string{"news", "date", "created", "title", "description", "src", "link", "image", "file", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"}). + AddRow(n1.News, n1.Date, n1.Created, n1.Title, n1.Description, n1.Src, n1.Link, n1.Image, n1.FilesID, n1.Files.File, n1.Files.Name, n1.Files.Path, n1.Files.Downloads, n1.Files.URL, n1.Files.Downloaded). + AddRow(n2.News, n2.Date, n2.Created, n2.Title, n2.Description, n2.Src, n2.Link, n2.Image, nil, nil, nil, nil, nil, nil, nil)) + + meta := metadata.NewIncomingContext(context.Background(), metadata.MD{}) + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetNews(meta, &pb.GetNewsRequest{}) + require.NoError(s.T(), err) + expectedResp := &pb.GetNewsReply{ + News: []*pb.NewsItem{ + {Id: n1.News, Title: n1.Title, Text: n1.Description, Link: n1.Link, ImageUrl: n1.Image.String, Source: fmt.Sprintf("%d", n1.Src), Created: timestamppb.New(n1.Created)}, + {Id: n2.News, Title: n2.Title, Text: n2.Description, Link: n2.Link, ImageUrl: n2.Image.String, Source: fmt.Sprintf("%d", n2.Src), Created: timestamppb.New(n2.Created)}, + }, + } + require.Equal(s.T(), expectedResp, response) +} + func (s *NewsSuite) AfterTest(_, _ string) { require.NoError(s.T(), s.mock.ExpectationsWereMet()) } diff --git a/server/backend/rpcserver.go b/server/backend/rpcserver.go index e1824083..253fa620 100644 --- a/server/backend/rpcserver.go +++ b/server/backend/rpcserver.go @@ -1,18 +1,14 @@ package backend import ( - "context" - "errors" + "net" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" - "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" "gorm.io/gorm" - "net" ) func (s *CampusServer) GRPCServe(l net.Listener) error { diff --git a/server/backend/static_data/cafeteriaRatingTags.json b/server/backend/static_data/cafeteriaRatingTags.json index 2dc3a6fb..1e8f023c 100644 --- a/server/backend/static_data/cafeteriaRatingTags.json +++ b/server/backend/static_data/cafeteriaRatingTags.json @@ -37,4 +37,4 @@ "tagNameEnglish": "Credibility of the menu" } ] -} \ No newline at end of file +} diff --git a/server/backend/static_data/dishNameTags.json b/server/backend/static_data/dishNameTags.json index 583878c4..8c6100b1 100644 --- a/server/backend/static_data/dishNameTags.json +++ b/server/backend/static_data/dishNameTags.json @@ -584,4 +584,4 @@ "notincluded": [] } ] -} \ No newline at end of file +} diff --git a/server/backend/static_data/dishRatingTags.json b/server/backend/static_data/dishRatingTags.json index 2d9e9941..8c751c80 100644 --- a/server/backend/static_data/dishRatingTags.json +++ b/server/backend/static_data/dishRatingTags.json @@ -37,4 +37,4 @@ "tagNameEnglish": "Appearance" } ] -} \ No newline at end of file +} diff --git a/server/backend/updateNews_test.go b/server/backend/updateNews_test.go new file mode 100644 index 00000000..e4e635af --- /dev/null +++ b/server/backend/updateNews_test.go @@ -0,0 +1,96 @@ +package backend + +import ( + "context" + "database/sql" + "regexp" + "testing" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/DATA-DOG/go-sqlmock" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "google.golang.org/grpc/metadata" + "gorm.io/driver/mysql" + "gorm.io/gorm" +) + +type UpdateNoteSuite struct { + suite.Suite + DB *gorm.DB + mock sqlmock.Sqlmock + deviceBuf *deviceBuffer +} + +func (s *UpdateNoteSuite) SetupSuite() { + var ( + db *sql.DB + err error + ) + + db, s.mock, err = sqlmock.New() + require.NoError(s.T(), err) + + dialector := mysql.New(mysql.Config{ + Conn: db, + DriverName: "mysql", + }) + s.mock.ExpectQuery("SELECT VERSION()"). + WillReturnRows(sqlmock.NewRows([]string{"VERSION()"}).AddRow("10.11.4-MariaDB")) + s.DB, err = gorm.Open(dialector, &gorm.Config{}) + require.NoError(s.T(), err) + + s.deviceBuf = newDeviceBuffer() +} + +const ExpectedGetUpdateNoteQuery = "SELECT * FROM `update_note` WHERE `update_note`.`version_code` = ? ORDER BY `update_note`.`version_code` LIMIT 1" + +func (s *UpdateNoteSuite) Test_GetUpdateNoteOne() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetUpdateNoteQuery)). + WillReturnRows(sqlmock.NewRows([]string{"version_code", "version_name", "message"}). + AddRow(1, "1.0.0", "Test Message")) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetUpdateNote(metadata.NewIncomingContext(context.Background(), meta), &pb.GetUpdateNoteRequest{Version: 1}) + require.NoError(s.T(), err) + expectedResp := &pb.GetUpdateNoteReply{ + Message: "Test Message", + VersionName: "1.0.0", + } + require.Equal(s.T(), expectedResp, response) +} + +func (s *UpdateNoteSuite) Test_GetUpdateNoteNone() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetUpdateNoteQuery)). + WillReturnRows(sqlmock.NewRows([]string{"version_code", "version_name", "message"})) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetUpdateNote(metadata.NewIncomingContext(context.Background(), meta), &pb.GetUpdateNoteRequest{Version: 1}) + require.Equal(s.T(), status.Error(codes.NotFound, "No update note found"), err) + require.Nil(s.T(), response) +} + +func (s *UpdateNoteSuite) Test_GetUpdateNoteError() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetUpdateNoteQuery)).WillReturnError(gorm.ErrInvalidDB) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetUpdateNote(metadata.NewIncomingContext(context.Background(), meta), &pb.GetUpdateNoteRequest{Version: 1}) + require.Equal(s.T(), status.Error(codes.Internal, "Internal server error"), err) + require.Nil(s.T(), response) +} + +func (s *UpdateNoteSuite) AfterTest(_, _ string) { + require.NoError(s.T(), s.mock.ExpectationsWereMet()) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestUpdateNoteSuite(t *testing.T) { + suite.Run(t, new(UpdateNoteSuite)) +} diff --git a/server/backend/updateNote.go b/server/backend/updateNote.go new file mode 100644 index 00000000..70d1fbb7 --- /dev/null +++ b/server/backend/updateNote.go @@ -0,0 +1,30 @@ +package backend + +import ( + "context" + "errors" + + "google.golang.org/grpc/codes" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc/status" + "gorm.io/gorm" +) + +func (s *CampusServer) GetUpdateNote(ctx context.Context, req *pb.GetUpdateNoteRequest) (*pb.GetUpdateNoteReply, error) { + if err := s.checkDevice(ctx); err != nil { + return nil, err + } + + res := model.UpdateNote{VersionCode: req.Version} + if err := s.db.WithContext(ctx).First(&res).Error; errors.Is(err, gorm.ErrRecordNotFound) { + return nil, status.Error(codes.NotFound, "No update note found") + } else if err != nil { + log.WithField("VersionCode", req.Version).WithError(err).Error("Failed to get update note") + return nil, status.Error(codes.Internal, "Internal server error") + } + + return &pb.GetUpdateNoteReply{Message: res.Message, VersionName: res.VersionName}, nil +} diff --git a/server/backend/validators.go b/server/backend/validators.go index 6ebf670c..042c0a1d 100644 --- a/server/backend/validators.go +++ b/server/backend/validators.go @@ -2,6 +2,7 @@ package backend import ( "errors" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" ) diff --git a/server/go.mod b/server/go.mod index 431d82c0..e25b8ccb 100644 --- a/server/go.mod +++ b/server/go.mod @@ -6,23 +6,24 @@ require ( github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/disintegration/imaging v1.6.2 github.com/gabriel-vasile/mimetype v1.4.2 - github.com/getsentry/sentry-go v0.23.0 - github.com/go-gormigrate/gormigrate/v2 v2.1.0 + github.com/getsentry/sentry-go v0.24.1 + github.com/go-gormigrate/gormigrate/v2 v2.1.1 + github.com/gofrs/uuid/v5 v5.0.0 github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 github.com/guregu/null v4.0.0+incompatible github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/makasim/sentryhook v0.4.2 github.com/microcosm-cc/bluemonday v1.0.25 github.com/mmcdole/gofeed v1.2.1 - github.com/satori/go.uuid v1.2.0 + github.com/onrik/gorm-logrus v0.5.0 github.com/sirupsen/logrus v1.9.3 github.com/soheilhy/cmux v0.1.5 github.com/stretchr/testify v1.8.4 - golang.org/x/net v0.14.0 + golang.org/x/net v0.15.0 golang.org/x/sync v0.3.0 - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d - google.golang.org/grpc v1.57.0 + google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb + google.golang.org/grpc v1.58.0 google.golang.org/protobuf v1.31.0 gorm.io/driver/mysql v1.5.1 gorm.io/gorm v1.25.4 @@ -47,8 +48,8 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/image v0.5.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/server/go.sum b/server/go.sum index cfc63195..86e36c83 100644 --- a/server/go.sum +++ b/server/go.sum @@ -116,8 +116,8 @@ github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getsentry/sentry-go v0.17.0/go.mod h1:B82dxtBvxG0KaPD8/hfSV+VcHD+Lg/xUS4JuQn1P4cM= -github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= -github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= +github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= @@ -127,8 +127,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop 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-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gormigrate/gormigrate/v2 v2.1.0 h1:4/1xr9CjOox714EJWbxkF00lrNmbWJToSZzhykKKcKY= -github.com/go-gormigrate/gormigrate/v2 v2.1.0/go.mod h1:gpA97koYGyjqaiLDTmLE5W7nyYTmI26AYIf2a/earuo= +github.com/go-gormigrate/gormigrate/v2 v2.1.1 h1:eGS0WTFRV30r103lU8JNXY27KbviRnqqIDobW3EV3iY= +github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kRCk+E3UbV2f5gv+1ndLc= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -148,13 +148,11 @@ github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= +github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= @@ -238,8 +236,8 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 h1:LSsiG61v9IzzxMkqEr6nrix4miJI62xlRjwT7BYD2SM= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/guregu/null v4.0.0+incompatible h1:4zw0ckM7ECd6FNNddc3Fu4aty9nTlpkkzH7dPn4/4Gw= github.com/guregu/null v4.0.0+incompatible/go.mod h1:ePGpQaN9cw0tj45IR5E5ehMvsFlLlQZAkkOXZurJ3NM= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -275,18 +273,10 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/ github.com/iris-contrib/httpexpect/v2 v2.3.1/go.mod h1:ICTf89VBKSD3KB0fsyyHviKF8G8hyepP0dOXJPWz3T0= github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= -github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -350,15 +340,11 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mediocregopher/radix/v3 v3.8.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.20/go.mod h1:yfBmMi8mxvaZut3Yytv+jTXRY8mxyjJ0/kQBTElld50= github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= -github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= -github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -393,6 +379,8 @@ github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onrik/gorm-logrus v0.5.0 h1:JKeFH+j8AIpCDtsxHgteMtQeZtJ1k+M6UlUXwfkd2+o= +github.com/onrik/gorm-logrus v0.5.0/go.mod h1:QSx05I0N2V7M7ehsThQQmQE6K1H+drVYU2NQVNko4nw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -422,15 +410,12 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -545,8 +530,6 @@ golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 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= @@ -636,8 +619,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= 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= @@ -742,8 +725,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= @@ -758,8 +741,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 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.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -898,8 +881,8 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -922,8 +905,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= +google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -963,12 +946,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= -gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= -gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= -gorm.io/driver/sqlite v1.5.1 h1:hYyrLkAWE71bcarJDPdZNTLWtr8XrSjOWyjUYI6xdL4= -gorm.io/driver/sqlite v1.5.1/go.mod h1:7MZZ2Z8bqyfSQA1gYEV6MagQWj3cpUkJj9Z+d1HEMEQ= -gorm.io/driver/sqlserver v1.5.0 h1:zol7ePfY1XiPfjEvjjBh4VatIF3kycNcPE0EMCXznHY= -gorm.io/driver/sqlserver v1.5.0/go.mod h1:tBAqioK34BHl0Iiez+BFfG5/K9nDAlhLxRkgc2qy3+4= gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw= gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= diff --git a/server/main.go b/server/main.go index e7845af6..9e624b66 100644 --- a/server/main.go +++ b/server/main.go @@ -5,8 +5,6 @@ import ( "embed" "encoding/json" "errors" - "github.com/TUM-Dev/Campus-Backend/server/env" - "github.com/makasim/sentryhook" "io/fs" "net" "net/http" @@ -15,12 +13,16 @@ import ( "strings" "time" + "github.com/TUM-Dev/Campus-Backend/server/env" + "github.com/makasim/sentryhook" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend" "github.com/TUM-Dev/Campus-Backend/server/backend/cron" "github.com/TUM-Dev/Campus-Backend/server/backend/migration" "github.com/getsentry/sentry-go" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/onrik/gorm-logrus" log "github.com/sirupsen/logrus" "github.com/soheilhy/cmux" "golang.org/x/sync/errgroup" @@ -135,7 +137,7 @@ func setupDB() *gorm.DB { conn = mysql.Open(dbHost) } - db, err := gorm.Open(conn, &gorm.Config{}) + db, err := gorm.Open(conn, &gorm.Config{Logger: gorm_logrus.New()}) if err != nil { log.WithError(err).Panic("failed to connect database") } diff --git a/server/model/cafeteria.go b/server/model/cafeteria.go index 7a5988e5..a5c59582 100644 --- a/server/model/cafeteria.go +++ b/server/model/cafeteria.go @@ -2,7 +2,7 @@ package model // Cafeteria stores all Available cafeterias in the format of the eat-api type Cafeteria struct { - Cafeteria int32 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteria;type:int;not null;" json:"cafeteria" ` + Cafeteria int64 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteria;type:int;not null;" json:"canteen" ` Name string `gorm:"column:name;type:mediumtext;not null;" json:"name" ` Address string `gorm:"column:address;type:text;not null;" json:"address" ` Latitude float32 `gorm:"column:latitude;type:float;not null;" json:"latitude" ` diff --git a/server/model/cafeteriaRating.go b/server/model/cafeteriaRating.go index 1916d6b4..cfa5f686 100644 --- a/server/model/cafeteriaRating.go +++ b/server/model/cafeteriaRating.go @@ -6,10 +6,10 @@ import ( // CafeteriaRating stores all Available cafeterias in the format of the eat-api type CafeteriaRating struct { - CafeteriaRating int32 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteriaRating;type:int;not null;" json:"cafeteriarating"` + CafeteriaRating int64 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteriaRating;type:int;not null;" json:"canteenrating"` Points int32 `gorm:"column:points;type:int;not null;" json:"points"` Comment string `gorm:"column:comment;type:text;" json:"comment" ` - CafeteriaID int32 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` + CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"canteenID"` Timestamp time.Time `gorm:"column:timestamp;type:timestamp;not null;" json:"timestamp" ` Image string `gorm:"column:image;type:text;" json:"image"` } diff --git a/server/model/cafeteriaRatingAverage.go b/server/model/cafeteriaRatingAverage.go index 98c5401c..cb624a95 100644 --- a/server/model/cafeteriaRatingAverage.go +++ b/server/model/cafeteriaRatingAverage.go @@ -2,12 +2,12 @@ package model // CafeteriaRatingAverage stores all precomputed values for the cafeteria ratings type CafeteriaRatingAverage struct { - CafeteriaRatingAverage int32 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteriaRatingAverage;type:int;not null;" json:"cafeteriaRatingAverage" ` - CafeteriaID int32 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` - Average float32 `gorm:"column:average;type:float;not null;" json:"average" ` - Min int8 `gorm:"column:min;type:int;not null;" json:"min"` - Max int8 `gorm:"column:max;type:int;not null;" json:"max"` - Std float32 `gorm:"column:std;type:float;not null;" json:"std"` + CafeteriaRatingAverage int64 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteriaRatingAverage;type:int;not null;" json:"canteenRatingAverage" ` + CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"canteenID"` + Average float64 `gorm:"column:average;type:float;not null;" json:"average" ` + Min int32 `gorm:"column:min;type:int;not null;" json:"min"` + Max int32 `gorm:"column:max;type:int;not null;" json:"max"` + Std float64 `gorm:"column:std;type:float;not null;" json:"std"` } // TableName sets the insert table name for this struct type diff --git a/server/model/cafeteriaRatingTag.go b/server/model/cafeteriaRatingTag.go index d266d776..15e964b6 100644 --- a/server/model/cafeteriaRatingTag.go +++ b/server/model/cafeteriaRatingTag.go @@ -2,10 +2,10 @@ package model // CafeteriaRatingTag struct is a row record of the either the dish_tag_rating-table or the cafeteria_rating_tags-table in the database type CafeteriaRatingTag struct { - CafeteriaRatingTag int32 `gorm:"primary_key;AUTO_INCREMENT;column:CafeteriaRatingTag;type:int;not null;" json:"CafeteriaRatingTag" ` - CorrespondingRating int32 `gorm:"foreignKey:cafeteriaRatingID;column:correspondingRating;type:int;not null;" json:"correspondingRating"` + CafeteriaRatingTag int64 `gorm:"primary_key;AUTO_INCREMENT;column:CafeteriaRatingTag;type:int;not null;" json:"CanteenRatingTag" ` + CorrespondingRating int64 `gorm:"foreignKey:cafeteriaRatingID;column:correspondingRating;type:int;not null;" json:"correspondingRating"` Points int32 `gorm:"column:points;type:int;not null;" json:"points"` - TagID int `gorm:"foreignKey:cafeteriaRatingTagOption;column:tagID;type:int;not null;" json:"tagID"` + TagID int64 `gorm:"foreignKey:cafeteriaRatingTagOption;column:tagID;type:int;not null;" json:"tagID"` } // TableName sets the insert table name for this struct type diff --git a/server/model/cafeteriaRatingTagAverage.go b/server/model/cafeteriaRatingTagAverage.go index 56491327..6c1abeb7 100644 --- a/server/model/cafeteriaRatingTagAverage.go +++ b/server/model/cafeteriaRatingTagAverage.go @@ -2,10 +2,10 @@ package model // CafeteriaRatingTagsAverage stores all precomputed values for the cafeteria ratings type CafeteriaRatingTagsAverage struct { - CafeteriaRatingTagsAverage int32 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteriaRatingTagsAverage;type:int;not null;" json:"cafeteriaRatingTagsAverage" ` - CafeteriaID int32 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` - TagID int32 `gorm:"column:tagID;foreignKey:cafeteriaRatingTagOption;type:int;not null;" json:"tagID"` - Average float32 `gorm:"column:average;type:float;not null;" json:"average" ` + CafeteriaRatingTagsAverage int64 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteriaRatingTagsAverage;type:int;not null;" json:"canteenRatingTagsAverage"` + CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"canteenID"` + TagID int64 `gorm:"column:tagID;foreignKey:cafeteriaRatingTagOption;type:int;not null;" json:"tagID"` + Average float32 `gorm:"column:average;type:float;not null;" json:"average"` Min int8 `gorm:"column:min;type:int;not null;" json:"min"` Max int8 `gorm:"column:max;type:int;not null;" json:"max"` Std float32 `gorm:"column:std;type:float;not null;" json:"std"` diff --git a/server/model/cafeteriaRatingTagOptions.go b/server/model/cafeteriaRatingTagOptions.go index 0760ec34..e5d27d49 100644 --- a/server/model/cafeteriaRatingTagOptions.go +++ b/server/model/cafeteriaRatingTagOptions.go @@ -2,7 +2,7 @@ package model // CafeteriaRatingTagOption stores all available options for tags which can be used to quickly rate cafeterias type CafeteriaRatingTagOption struct { - CafeteriaRatingsTagOption int32 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteriaRatingTagOption;type:int;not null;" json:"cafeteriaRatingTagOption"` + CafeteriaRatingsTagOption int64 `gorm:"primary_key;AUTO_INCREMENT;column:cafeteriaRatingTagOption;type:int;not null;" json:"canteenRatingTagOption"` DE string `gorm:"column:DE;text;default:de;not null;" json:"DE"` EN string `gorm:"column:EN;text;default:en;not null;" json:"EN"` } diff --git a/server/model/crontab.go b/server/model/crontab.go index a4506833..183721e3 100644 --- a/server/model/crontab.go +++ b/server/model/crontab.go @@ -11,14 +11,9 @@ func (Crontab) TableName() string { // Crontab struct is a row record of the crontab table in the tca database type Crontab struct { - //[ 0] cron int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Cron int32 `gorm:"primary_key;AUTO_INCREMENT;column:cron;type:int;" json:"cron"` - //[ 1] interval int null: false primary: false isArray: false auto: false col: int len: -1 default: [7200] - Interval int32 `gorm:"column:interval;type:int;default:7200;" json:"interval"` - //[ 2] lastRun int null: false primary: false isArray: false auto: false col: int len: -1 default: [0] - LastRun int32 `gorm:"column:lastRun;type:int;default:0;" json:"last_run"` - //[ 3] type char(10) null: true primary: false isArray: false auto: false col: char len: 10 default: [] - Type null.String `gorm:"column:type;type:enum ('news', 'mensa', 'kino', 'roomfinder', 'alarm', 'fileDownload','dishNameDownload','averageRatingComputation', 'iosNotifications', 'iosActivityReset', 'canteenHeadCount');" json:"type"` - //[ 4] id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - ID null.Int `gorm:"column:id;type:int;" json:"id"` + Cron int64 `gorm:"primary_key;AUTO_INCREMENT;column:cron;type:int;" json:"cron"` + Interval int32 `gorm:"column:interval;type:int;default:7200;" json:"interval"` + LastRun int32 `gorm:"column:lastRun;type:int;default:0;" json:"last_run"` + Type null.String `gorm:"column:type;type:enum ('news', 'mensa', 'kino', 'roomfinder', 'alarm', 'fileDownload','dishNameDownload','averageRatingComputation', 'iosNotifications', 'iosActivityReset', 'canteenHeadCount');" json:"type"` + ID null.Int `gorm:"column:id;type:int;" json:"id"` } diff --git a/server/model/devices.go b/server/model/devices.go index 6f179a75..205a5ae9 100755 --- a/server/model/devices.go +++ b/server/model/devices.go @@ -8,38 +8,21 @@ import ( // Devices struct is a row record of the devices table in the tca database type Devices struct { - //[ 0] device int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Device int32 `gorm:"primary_key;AUTO_INCREMENT;column:device;type:int;" json:"device"` - //[ 1] member int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - Member null.Int `gorm:"column:member;type:int;" json:"member"` - //[ 2] uuid varchar(50) null: false primary: false isArray: false auto: false col: varchar len: 50 default: [] - UUID string `gorm:"column:uuid;type:varchar(50);" json:"uuid"` - //[ 3] created timestamp null: true primary: false isArray: false auto: false col: timestamp len: -1 default: [] - Created null.Time `gorm:"column:created;type:timestamp;" json:"created"` - //[ 4] lastAccess timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [0000-00-00 00:00:00] - LastAccess time.Time `gorm:"column:lastAccess;type:timestamp;default:0000-00-00 00:00:00;" json:"last_access"` - //[ 5] lastApi text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - LastAPI string `gorm:"column:lastApi;type:text;size:16777215;" json:"last_api"` - //[ 6] developer char(5) null: false primary: false isArray: false auto: false col: char len: 5 default: [false] - Developer string `gorm:"column:developer;type:char;size:5;default:false;" json:"developer"` - //[ 7] osVersion text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - OsVersion string `gorm:"column:osVersion;type:text;size:16777215;" json:"os_version"` - //[ 8] appVersion text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - AppVersion string `gorm:"column:appVersion;type:text;size:16777215;" json:"app_version"` - //[ 9] counter int null: false primary: false isArray: false auto: false col: int len: -1 default: [0] - Counter int32 `gorm:"column:counter;type:int;default:0;" json:"counter"` - //[10] pk text(4294967295) null: true primary: false isArray: false auto: false col: text len: 4294967295 default: [] - Pk null.String `gorm:"column:pk;type:text;size:4294967295;" json:"pk"` - //[11] pkActive char(5) null: false primary: false isArray: false auto: false col: char len: 5 default: [false] - PkActive string `gorm:"column:pkActive;type:char;size:5;default:false;" json:"pk_active"` - //[12] gcmToken text(65535) null: true primary: false isArray: false auto: false col: text len: 65535 default: [] - GcmToken null.String `gorm:"column:gcmToken;type:text;size:65535;" json:"gcm_token"` - //[13] gcmStatus varchar(200) null: true primary: false isArray: false auto: false col: varchar len: 200 default: [] - GcmStatus null.String `gorm:"column:gcmStatus;type:varchar(200);" json:"gcm_status"` - //[14] confirmationKey varchar(35) null: true primary: false isArray: false auto: false col: varchar len: 35 default: [] + Device int64 `gorm:"primary_key;AUTO_INCREMENT;column:device;type:int;" json:"device"` + Member null.Int `gorm:"column:member;type:int;" json:"member"` + UUID string `gorm:"column:uuid;type:varchar(50);" json:"uuid"` + Created null.Time `gorm:"column:created;type:timestamp;" json:"created"` + LastAccess time.Time `gorm:"column:lastAccess;type:timestamp;default:0000-00-00 00:00:00;" json:"last_access"` + LastAPI string `gorm:"column:lastApi;type:text;size:16777215;" json:"last_api"` + Developer string `gorm:"column:developer;type:char;size:5;default:false;" json:"developer"` + OsVersion string `gorm:"column:osVersion;type:text;size:16777215;" json:"os_version"` + AppVersion string `gorm:"column:appVersion;type:text;size:16777215;" json:"app_version"` + Counter int32 `gorm:"column:counter;type:int;default:0;" json:"counter"` + Pk null.String `gorm:"column:pk;type:text;size:4294967295;" json:"pk"` + PkActive string `gorm:"column:pkActive;type:char;size:5;default:false;" json:"pk_active"` + GcmToken null.String `gorm:"column:gcmToken;type:text;size:65535;" json:"gcm_token"` + GcmStatus null.String `gorm:"column:gcmStatus;type:varchar(200);" json:"gcm_status"` ConfirmationKey null.String `gorm:"column:confirmationKey;type:varchar(35);" json:"confirmation_key"` - //[15] keyCreated datetime null: true primary: false isArray: false auto: false col: datetime len: -1 default: [] - KeyCreated null.Time `gorm:"column:keyCreated;type:datetime;" json:"key_created"` - //[16] keyConfirmed datetime null: true primary: false isArray: false auto: false col: datetime len: -1 default: [] - KeyConfirmed null.Time `gorm:"column:keyConfirmed;type:datetime;" json:"key_confirmed"` + KeyCreated null.Time `gorm:"column:keyCreated;type:datetime;" json:"key_created"` + KeyConfirmed null.Time `gorm:"column:keyConfirmed;type:datetime;" json:"key_confirmed"` } diff --git a/server/model/dish.go b/server/model/dish.go index 9737bd8b..7ab5c4d7 100644 --- a/server/model/dish.go +++ b/server/model/dish.go @@ -2,6 +2,7 @@ package model import ( "database/sql" + "github.com/guregu/null" ) @@ -12,10 +13,10 @@ var ( // Dish represents one dish fin a specific cafeteria type Dish struct { - Dish int32 `gorm:"primary_key;AUTO_INCREMENT;column:dish;type:int;not null;" json:"dish"` + Dish int64 `gorm:"primary_key;AUTO_INCREMENT;column:dish;type:int;not null;" json:"dish"` Name string `gorm:"column:name;type:text;not null;" json:"name" ` Type string `gorm:"column:type;type:text;not null;" json:"type" ` - CafeteriaID int32 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` + CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` } // TableName sets the insert table name for this struct type diff --git a/server/model/dishNameTag.go b/server/model/dishNameTag.go index f7795451..1dc52ab4 100644 --- a/server/model/dishNameTag.go +++ b/server/model/dishNameTag.go @@ -1,10 +1,10 @@ package model type DishNameTag struct { - DishNameTag int32 `gorm:"primary_key;AUTO_INCREMENT;column:DishNameTag;type:int;not null;" json:"DishNameTag"` - CorrespondingRating int32 `gorm:"foreignKey:dish;column:correspondingRating;type:int;not null;" json:"correspondingRating"` + DishNameTag int64 `gorm:"primary_key;AUTO_INCREMENT;column:DishNameTag;type:int;not null;" json:"DishNameTag"` + CorrespondingRating int64 `gorm:"foreignKey:dish;column:correspondingRating;type:int;not null;" json:"correspondingRating"` Points int32 `gorm:"column:points;type:int;not null;" json:"points"` - TagNameID int `gorm:"foreignKey:tagRatingID;column:tagNameID;type:int;not null;" json:"tagnameID"` + TagNameID int64 `gorm:"foreignKey:tagRatingID;column:tagNameID;type:int;not null;" json:"tagnameID"` } // TableName sets the insert table name for this struct type diff --git a/server/model/dishNameTagAverage.go b/server/model/dishNameTagAverage.go index 8fe17548..2ee05076 100644 --- a/server/model/dishNameTagAverage.go +++ b/server/model/dishNameTagAverage.go @@ -2,9 +2,9 @@ package model // DishNameTagAverage stores all precomputed values for the DishName ratings type DishNameTagAverage struct { - DishNameTagAverage int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishNameTagAverage;type:int;not null;" json:"dishNameTagAverage" ` - CafeteriaID int32 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` - TagID int32 `gorm:"column:tagID;foreignKey:DishNameTagOption;type:int;not null;" json:"tagID"` + DishNameTagAverage int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishNameTagAverage;type:int;not null;" json:"dishNameTagAverage" ` + CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` + TagID int64 `gorm:"column:tagID;foreignKey:DishNameTagOption;type:int;not null;" json:"tagID"` Average float32 `gorm:"column:average;type:float;not null;" json:"average" ` Min int8 `gorm:"column:min;type:int;not null;" json:"min"` Max int8 `gorm:"column:max;type:int;not null;" json:"max"` diff --git a/server/model/dishNameTagOption.go b/server/model/dishNameTagOption.go index 17a14462..143eb8a4 100644 --- a/server/model/dishNameTagOption.go +++ b/server/model/dishNameTagOption.go @@ -1,7 +1,7 @@ package model type DishNameTagOption struct { - DishNameTagOption int32 `gorm:"column:dishNameTagOption;type:int;primary_key;AUTO_INCREMENT;not null;" json:"dishNameTagOption"` + DishNameTagOption int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishNameTagOption;type:int;not null;" json:"dishNameTagOption"` DE string `gorm:"column:DE;type:text;not null;" json:"DE"` EN string `gorm:"column:EN;type:text;not null;" json:"EN"` } diff --git a/server/model/dishNameTagOptionExcluded.go b/server/model/dishNameTagOptionExcluded.go index 7c8e6deb..f957ed11 100644 --- a/server/model/dishNameTagOptionExcluded.go +++ b/server/model/dishNameTagOptionExcluded.go @@ -1,8 +1,8 @@ package model type DishNameTagOptionExcluded struct { - DishNameTagOptionExcluded int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishNameTagOptionExcluded;type:int;not null;" json:"dishNameTagOptionExcluded"` - NameTagID int32 `gorm:"foreignKey:dishNameTagOption;column:nameTagID;type:int;not null;" json:"nameTagID"` + DishNameTagOptionExcluded int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishNameTagOptionExcluded;type:int;not null;" json:"dishNameTagOptionExcluded"` + NameTagID int64 `gorm:"foreignKey:dishNameTagOption;column:nameTagID;type:int;not null;" json:"nameTagID"` Expression string `gorm:"column:expression;type:text;" json:"expression"` } diff --git a/server/model/dishNameTagOptionIncluded.go b/server/model/dishNameTagOptionIncluded.go index 8ed262f0..ddd7683d 100644 --- a/server/model/dishNameTagOptionIncluded.go +++ b/server/model/dishNameTagOptionIncluded.go @@ -1,8 +1,8 @@ package model type DishNameTagOptionIncluded struct { - DishNameTagOptionIncluded int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishNameTagOptionIncluded;type:int;not null;" json:"dishNameTagOptionIncluded"` - NameTagID int32 `gorm:"foreignKey:dishNameTagOption;column:nameTagID;type:int;not null;" json:"nameTagID"` + DishNameTagOptionIncluded int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishNameTagOptionIncluded;type:int;not null;" json:"dishNameTagOptionIncluded"` + NameTagID int64 `gorm:"foreignKey:dishNameTagOption;column:nameTagID;type:int;not null;" json:"nameTagID"` Expression string `gorm:"column:expression;type:text;" json:"expression"` } diff --git a/server/model/dishRating.go b/server/model/dishRating.go index e31086f0..7b8e7f93 100644 --- a/server/model/dishRating.go +++ b/server/model/dishRating.go @@ -5,10 +5,10 @@ import ( ) type DishRating struct { - DishRating int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishRating;type:int;not null;" json:"dishRating"` + DishRating int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishRating;type:int;not null;" json:"dishRating"` Points int32 `gorm:"column:points;type:int;not null;" json:"points"` - CafeteriaID int32 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` - DishID int32 `gorm:"column:dishID;foreignKey:dish;type:int;not null;" json:"dishID"` + CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` + DishID int64 `gorm:"column:dishID;foreignKey:dish;type:int;not null;" json:"dishID"` Comment string `gorm:"column:comment;type:text;" json:"comment"` Timestamp time.Time `gorm:"column:timestamp;type:timestamp;not null;" json:"timestamp"` Image string `gorm:"column:image;type:text;" json:"image"` diff --git a/server/model/dishRatingAverage.go b/server/model/dishRatingAverage.go index 61ed1374..2db0571c 100644 --- a/server/model/dishRatingAverage.go +++ b/server/model/dishRatingAverage.go @@ -2,13 +2,13 @@ package model // DishRatingAverage stores all precomputed values for the cafeteria ratings type DishRatingAverage struct { - DishRatingAverage int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishRatingAverage;type:int;not null;" json:"dishRatingAverage" ` - CafeteriaID int32 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` - DishID int32 `gorm:"column:dishID;foreignKey:dish;type:int;not null;" json:"dishID"` - Average float32 `gorm:"column:average;type:float;not null;" json:"average" ` - Min int8 `gorm:"column:min;type:int;not null;" json:"min"` - Max int8 `gorm:"column:max;type:int;not null;" json:"max"` - Std float32 `gorm:"column:std;type:float;not null;" json:"std"` + DishRatingAverage int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishRatingAverage;type:int;not null;" json:"dishRatingAverage" ` + CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` + DishID int64 `gorm:"column:dishID;foreignKey:dish;type:int;not null;" json:"dishID"` + Average float64 `gorm:"column:average;type:float;not null;" json:"average" ` + Min int32 `gorm:"column:min;type:int;not null;" json:"min"` + Max int32 `gorm:"column:max;type:int;not null;" json:"max"` + Std float64 `gorm:"column:std;type:float;not null;" json:"std"` } // TableName sets the insert table name for this struct type diff --git a/server/model/dishRatingTag.go b/server/model/dishRatingTag.go index d5248c3c..de2bda74 100644 --- a/server/model/dishRatingTag.go +++ b/server/model/dishRatingTag.go @@ -1,10 +1,10 @@ package model type DishRatingTag struct { - DishRatingTag int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishRatingTag;type:int;not null;" json:"dishRatingTag"` - CorrespondingRating int32 `gorm:"foreignKey:cafeteriaRating;column:parentRating;type:int;not null;" json:"parentRating"` + DishRatingTag int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishRatingTag;type:int;not null;" json:"dishRatingTag"` + CorrespondingRating int64 `gorm:"foreignKey:cafeteriaRating;column:parentRating;type:int;not null;" json:"parentRating"` Points int32 `gorm:"column:points;type:int;not null;" json:"points"` - TagID int `gorm:"foreignKey:dishRatingTagOption;column:tagID;type:int;not null;" json:"tagID"` + TagID int64 `gorm:"foreignKey:dishRatingTagOption;column:tagID;type:int;not null;" json:"tagID"` } // TableName sets the insert table name for this struct type diff --git a/server/model/dishRatingTagAverage.go b/server/model/dishRatingTagAverage.go index b7b1d0c7..b1535171 100644 --- a/server/model/dishRatingTagAverage.go +++ b/server/model/dishRatingTagAverage.go @@ -2,10 +2,10 @@ package model // DishRatingTagAverage stores all precomputed values for the cafeteria ratings type DishRatingTagAverage struct { - DishRatingTagsAverage int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishRatingTagsAverage;type:int;not null;" json:"dishRatingTagsAverage" ` - CafeteriaID int32 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` - TagID int32 `gorm:"column:tagID;foreignKey:tagID;type:int;not null;" json:"tagID"` - DishID int32 `gorm:"column:dishID;foreignKey:dishID;type:int;not null;" json:"dishID"` + DishRatingTagsAverage int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishRatingTagsAverage;type:int;not null;" json:"dishRatingTagsAverage" ` + CafeteriaID int64 `gorm:"column:cafeteriaID;foreignKey:cafeteria;type:int;not null;" json:"cafeteriaID"` + TagID int64 `gorm:"column:tagID;foreignKey:tagID;type:int;not null;" json:"tagID"` + DishID int64 `gorm:"column:dishID;foreignKey:dishID;type:int;not null;" json:"dishID"` Average float32 `gorm:"column:average;type:float;not null;" json:"average" ` Min int8 `gorm:"column:min;type:int;not null;" json:"min"` Max int8 `gorm:"column:max;type:int;not null;" json:"max"` diff --git a/server/model/dishRatingTagOption.go b/server/model/dishRatingTagOption.go index c1aeb01a..c1cbece0 100644 --- a/server/model/dishRatingTagOption.go +++ b/server/model/dishRatingTagOption.go @@ -2,7 +2,7 @@ package model // DishRatingTagOption stores all available options for tags which can be used to quickly rate dishes type DishRatingTagOption struct { - DishRatingTagOption int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishRatingTagOption;type:int;not null;" json:"dishRatingTagOption"` + DishRatingTagOption int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishRatingTagOption;type:int;not null;" json:"dishRatingTagOption"` DE string `gorm:"column:DE;type:text;default:de;not null;" json:"DE"` EN string `gorm:"column:EN;type:text;default:en;not null;" json:"EN"` } diff --git a/server/model/dishToDishNameTags.go b/server/model/dishToDishNameTags.go index 4c40080b..279ff1c5 100644 --- a/server/model/dishToDishNameTags.go +++ b/server/model/dishToDishNameTags.go @@ -1,9 +1,9 @@ package model type DishToDishNameTag struct { - DishToDishNameTag int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishToDishNameTag;type:int;not null;" json:"dishToDishNameTag"` - DishID int32 `gorm:"column:dishID;foreignKey:dish;type:int;not null;" json:"dishID"` - NameTagID int32 `gorm:"foreignKey:dishNameTagOption;column:nameTagID;type:int;not null;" json:"nameTagID"` + DishToDishNameTag int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishToDishNameTag;type:int;not null;" json:"dishToDishNameTag"` + DishID int64 `gorm:"column:dishID;foreignKey:dish;type:int;not null;" json:"dishID"` + NameTagID int64 `gorm:"foreignKey:dishNameTagOption;column:nameTagID;type:int;not null;" json:"nameTagID"` } // TableName sets the insert table name for this struct type diff --git a/server/model/dishesOfTheWeek.go b/server/model/dishesOfTheWeek.go index 7aa72331..219c306d 100644 --- a/server/model/dishesOfTheWeek.go +++ b/server/model/dishesOfTheWeek.go @@ -1,11 +1,11 @@ package model type DishesOfTheWeek struct { - DishesOfTheWeek int32 `gorm:"primary_key;AUTO_INCREMENT;column:dishesOfTheWeek;type:int;not null;" json:"dishesOfTheWeek"` + DishesOfTheWeek int64 `gorm:"primary_key;AUTO_INCREMENT;column:dishesOfTheWeek;type:int;not null;" json:"dishesOfTheWeek"` Year int32 `gorm:"column:year;type:int;not null;" json:"year"` Week int32 `gorm:"column:week;type:int;not null;" json:"week"` Day int32 `gorm:"column:day;type:int;not null;" json:"day"` - DishID int32 `gorm:"column:dishID;foreignKey:dish;type:int;not null;" json:"dishID"` + DishID int64 `gorm:"column:dishID;foreignKey:dish;type:int;not null;" json:"dishID"` } // TableName sets the insert table name for this struct type diff --git a/server/model/files.go b/server/model/files.go index d683253a..430bb247 100644 --- a/server/model/files.go +++ b/server/model/files.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,16 +17,12 @@ var ( // Files struct is a row record of the files table in the tca database type Files struct { - //[ 0] file int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - File int32 `gorm:"primary_key;AUTO_INCREMENT;column:file;type:int;" json:"file"` - //[ 1] name text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - Name string `gorm:"column:name;type:text;size:16777215;" json:"name"` - //[ 2] path text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - Path string `gorm:"column:path;type:text;size:16777215;" json:"path"` - //[ 3] downloads int null: false primary: false isArray: false auto: false col: int len: -1 default: [0] - Downloads int32 `gorm:"column:downloads;type:int;default:0;" json:"downloads"` - URL sql.NullString `gorm:"column:url;default:null;" json:"url"` // URL of the files source (if any) - Downloaded sql.NullBool `gorm:"column:downloaded;type:boolean;default:1;" json:"downloaded"` // true when file is ready to be served, false when still being downloaded + File int64 `gorm:"primary_key;AUTO_INCREMENT;column:file;type:int;" json:"file"` + Name string `gorm:"column:name;type:text;size:16777215;" json:"name"` + Path string `gorm:"column:path;type:text;size:16777215;" json:"path"` + Downloads int32 `gorm:"column:downloads;type:int;default:0;" json:"downloads"` + URL null.String `gorm:"column:url;default:null;" json:"url"` // URL of the files source (if any) + Downloaded null.Bool `gorm:"column:downloaded;type:boolean;default:1;" json:"downloaded"` // true when file is ready to be served, false when still being downloaded } // TableName sets the insert table name for this struct type diff --git a/server/model/iosDeviceLastUpdated.go b/server/model/iosDeviceLastUpdated.go index d06c185e..be79699c 100644 --- a/server/model/iosDeviceLastUpdated.go +++ b/server/model/iosDeviceLastUpdated.go @@ -1,16 +1,17 @@ package model import ( - "database/sql" "fmt" + + "github.com/guregu/null" ) // IOSDeviceLastUpdated used as a result of a query that joins // IOSDevice and IOSDeviceRequestLog tables. type IOSDeviceLastUpdated struct { - DeviceID string `json:"deviceId"` - LastUpdated sql.NullTime `json:"lastUpdated"` - PublicKey string `json:"publicKey"` + DeviceID string `json:"deviceId"` + LastUpdated null.Time `json:"lastUpdated"` + PublicKey string `json:"publicKey"` } func (device *IOSDeviceLastUpdated) String() string { diff --git a/server/model/iosRemoteNotification.go b/server/model/iosRemoteNotification.go index bca828b5..4c7464c9 100644 --- a/server/model/iosRemoteNotification.go +++ b/server/model/iosRemoteNotification.go @@ -4,6 +4,7 @@ package model import ( "encoding/json" + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_crypto" ) diff --git a/server/model/iosScheduledUpdateLog.go b/server/model/iosScheduledUpdateLog.go index 0399e303..8a3c495e 100644 --- a/server/model/iosScheduledUpdateLog.go +++ b/server/model/iosScheduledUpdateLog.go @@ -12,7 +12,7 @@ const ( // IOSScheduledUpdateLog logs the last time a device was updated. type IOSScheduledUpdateLog struct { - ID uint32 `gorm:"primary_key;auto_increment;not_null" json:"id"` + ID int64 `gorm:"primary_key;auto_increment;not_null" json:"id"` DeviceID string `gorm:"index:idx_scheduled_update_log_device,unique" json:"deviceId"` Device IOSDevice `gorm:"constraint:OnDelete:CASCADE;" json:"device"` Type string `gorm:"type:enum ('grades');" json:"type"` diff --git a/server/model/iosSchedulingPriority.go b/server/model/iosSchedulingPriority.go index ffbb3300..39bd9ab5 100644 --- a/server/model/iosSchedulingPriority.go +++ b/server/model/iosSchedulingPriority.go @@ -8,12 +8,12 @@ import ( // IOSSchedulingPriority stores some default priorities for the scheduling of // grade updates. type IOSSchedulingPriority struct { - ID int `gorm:"primary_key;auto_increment;not_null" json:"id"` - FromDay int `gorm:"not null" json:"from_day"` - ToDay int `gorm:"not null" json:"to_day"` - FromHour int `gorm:"not null" json:"from_hour"` - ToHour int `gorm:"not null" json:"to_hour"` - Priority int `gorm:"not null" json:"priority"` + ID int64 `gorm:"primary_key;auto_increment;not_null" json:"id"` + FromDay int `gorm:"not null" json:"from_day"` + ToDay int `gorm:"not null" json:"to_day"` + FromHour int `gorm:"not null" json:"from_hour"` + ToHour int `gorm:"not null" json:"to_hour"` + Priority int `gorm:"not null" json:"priority"` } // IsCurrentlyInRange returns true if the current time is in the range of the diff --git a/server/model/ios_grade.go b/server/model/ios_grade.go index 5bd8c31b..a4fdb061 100644 --- a/server/model/ios_grade.go +++ b/server/model/ios_grade.go @@ -2,8 +2,9 @@ package model import ( "encoding/xml" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_crypto" "time" + + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_crypto" ) // IOSGrades is a wrapper for a list of grades => XML stuff @@ -54,7 +55,7 @@ func (grade *IOSGrade) CompareToEncrypted(encryptedGrade *IOSEncryptedGrade) boo // IOSEncryptedGrade is a grade that can be encrypted. // Whether it is currently encrypted or not is indicated by the IsEncrypted field. type IOSEncryptedGrade struct { - ID uint `gorm:"primaryKey"` + ID int64 `gorm:"primaryKey"` Device IOSDevice `gorm:"constraint:OnDelete:CASCADE"` DeviceID string `gorm:"index;not null"` LectureTitle string `gorm:"not null"` diff --git a/server/model/news.go b/server/model/news.go index 4ea2e5bd..4cabb46c 100755 --- a/server/model/news.go +++ b/server/model/news.go @@ -15,24 +15,16 @@ var ( // News struct is a row record of the news table in the tca database type News struct { - //[ 0] news int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - News int32 `gorm:"primary_key;AUTO_INCREMENT;column:news;type:int;" json:"news"` - //[ 1] date datetime null: false primary: false isArray: false auto: false col: datetime len: -1 default: [] - Date time.Time `gorm:"column:date;type:datetime;" json:"date"` - //[ 2] created timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [CURRENT_TIMESTAMP] - Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` - //[ 3] title text(255) null: false primary: false isArray: false auto: false col: text len: 255 default: [] - Title string `gorm:"column:title;type:text;size:255;" json:"title"` - //[ 4] description text(65535) null: false primary: false isArray: false auto: false col: text len: 65535 default: [] - Description string `gorm:"column:description;type:text;size:65535;" json:"description"` - //[ 5] src int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Src int32 `gorm:"column:src;type:int;" json:"src"` - //[ 6] link varchar(190) null: false primary: false isArray: false auto: false col: varchar len: 190 default: [] - Link string `gorm:"column:link;type:varchar(190);" json:"link"` - //[ 7] image text(65535) null: true primary: false isArray: false auto: false col: text len: 65535 default: [] - Image null.String `gorm:"column:image;type:text;size:65535;" json:"image"` - //[ 8] file int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - File null.Int `gorm:"column:file;type:int;" json:"file"` + News int64 `gorm:"primary_key;AUTO_INCREMENT;column:news;type:int;"` + Date time.Time `gorm:"column:date;type:datetime;"` + Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;"` + Title string `gorm:"column:title;type:text;size:255;"` + Description string `gorm:"column:description;type:text;size:65535;"` + Src int64 `gorm:"column:src;type:int;"` + Link string `gorm:"column:link;type:varchar(190);"` + Image null.String `gorm:"column:image;type:text;size:65535;"` + FilesID null.Int `gorm:"column:file;type:int;"` + Files *Files `gorm:"foreignKey:FilesID;references:file;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"` } // TableName sets the insert table name for this struct type diff --git a/server/model/news_alert.go b/server/model/news_alert.go index 0bf502a6..55a2a65f 100644 --- a/server/model/news_alert.go +++ b/server/model/news_alert.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,8 +17,8 @@ var ( // NewsAlert struct is a row record of the news_alert table in the tca database type NewsAlert struct { - NewsAlert int32 `gorm:"primary_key;AUTO_INCREMENT;column:news_alert;type:int;" json:"news_alert"` - FilesID int32 `gorm:"column:file;not null"` + NewsAlert int64 `gorm:"primary_key;AUTO_INCREMENT;column:news_alert;type:int;" json:"news_alert"` + FilesID int64 `gorm:"column:file;not null"` Files Files `gorm:"foreignKey:FilesID;references:file;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"` Name null.String `gorm:"column:name;type:varchar(100);" json:"name"` Link null.String `gorm:"column:link;type:text;size:65535;" json:"link"` diff --git a/server/model/news_source.go b/server/model/news_source.go index c1b3925d..94d06a2b 100644 --- a/server/model/news_source.go +++ b/server/model/news_source.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,10 +17,10 @@ var ( // NewsSource struct is a row record of the newsSource table in the tca database type NewsSource struct { - Source int32 `gorm:"primary_key;AUTO_INCREMENT;column:source;type:int;"` + Source int64 `gorm:"primary_key;AUTO_INCREMENT;column:source;type:int;"` Title string `gorm:"column:title;type:text;size:16777215;"` URL null.String `gorm:"column:url;type:text;size:16777215;"` - FilesID int32 `gorm:"column:icon;not null"` + FilesID int64 `gorm:"column:icon;not null"` Files Files `gorm:"foreignKey:FilesID;references:file;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"` Hook null.String `gorm:"column:hook;type:char;size:12;"` } diff --git a/server/model/notification.go b/server/model/notification.go index 0acb42a0..8c93943d 100644 --- a/server/model/notification.go +++ b/server/model/notification.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,20 +17,12 @@ var ( // Notification struct is a row record of the notification table in the tca database type Notification struct { - //[ 0] notification int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Notification int32 `gorm:"primary_key;AUTO_INCREMENT;column:notification;type:int;" json:"notification"` - //[ 1] type int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Type int32 `gorm:"column:type;type:int;" json:"type"` - //[ 2] location int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - Location null.Int `gorm:"column:location;type:int;" json:"location"` - //[ 3] title text(65535) null: false primary: false isArray: false auto: false col: text len: 65535 default: [] - Title string `gorm:"column:title;type:text;size:65535;" json:"title"` - //[ 4] description text(65535) null: false primary: false isArray: false auto: false col: text len: 65535 default: [] - Description string `gorm:"column:description;type:text;size:65535;" json:"description"` - //[ 5] created timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [CURRENT_TIMESTAMP] - Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` - //[ 6] signature text(65535) null: true primary: false isArray: false auto: false col: text len: 65535 default: [] - Signature null.String `gorm:"column:signature;type:text;size:65535;" json:"signature"` - //[ 7] silent tinyint null: false primary: false isArray: false auto: false col: tinyint len: -1 default: [0] - Silent int32 `gorm:"column:silent;type:tinyint;default:0;" json:"silent"` + Notification int64 `gorm:"primary_key;AUTO_INCREMENT;column:notification;type:int;" json:"notification"` + Type int32 `gorm:"column:type;type:int;" json:"type"` + Location null.Int `gorm:"column:location;type:int;" json:"location"` + Title string `gorm:"column:title;type:text;size:65535;" json:"title"` + Description string `gorm:"column:description;type:text;size:65535;" json:"description"` + Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` + Signature null.String `gorm:"column:signature;type:text;size:65535;" json:"signature"` + Silent int32 `gorm:"column:silent;type:tinyint;default:0;" json:"silent"` } diff --git a/server/model/notification_confirmation.go b/server/model/notification_confirmation.go index 94b532a3..f5b6a39c 100644 --- a/server/model/notification_confirmation.go +++ b/server/model/notification_confirmation.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,14 +17,9 @@ var ( // NotificationConfirmation struct is a row record of the notification_confirmation table in the tca database type NotificationConfirmation struct { - //[ 0] notification int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - Notification int32 `gorm:"primary_key;column:notification;type:int;" json:"notification"` - //[ 1] device int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - Device int32 `gorm:"primary_key;column:device;type:int;" json:"device"` - //[ 2] sent tinyint null: false primary: false isArray: false auto: false col: tinyint len: -1 default: [0] - Sent int32 `gorm:"column:sent;type:tinyint;default:0;" json:"sent"` - //[ 3] created timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [CURRENT_TIMESTAMP] - Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` - //[ 4] received timestamp null: true primary: false isArray: false auto: false col: timestamp len: -1 default: [] - Received null.Time `gorm:"column:received;type:timestamp;" json:"received"` + Notification int64 `gorm:"primary_key;column:notification;type:int;" json:"notification"` + Device int64 `gorm:"primary_key;column:device;type:int;" json:"device"` + Sent int32 `gorm:"column:sent;type:tinyint;default:0;" json:"sent"` + Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` + Received null.Time `gorm:"column:received;type:timestamp;" json:"received"` } diff --git a/server/model/notification_type.go b/server/model/notification_type.go index dcd355c1..661383d7 100644 --- a/server/model/notification_type.go +++ b/server/model/notification_type.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,10 +17,7 @@ var ( // NotificationType struct is a row record of the notification_type table in the tca database type NotificationType struct { - //[ 0] type int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Type int32 `gorm:"primary_key;AUTO_INCREMENT;column:type;type:int;" json:"type"` - //[ 1] name text(65535) null: false primary: false isArray: false auto: false col: text len: 65535 default: [] - Name string `gorm:"column:name;type:text;size:65535;" json:"name"` - //[ 2] confirmation char(5) null: false primary: false isArray: false auto: false col: char len: 5 default: [false] + Type int64 `gorm:"primary_key;AUTO_INCREMENT;column:type;type:int;" json:"type"` + Name string `gorm:"column:name;type:text;size:65535;" json:"name"` Confirmation string `gorm:"column:confirmation;type:char;size:5;default:false;" json:"confirmation"` } diff --git a/server/model/roomfinder_building2area.go b/server/model/roomfinder_building2area.go index 0b3837ea..4f72cda4 100644 --- a/server/model/roomfinder_building2area.go +++ b/server/model/roomfinder_building2area.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,14 +17,10 @@ var ( // RoomfinderBuilding2area struct is a row record of the roomfinder_building2area table in the tca database type RoomfinderBuilding2area struct { - //[ 0] area_id int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - AreaID int32 `gorm:"column:area_id;type:int;" json:"area_id"` - //[ 1] building_nr varchar(8) null: false primary: true isArray: false auto: false col: varchar len: 8 default: [] BuildingNr string `gorm:"primary_key;column:building_nr;type:varchar(8);" json:"building_nr"` - //[ 2] campus char(1) null: false primary: false isArray: false auto: false col: char len: 1 default: [] - Campus string `gorm:"column:campus;type:char;size:1;" json:"campus"` - //[ 3] name varchar(32) null: false primary: false isArray: false auto: false col: varchar len: 32 default: [] - Name string `gorm:"column:name;type:varchar(32);" json:"name"` + AreaID int32 `gorm:"column:area_id;type:int;" json:"area_id"` + Campus string `gorm:"column:campus;type:char;size:1;" json:"campus"` + Name string `gorm:"column:name;type:varchar(32);" json:"name"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_buildings.go b/server/model/roomfinder_buildings.go index 13a00c46..24616e88 100644 --- a/server/model/roomfinder_buildings.go +++ b/server/model/roomfinder_buildings.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,16 +17,11 @@ var ( // RoomfinderBuildings struct is a row record of the roomfinder_buildings table in the tca database type RoomfinderBuildings struct { - //[ 0] building_nr varchar(8) null: false primary: true isArray: false auto: false col: varchar len: 8 default: [] - BuildingNr string `gorm:"primary_key;column:building_nr;type:varchar(8);" json:"building_nr"` - //[ 1] utm_zone varchar(4) null: true primary: false isArray: false auto: false col: varchar len: 4 default: [] - UtmZone null.String `gorm:"column:utm_zone;type:varchar(4);" json:"utm_zone"` - //[ 2] utm_easting varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - UtmEasting null.String `gorm:"column:utm_easting;type:varchar(32);" json:"utm_easting"` - //[ 3] utm_northing varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - UtmNorthing null.String `gorm:"column:utm_northing;type:varchar(32);" json:"utm_northing"` - //[ 4] default_map_id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - DefaultMapID null.Int `gorm:"column:default_map_id;type:int;" json:"default_map_id"` + BuildingNr string `gorm:"primary_key;column:building_nr;type:varchar(8);" json:"building_nr"` + UtmZone null.String `gorm:"column:utm_zone;type:varchar(4);" json:"utm_zone"` + UtmEasting null.String `gorm:"column:utm_easting;type:varchar(32);" json:"utm_easting"` + UtmNorthing null.String `gorm:"column:utm_northing;type:varchar(32);" json:"utm_northing"` + DefaultMapID null.Int `gorm:"column:default_map_id;type:int;" json:"default_map_id"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_buildings2gps.go b/server/model/roomfinder_buildings2gps.go index d9604eab..ba428520 100644 --- a/server/model/roomfinder_buildings2gps.go +++ b/server/model/roomfinder_buildings2gps.go @@ -2,11 +2,12 @@ package model import ( "database/sql" - "gorm.io/gorm" "time" + "gorm.io/gorm" + + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -18,11 +19,8 @@ var ( // RoomfinderBuildings2gps struct is a row record of the roomfinder_buildings2gps table in the tca database type RoomfinderBuildings2gps struct { - //[ 0] id varchar(8) null: false primary: true isArray: false auto: false col: varchar len: 8 default: [] - ID string `gorm:"primary_key;column:id;type:varchar(8);" json:"id"` - //[ 1] latitude varchar(30) null: true primary: false isArray: false auto: false col: varchar len: 30 default: [] - Latitude null.String `gorm:"column:latitude;type:varchar(30);" json:"latitude"` - //[ 2] longitude varchar(30) null: true primary: false isArray: false auto: false col: varchar len: 30 default: [] + ID string `gorm:"primary_key;column:id;type:varchar(8);" json:"id"` + Latitude null.String `gorm:"column:latitude;type:varchar(30);" json:"latitude"` Longitude null.String `gorm:"column:longitude;type:varchar(30);" json:"longitude"` } diff --git a/server/model/roomfinder_buildings2maps.go b/server/model/roomfinder_buildings2maps.go index 734d22a2..50b3cecf 100644 --- a/server/model/roomfinder_buildings2maps.go +++ b/server/model/roomfinder_buildings2maps.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,10 +17,8 @@ var ( // RoomfinderBuildings2maps struct is a row record of the roomfinder_buildings2maps table in the tca database type RoomfinderBuildings2maps struct { - //[ 0] building_nr varchar(8) null: false primary: true isArray: false auto: false col: varchar len: 8 default: [] BuildingNr string `gorm:"primary_key;column:building_nr;type:varchar(8);" json:"building_nr"` - //[ 1] map_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - MapID int32 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` + MapID int64 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_maps.go b/server/model/roomfinder_maps.go index 6b578e33..e34f6a55 100644 --- a/server/model/roomfinder_maps.go +++ b/server/model/roomfinder_maps.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,16 +17,11 @@ var ( // RoomfinderMaps struct is a row record of the roomfinder_maps table in the tca database type RoomfinderMaps struct { - //[ 0] map_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - MapID int32 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` - //[ 1] description varchar(64) null: false primary: false isArray: false auto: false col: varchar len: 64 default: [] + MapID int64 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` Description string `gorm:"column:description;type:varchar(64);" json:"description"` - //[ 2] scale int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Scale int32 `gorm:"column:scale;type:int;" json:"scale"` - //[ 3] width int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Width int32 `gorm:"column:width;type:int;" json:"width"` - //[ 4] height int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Height int32 `gorm:"column:height;type:int;" json:"height"` + Scale int32 `gorm:"column:scale;type:int;" json:"scale"` + Width int32 `gorm:"column:width;type:int;" json:"width"` + Height int32 `gorm:"column:height;type:int;" json:"height"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_rooms.go b/server/model/roomfinder_rooms.go index 58f9e3e8..3b81d041 100644 --- a/server/model/roomfinder_rooms.go +++ b/server/model/roomfinder_rooms.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,34 +17,20 @@ var ( // RoomfinderRooms struct is a row record of the roomfinder_rooms table in the tca database type RoomfinderRooms struct { - //[ 0] room_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - RoomID int32 `gorm:"primary_key;column:room_id;type:int;" json:"room_id"` - //[ 1] room_code varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - RoomCode null.String `gorm:"column:room_code;type:varchar(32);" json:"room_code"` - //[ 2] building_nr varchar(8) null: true primary: false isArray: false auto: false col: varchar len: 8 default: [] - BuildingNr null.String `gorm:"column:building_nr;type:varchar(8);" json:"building_nr"` - //[ 3] arch_id varchar(16) null: true primary: false isArray: false auto: false col: varchar len: 16 default: [] - ArchID null.String `gorm:"column:arch_id;type:varchar(16);" json:"arch_id"` - //[ 4] info varchar(64) null: true primary: false isArray: false auto: false col: varchar len: 64 default: [] - Info null.String `gorm:"column:info;type:varchar(64);" json:"info"` - //[ 5] address varchar(128) null: true primary: false isArray: false auto: false col: varchar len: 128 default: [] - Address null.String `gorm:"column:address;type:varchar(128);" json:"address"` - //[ 6] purpose_id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - PurposeID null.Int `gorm:"column:purpose_id;type:int;" json:"purpose_id"` - //[ 7] purpose varchar(64) null: true primary: false isArray: false auto: false col: varchar len: 64 default: [] - Purpose null.String `gorm:"column:purpose;type:varchar(64);" json:"purpose"` - //[ 8] seats int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - Seats null.Int `gorm:"column:seats;type:int;" json:"seats"` - //[ 9] utm_zone varchar(4) null: true primary: false isArray: false auto: false col: varchar len: 4 default: [] - UtmZone null.String `gorm:"column:utm_zone;type:varchar(4);" json:"utm_zone"` - //[10] utm_easting varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - UtmEasting null.String `gorm:"column:utm_easting;type:varchar(32);" json:"utm_easting"` - //[11] utm_northing varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - UtmNorthing null.String `gorm:"column:utm_northing;type:varchar(32);" json:"utm_northing"` - //[12] unit_id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - UnitID null.Int `gorm:"column:unit_id;type:int;" json:"unit_id"` - //[13] default_map_id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - DefaultMapID null.Int `gorm:"column:default_map_id;type:int;" json:"default_map_id"` + RoomID int64 `gorm:"primary_key;column:room_id;type:int;" json:"room_id"` + RoomCode null.String `gorm:"column:room_code;type:varchar(32);" json:"room_code"` + BuildingNr null.String `gorm:"column:building_nr;type:varchar(8);" json:"building_nr"` + ArchID null.String `gorm:"column:arch_id;type:varchar(16);" json:"arch_id"` + Info null.String `gorm:"column:info;type:varchar(64);" json:"info"` + Address null.String `gorm:"column:address;type:varchar(128);" json:"address"` + PurposeID null.Int `gorm:"column:purpose_id;type:int;" json:"purpose_id"` + Purpose null.String `gorm:"column:purpose;type:varchar(64);" json:"purpose"` + Seats null.Int `gorm:"column:seats;type:int;" json:"seats"` + UtmZone null.String `gorm:"column:utm_zone;type:varchar(4);" json:"utm_zone"` + UtmEasting null.String `gorm:"column:utm_easting;type:varchar(32);" json:"utm_easting"` + UtmNorthing null.String `gorm:"column:utm_northing;type:varchar(32);" json:"utm_northing"` + UnitID null.Int `gorm:"column:unit_id;type:int;" json:"unit_id"` + DefaultMapID null.Int `gorm:"column:default_map_id;type:int;" json:"default_map_id"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_rooms2maps.go b/server/model/roomfinder_rooms2maps.go index 61b1b135..a7c7bafc 100644 --- a/server/model/roomfinder_rooms2maps.go +++ b/server/model/roomfinder_rooms2maps.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,10 +17,8 @@ var ( // RoomfinderRooms2maps struct is a row record of the roomfinder_rooms2maps table in the tca database type RoomfinderRooms2maps struct { - //[ 0] room_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - RoomID int32 `gorm:"primary_key;column:room_id;type:int;" json:"room_id"` - //[ 1] map_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - MapID int32 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` + RoomID int64 `gorm:"primary_key;column:room_id;type:int;" json:"room_id"` + MapID int64 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` } // TableName sets the insert table name for this struct type diff --git a/server/model/updateNote.go b/server/model/updateNote.go new file mode 100755 index 00000000..ad83708f --- /dev/null +++ b/server/model/updateNote.go @@ -0,0 +1,13 @@ +package model + +// UpdateNote struct for update notes +type UpdateNote struct { + VersionCode int64 `gorm:"primary_key;AUTO_INCREMENT;column:version_code;type:int;"` + VersionName string `gorm:"column:version_name;type:text;"` + Message string `gorm:"column:message;type:text;"` +} + +// TableName sets the insert table name for this struct type +func (n *UpdateNote) TableName() string { + return "update_note" +} diff --git a/server/swagger/swagger-ui-bundle.js b/server/swagger/swagger-ui-bundle.js index c611bf76..c512dd47 100644 --- a/server/swagger/swagger-ui-bundle.js +++ b/server/swagger/swagger-ui-bundle.js @@ -1,3 +1,3 @@ /*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ !function webpackUniversalModuleDefinition(i,s){"object"==typeof exports&&"object"==typeof module?module.exports=s():"function"==typeof define&&define.amd?define([],s):"object"==typeof exports?exports.SwaggerUIBundle=s():i.SwaggerUIBundle=s()}(this,(()=>(()=>{var i={17967:(i,s)=>{"use strict";s.Nm=s.Rq=void 0;var u=/^([^\w]*)(javascript|data|vbscript)/im,m=/&#(\w+)(^\w|;)?/g,v=/&(newline|tab);/gi,_=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,j=/^.+(:|:)/gim,M=[".","/"];s.Rq="about:blank",s.Nm=function sanitizeUrl(i){if(!i)return s.Rq;var $=function decodeHtmlCharacters(i){return i.replace(_,"").replace(m,(function(i,s){return String.fromCharCode(s)}))}(i).replace(v,"").replace(_,"").trim();if(!$)return s.Rq;if(function isRelativeUrlWithoutProtocol(i){return M.indexOf(i[0])>-1}($))return $;var W=$.match(j);if(!W)return $;var X=W[0];return u.test(X)?s.Rq:$}},79742:(i,s)=>{"use strict";s.byteLength=function byteLength(i){var s=getLens(i),u=s[0],m=s[1];return 3*(u+m)/4-m},s.toByteArray=function toByteArray(i){var s,u,_=getLens(i),j=_[0],M=_[1],$=new v(function _byteLength(i,s,u){return 3*(s+u)/4-u}(0,j,M)),W=0,X=M>0?j-4:j;for(u=0;u>16&255,$[W++]=s>>8&255,$[W++]=255&s;2===M&&(s=m[i.charCodeAt(u)]<<2|m[i.charCodeAt(u+1)]>>4,$[W++]=255&s);1===M&&(s=m[i.charCodeAt(u)]<<10|m[i.charCodeAt(u+1)]<<4|m[i.charCodeAt(u+2)]>>2,$[W++]=s>>8&255,$[W++]=255&s);return $},s.fromByteArray=function fromByteArray(i){for(var s,m=i.length,v=m%3,_=[],j=16383,M=0,$=m-v;M<$;M+=j)_.push(encodeChunk(i,M,M+j>$?$:M+j));1===v?(s=i[m-1],_.push(u[s>>2]+u[s<<4&63]+"==")):2===v&&(s=(i[m-2]<<8)+i[m-1],_.push(u[s>>10]+u[s>>4&63]+u[s<<2&63]+"="));return _.join("")};for(var u=[],m=[],v="undefined"!=typeof Uint8Array?Uint8Array:Array,_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",j=0;j<64;++j)u[j]=_[j],m[_.charCodeAt(j)]=j;function getLens(i){var s=i.length;if(s%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var u=i.indexOf("=");return-1===u&&(u=s),[u,u===s?0:4-u%4]}function encodeChunk(i,s,m){for(var v,_,j=[],M=s;M>18&63]+u[_>>12&63]+u[_>>6&63]+u[63&_]);return j.join("")}m["-".charCodeAt(0)]=62,m["_".charCodeAt(0)]=63},48764:(i,s,u)=>{"use strict";const m=u(79742),v=u(80645),_="function"==typeof Symbol&&"function"==typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;s.Buffer=Buffer,s.SlowBuffer=function SlowBuffer(i){+i!=i&&(i=0);return Buffer.alloc(+i)},s.INSPECT_MAX_BYTES=50;const j=2147483647;function createBuffer(i){if(i>j)throw new RangeError('The value "'+i+'" is invalid for option "size"');const s=new Uint8Array(i);return Object.setPrototypeOf(s,Buffer.prototype),s}function Buffer(i,s,u){if("number"==typeof i){if("string"==typeof s)throw new TypeError('The "string" argument must be of type string. Received type number');return allocUnsafe(i)}return from(i,s,u)}function from(i,s,u){if("string"==typeof i)return function fromString(i,s){"string"==typeof s&&""!==s||(s="utf8");if(!Buffer.isEncoding(s))throw new TypeError("Unknown encoding: "+s);const u=0|byteLength(i,s);let m=createBuffer(u);const v=m.write(i,s);v!==u&&(m=m.slice(0,v));return m}(i,s);if(ArrayBuffer.isView(i))return function fromArrayView(i){if(isInstance(i,Uint8Array)){const s=new Uint8Array(i);return fromArrayBuffer(s.buffer,s.byteOffset,s.byteLength)}return fromArrayLike(i)}(i);if(null==i)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof i);if(isInstance(i,ArrayBuffer)||i&&isInstance(i.buffer,ArrayBuffer))return fromArrayBuffer(i,s,u);if("undefined"!=typeof SharedArrayBuffer&&(isInstance(i,SharedArrayBuffer)||i&&isInstance(i.buffer,SharedArrayBuffer)))return fromArrayBuffer(i,s,u);if("number"==typeof i)throw new TypeError('The "value" argument must not be of type number. Received type number');const m=i.valueOf&&i.valueOf();if(null!=m&&m!==i)return Buffer.from(m,s,u);const v=function fromObject(i){if(Buffer.isBuffer(i)){const s=0|checked(i.length),u=createBuffer(s);return 0===u.length||i.copy(u,0,0,s),u}if(void 0!==i.length)return"number"!=typeof i.length||numberIsNaN(i.length)?createBuffer(0):fromArrayLike(i);if("Buffer"===i.type&&Array.isArray(i.data))return fromArrayLike(i.data)}(i);if(v)return v;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof i[Symbol.toPrimitive])return Buffer.from(i[Symbol.toPrimitive]("string"),s,u);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof i)}function assertSize(i){if("number"!=typeof i)throw new TypeError('"size" argument must be of type number');if(i<0)throw new RangeError('The value "'+i+'" is invalid for option "size"')}function allocUnsafe(i){return assertSize(i),createBuffer(i<0?0:0|checked(i))}function fromArrayLike(i){const s=i.length<0?0:0|checked(i.length),u=createBuffer(s);for(let m=0;m=j)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+j.toString(16)+" bytes");return 0|i}function byteLength(i,s){if(Buffer.isBuffer(i))return i.length;if(ArrayBuffer.isView(i)||isInstance(i,ArrayBuffer))return i.byteLength;if("string"!=typeof i)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof i);const u=i.length,m=arguments.length>2&&!0===arguments[2];if(!m&&0===u)return 0;let v=!1;for(;;)switch(s){case"ascii":case"latin1":case"binary":return u;case"utf8":case"utf-8":return utf8ToBytes(i).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*u;case"hex":return u>>>1;case"base64":return base64ToBytes(i).length;default:if(v)return m?-1:utf8ToBytes(i).length;s=(""+s).toLowerCase(),v=!0}}function slowToString(i,s,u){let m=!1;if((void 0===s||s<0)&&(s=0),s>this.length)return"";if((void 0===u||u>this.length)&&(u=this.length),u<=0)return"";if((u>>>=0)<=(s>>>=0))return"";for(i||(i="utf8");;)switch(i){case"hex":return hexSlice(this,s,u);case"utf8":case"utf-8":return utf8Slice(this,s,u);case"ascii":return asciiSlice(this,s,u);case"latin1":case"binary":return latin1Slice(this,s,u);case"base64":return base64Slice(this,s,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,s,u);default:if(m)throw new TypeError("Unknown encoding: "+i);i=(i+"").toLowerCase(),m=!0}}function swap(i,s,u){const m=i[s];i[s]=i[u],i[u]=m}function bidirectionalIndexOf(i,s,u,m,v){if(0===i.length)return-1;if("string"==typeof u?(m=u,u=0):u>2147483647?u=2147483647:u<-2147483648&&(u=-2147483648),numberIsNaN(u=+u)&&(u=v?0:i.length-1),u<0&&(u=i.length+u),u>=i.length){if(v)return-1;u=i.length-1}else if(u<0){if(!v)return-1;u=0}if("string"==typeof s&&(s=Buffer.from(s,m)),Buffer.isBuffer(s))return 0===s.length?-1:arrayIndexOf(i,s,u,m,v);if("number"==typeof s)return s&=255,"function"==typeof Uint8Array.prototype.indexOf?v?Uint8Array.prototype.indexOf.call(i,s,u):Uint8Array.prototype.lastIndexOf.call(i,s,u):arrayIndexOf(i,[s],u,m,v);throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(i,s,u,m,v){let _,j=1,M=i.length,$=s.length;if(void 0!==m&&("ucs2"===(m=String(m).toLowerCase())||"ucs-2"===m||"utf16le"===m||"utf-16le"===m)){if(i.length<2||s.length<2)return-1;j=2,M/=2,$/=2,u/=2}function read(i,s){return 1===j?i[s]:i.readUInt16BE(s*j)}if(v){let m=-1;for(_=u;_M&&(u=M-$),_=u;_>=0;_--){let u=!0;for(let m=0;m<$;m++)if(read(i,_+m)!==read(s,m)){u=!1;break}if(u)return _}return-1}function hexWrite(i,s,u,m){u=Number(u)||0;const v=i.length-u;m?(m=Number(m))>v&&(m=v):m=v;const _=s.length;let j;for(m>_/2&&(m=_/2),j=0;j>8,v=u%256,_.push(v),_.push(m);return _}(s,i.length-u),i,u,m)}function base64Slice(i,s,u){return 0===s&&u===i.length?m.fromByteArray(i):m.fromByteArray(i.slice(s,u))}function utf8Slice(i,s,u){u=Math.min(i.length,u);const m=[];let v=s;for(;v239?4:s>223?3:s>191?2:1;if(v+j<=u){let u,m,M,$;switch(j){case 1:s<128&&(_=s);break;case 2:u=i[v+1],128==(192&u)&&($=(31&s)<<6|63&u,$>127&&(_=$));break;case 3:u=i[v+1],m=i[v+2],128==(192&u)&&128==(192&m)&&($=(15&s)<<12|(63&u)<<6|63&m,$>2047&&($<55296||$>57343)&&(_=$));break;case 4:u=i[v+1],m=i[v+2],M=i[v+3],128==(192&u)&&128==(192&m)&&128==(192&M)&&($=(15&s)<<18|(63&u)<<12|(63&m)<<6|63&M,$>65535&&$<1114112&&(_=$))}}null===_?(_=65533,j=1):_>65535&&(_-=65536,m.push(_>>>10&1023|55296),_=56320|1023&_),m.push(_),v+=j}return function decodeCodePointsArray(i){const s=i.length;if(s<=M)return String.fromCharCode.apply(String,i);let u="",m=0;for(;mm.length?(Buffer.isBuffer(s)||(s=Buffer.from(s)),s.copy(m,v)):Uint8Array.prototype.set.call(m,s,v);else{if(!Buffer.isBuffer(s))throw new TypeError('"list" argument must be an Array of Buffers');s.copy(m,v)}v+=s.length}return m},Buffer.byteLength=byteLength,Buffer.prototype._isBuffer=!0,Buffer.prototype.swap16=function swap16(){const i=this.length;if(i%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let s=0;su&&(i+=" ... "),""},_&&(Buffer.prototype[_]=Buffer.prototype.inspect),Buffer.prototype.compare=function compare(i,s,u,m,v){if(isInstance(i,Uint8Array)&&(i=Buffer.from(i,i.offset,i.byteLength)),!Buffer.isBuffer(i))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof i);if(void 0===s&&(s=0),void 0===u&&(u=i?i.length:0),void 0===m&&(m=0),void 0===v&&(v=this.length),s<0||u>i.length||m<0||v>this.length)throw new RangeError("out of range index");if(m>=v&&s>=u)return 0;if(m>=v)return-1;if(s>=u)return 1;if(this===i)return 0;let _=(v>>>=0)-(m>>>=0),j=(u>>>=0)-(s>>>=0);const M=Math.min(_,j),$=this.slice(m,v),W=i.slice(s,u);for(let i=0;i>>=0,isFinite(u)?(u>>>=0,void 0===m&&(m="utf8")):(m=u,u=void 0)}const v=this.length-s;if((void 0===u||u>v)&&(u=v),i.length>0&&(u<0||s<0)||s>this.length)throw new RangeError("Attempt to write outside buffer bounds");m||(m="utf8");let _=!1;for(;;)switch(m){case"hex":return hexWrite(this,i,s,u);case"utf8":case"utf-8":return utf8Write(this,i,s,u);case"ascii":case"latin1":case"binary":return asciiWrite(this,i,s,u);case"base64":return base64Write(this,i,s,u);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,i,s,u);default:if(_)throw new TypeError("Unknown encoding: "+m);m=(""+m).toLowerCase(),_=!0}},Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const M=4096;function asciiSlice(i,s,u){let m="";u=Math.min(i.length,u);for(let v=s;vm)&&(u=m);let v="";for(let m=s;mu)throw new RangeError("Trying to access beyond buffer length")}function checkInt(i,s,u,m,v,_){if(!Buffer.isBuffer(i))throw new TypeError('"buffer" argument must be a Buffer instance');if(s>v||s<_)throw new RangeError('"value" argument is out of bounds');if(u+m>i.length)throw new RangeError("Index out of range")}function wrtBigUInt64LE(i,s,u,m,v){checkIntBI(s,m,v,i,u,7);let _=Number(s&BigInt(4294967295));i[u++]=_,_>>=8,i[u++]=_,_>>=8,i[u++]=_,_>>=8,i[u++]=_;let j=Number(s>>BigInt(32)&BigInt(4294967295));return i[u++]=j,j>>=8,i[u++]=j,j>>=8,i[u++]=j,j>>=8,i[u++]=j,u}function wrtBigUInt64BE(i,s,u,m,v){checkIntBI(s,m,v,i,u,7);let _=Number(s&BigInt(4294967295));i[u+7]=_,_>>=8,i[u+6]=_,_>>=8,i[u+5]=_,_>>=8,i[u+4]=_;let j=Number(s>>BigInt(32)&BigInt(4294967295));return i[u+3]=j,j>>=8,i[u+2]=j,j>>=8,i[u+1]=j,j>>=8,i[u]=j,u+8}function checkIEEE754(i,s,u,m,v,_){if(u+m>i.length)throw new RangeError("Index out of range");if(u<0)throw new RangeError("Index out of range")}function writeFloat(i,s,u,m,_){return s=+s,u>>>=0,_||checkIEEE754(i,0,u,4),v.write(i,s,u,m,23,4),u+4}function writeDouble(i,s,u,m,_){return s=+s,u>>>=0,_||checkIEEE754(i,0,u,8),v.write(i,s,u,m,52,8),u+8}Buffer.prototype.slice=function slice(i,s){const u=this.length;(i=~~i)<0?(i+=u)<0&&(i=0):i>u&&(i=u),(s=void 0===s?u:~~s)<0?(s+=u)<0&&(s=0):s>u&&(s=u),s>>=0,s>>>=0,u||checkOffset(i,s,this.length);let m=this[i],v=1,_=0;for(;++_>>=0,s>>>=0,u||checkOffset(i,s,this.length);let m=this[i+--s],v=1;for(;s>0&&(v*=256);)m+=this[i+--s]*v;return m},Buffer.prototype.readUint8=Buffer.prototype.readUInt8=function readUInt8(i,s){return i>>>=0,s||checkOffset(i,1,this.length),this[i]},Buffer.prototype.readUint16LE=Buffer.prototype.readUInt16LE=function readUInt16LE(i,s){return i>>>=0,s||checkOffset(i,2,this.length),this[i]|this[i+1]<<8},Buffer.prototype.readUint16BE=Buffer.prototype.readUInt16BE=function readUInt16BE(i,s){return i>>>=0,s||checkOffset(i,2,this.length),this[i]<<8|this[i+1]},Buffer.prototype.readUint32LE=Buffer.prototype.readUInt32LE=function readUInt32LE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),(this[i]|this[i+1]<<8|this[i+2]<<16)+16777216*this[i+3]},Buffer.prototype.readUint32BE=Buffer.prototype.readUInt32BE=function readUInt32BE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),16777216*this[i]+(this[i+1]<<16|this[i+2]<<8|this[i+3])},Buffer.prototype.readBigUInt64LE=defineBigIntMethod((function readBigUInt64LE(i){validateNumber(i>>>=0,"offset");const s=this[i],u=this[i+7];void 0!==s&&void 0!==u||boundsError(i,this.length-8);const m=s+256*this[++i]+65536*this[++i]+this[++i]*2**24,v=this[++i]+256*this[++i]+65536*this[++i]+u*2**24;return BigInt(m)+(BigInt(v)<>>=0,"offset");const s=this[i],u=this[i+7];void 0!==s&&void 0!==u||boundsError(i,this.length-8);const m=s*2**24+65536*this[++i]+256*this[++i]+this[++i],v=this[++i]*2**24+65536*this[++i]+256*this[++i]+u;return(BigInt(m)<>>=0,s>>>=0,u||checkOffset(i,s,this.length);let m=this[i],v=1,_=0;for(;++_=v&&(m-=Math.pow(2,8*s)),m},Buffer.prototype.readIntBE=function readIntBE(i,s,u){i>>>=0,s>>>=0,u||checkOffset(i,s,this.length);let m=s,v=1,_=this[i+--m];for(;m>0&&(v*=256);)_+=this[i+--m]*v;return v*=128,_>=v&&(_-=Math.pow(2,8*s)),_},Buffer.prototype.readInt8=function readInt8(i,s){return i>>>=0,s||checkOffset(i,1,this.length),128&this[i]?-1*(255-this[i]+1):this[i]},Buffer.prototype.readInt16LE=function readInt16LE(i,s){i>>>=0,s||checkOffset(i,2,this.length);const u=this[i]|this[i+1]<<8;return 32768&u?4294901760|u:u},Buffer.prototype.readInt16BE=function readInt16BE(i,s){i>>>=0,s||checkOffset(i,2,this.length);const u=this[i+1]|this[i]<<8;return 32768&u?4294901760|u:u},Buffer.prototype.readInt32LE=function readInt32LE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),this[i]|this[i+1]<<8|this[i+2]<<16|this[i+3]<<24},Buffer.prototype.readInt32BE=function readInt32BE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),this[i]<<24|this[i+1]<<16|this[i+2]<<8|this[i+3]},Buffer.prototype.readBigInt64LE=defineBigIntMethod((function readBigInt64LE(i){validateNumber(i>>>=0,"offset");const s=this[i],u=this[i+7];void 0!==s&&void 0!==u||boundsError(i,this.length-8);const m=this[i+4]+256*this[i+5]+65536*this[i+6]+(u<<24);return(BigInt(m)<>>=0,"offset");const s=this[i],u=this[i+7];void 0!==s&&void 0!==u||boundsError(i,this.length-8);const m=(s<<24)+65536*this[++i]+256*this[++i]+this[++i];return(BigInt(m)<>>=0,s||checkOffset(i,4,this.length),v.read(this,i,!0,23,4)},Buffer.prototype.readFloatBE=function readFloatBE(i,s){return i>>>=0,s||checkOffset(i,4,this.length),v.read(this,i,!1,23,4)},Buffer.prototype.readDoubleLE=function readDoubleLE(i,s){return i>>>=0,s||checkOffset(i,8,this.length),v.read(this,i,!0,52,8)},Buffer.prototype.readDoubleBE=function readDoubleBE(i,s){return i>>>=0,s||checkOffset(i,8,this.length),v.read(this,i,!1,52,8)},Buffer.prototype.writeUintLE=Buffer.prototype.writeUIntLE=function writeUIntLE(i,s,u,m){if(i=+i,s>>>=0,u>>>=0,!m){checkInt(this,i,s,u,Math.pow(2,8*u)-1,0)}let v=1,_=0;for(this[s]=255&i;++_>>=0,u>>>=0,!m){checkInt(this,i,s,u,Math.pow(2,8*u)-1,0)}let v=u-1,_=1;for(this[s+v]=255&i;--v>=0&&(_*=256);)this[s+v]=i/_&255;return s+u},Buffer.prototype.writeUint8=Buffer.prototype.writeUInt8=function writeUInt8(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,1,255,0),this[s]=255&i,s+1},Buffer.prototype.writeUint16LE=Buffer.prototype.writeUInt16LE=function writeUInt16LE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,2,65535,0),this[s]=255&i,this[s+1]=i>>>8,s+2},Buffer.prototype.writeUint16BE=Buffer.prototype.writeUInt16BE=function writeUInt16BE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,2,65535,0),this[s]=i>>>8,this[s+1]=255&i,s+2},Buffer.prototype.writeUint32LE=Buffer.prototype.writeUInt32LE=function writeUInt32LE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,4,4294967295,0),this[s+3]=i>>>24,this[s+2]=i>>>16,this[s+1]=i>>>8,this[s]=255&i,s+4},Buffer.prototype.writeUint32BE=Buffer.prototype.writeUInt32BE=function writeUInt32BE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,4,4294967295,0),this[s]=i>>>24,this[s+1]=i>>>16,this[s+2]=i>>>8,this[s+3]=255&i,s+4},Buffer.prototype.writeBigUInt64LE=defineBigIntMethod((function writeBigUInt64LE(i,s=0){return wrtBigUInt64LE(this,i,s,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeBigUInt64BE=defineBigIntMethod((function writeBigUInt64BE(i,s=0){return wrtBigUInt64BE(this,i,s,BigInt(0),BigInt("0xffffffffffffffff"))})),Buffer.prototype.writeIntLE=function writeIntLE(i,s,u,m){if(i=+i,s>>>=0,!m){const m=Math.pow(2,8*u-1);checkInt(this,i,s,u,m-1,-m)}let v=0,_=1,j=0;for(this[s]=255&i;++v>0)-j&255;return s+u},Buffer.prototype.writeIntBE=function writeIntBE(i,s,u,m){if(i=+i,s>>>=0,!m){const m=Math.pow(2,8*u-1);checkInt(this,i,s,u,m-1,-m)}let v=u-1,_=1,j=0;for(this[s+v]=255&i;--v>=0&&(_*=256);)i<0&&0===j&&0!==this[s+v+1]&&(j=1),this[s+v]=(i/_>>0)-j&255;return s+u},Buffer.prototype.writeInt8=function writeInt8(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,1,127,-128),i<0&&(i=255+i+1),this[s]=255&i,s+1},Buffer.prototype.writeInt16LE=function writeInt16LE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,2,32767,-32768),this[s]=255&i,this[s+1]=i>>>8,s+2},Buffer.prototype.writeInt16BE=function writeInt16BE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,2,32767,-32768),this[s]=i>>>8,this[s+1]=255&i,s+2},Buffer.prototype.writeInt32LE=function writeInt32LE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,4,2147483647,-2147483648),this[s]=255&i,this[s+1]=i>>>8,this[s+2]=i>>>16,this[s+3]=i>>>24,s+4},Buffer.prototype.writeInt32BE=function writeInt32BE(i,s,u){return i=+i,s>>>=0,u||checkInt(this,i,s,4,2147483647,-2147483648),i<0&&(i=4294967295+i+1),this[s]=i>>>24,this[s+1]=i>>>16,this[s+2]=i>>>8,this[s+3]=255&i,s+4},Buffer.prototype.writeBigInt64LE=defineBigIntMethod((function writeBigInt64LE(i,s=0){return wrtBigUInt64LE(this,i,s,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeBigInt64BE=defineBigIntMethod((function writeBigInt64BE(i,s=0){return wrtBigUInt64BE(this,i,s,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),Buffer.prototype.writeFloatLE=function writeFloatLE(i,s,u){return writeFloat(this,i,s,!0,u)},Buffer.prototype.writeFloatBE=function writeFloatBE(i,s,u){return writeFloat(this,i,s,!1,u)},Buffer.prototype.writeDoubleLE=function writeDoubleLE(i,s,u){return writeDouble(this,i,s,!0,u)},Buffer.prototype.writeDoubleBE=function writeDoubleBE(i,s,u){return writeDouble(this,i,s,!1,u)},Buffer.prototype.copy=function copy(i,s,u,m){if(!Buffer.isBuffer(i))throw new TypeError("argument should be a Buffer");if(u||(u=0),m||0===m||(m=this.length),s>=i.length&&(s=i.length),s||(s=0),m>0&&m=this.length)throw new RangeError("Index out of range");if(m<0)throw new RangeError("sourceEnd out of bounds");m>this.length&&(m=this.length),i.length-s>>=0,u=void 0===u?this.length:u>>>0,i||(i=0),"number"==typeof i)for(v=s;v=m+4;u-=3)s=`_${i.slice(u-3,u)}${s}`;return`${i.slice(0,u)}${s}`}function checkIntBI(i,s,u,m,v,_){if(i>u||i3?0===s||s===BigInt(0)?`>= 0${m} and < 2${m} ** ${8*(_+1)}${m}`:`>= -(2${m} ** ${8*(_+1)-1}${m}) and < 2 ** ${8*(_+1)-1}${m}`:`>= ${s}${m} and <= ${u}${m}`,new $.ERR_OUT_OF_RANGE("value",v,i)}!function checkBounds(i,s,u){validateNumber(s,"offset"),void 0!==i[s]&&void 0!==i[s+u]||boundsError(s,i.length-(u+1))}(m,v,_)}function validateNumber(i,s){if("number"!=typeof i)throw new $.ERR_INVALID_ARG_TYPE(s,"number",i)}function boundsError(i,s,u){if(Math.floor(i)!==i)throw validateNumber(i,u),new $.ERR_OUT_OF_RANGE(u||"offset","an integer",i);if(s<0)throw new $.ERR_BUFFER_OUT_OF_BOUNDS;throw new $.ERR_OUT_OF_RANGE(u||"offset",`>= ${u?1:0} and <= ${s}`,i)}E("ERR_BUFFER_OUT_OF_BOUNDS",(function(i){return i?`${i} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"}),RangeError),E("ERR_INVALID_ARG_TYPE",(function(i,s){return`The "${i}" argument must be of type number. Received type ${typeof s}`}),TypeError),E("ERR_OUT_OF_RANGE",(function(i,s,u){let m=`The value of "${i}" is out of range.`,v=u;return Number.isInteger(u)&&Math.abs(u)>2**32?v=addNumericalSeparator(String(u)):"bigint"==typeof u&&(v=String(u),(u>BigInt(2)**BigInt(32)||u<-(BigInt(2)**BigInt(32)))&&(v=addNumericalSeparator(v)),v+="n"),m+=` It must be ${s}. Received ${v}`,m}),RangeError);const W=/[^+/0-9A-Za-z-_]/g;function utf8ToBytes(i,s){let u;s=s||1/0;const m=i.length;let v=null;const _=[];for(let j=0;j55295&&u<57344){if(!v){if(u>56319){(s-=3)>-1&&_.push(239,191,189);continue}if(j+1===m){(s-=3)>-1&&_.push(239,191,189);continue}v=u;continue}if(u<56320){(s-=3)>-1&&_.push(239,191,189),v=u;continue}u=65536+(v-55296<<10|u-56320)}else v&&(s-=3)>-1&&_.push(239,191,189);if(v=null,u<128){if((s-=1)<0)break;_.push(u)}else if(u<2048){if((s-=2)<0)break;_.push(u>>6|192,63&u|128)}else if(u<65536){if((s-=3)<0)break;_.push(u>>12|224,u>>6&63|128,63&u|128)}else{if(!(u<1114112))throw new Error("Invalid code point");if((s-=4)<0)break;_.push(u>>18|240,u>>12&63|128,u>>6&63|128,63&u|128)}}return _}function base64ToBytes(i){return m.toByteArray(function base64clean(i){if((i=(i=i.split("=")[0]).trim().replace(W,"")).length<2)return"";for(;i.length%4!=0;)i+="=";return i}(i))}function blitBuffer(i,s,u,m){let v;for(v=0;v=s.length||v>=i.length);++v)s[v+u]=i[v];return v}function isInstance(i,s){return i instanceof s||null!=i&&null!=i.constructor&&null!=i.constructor.name&&i.constructor.name===s.name}function numberIsNaN(i){return i!=i}const X=function(){const i="0123456789abcdef",s=new Array(256);for(let u=0;u<16;++u){const m=16*u;for(let v=0;v<16;++v)s[m+v]=i[u]+i[v]}return s}();function defineBigIntMethod(i){return"undefined"==typeof BigInt?BufferBigIntNotDefined:i}function BufferBigIntNotDefined(){throw new Error("BigInt not supported")}},21924:(i,s,u)=>{"use strict";var m=u(40210),v=u(55559),_=v(m("String.prototype.indexOf"));i.exports=function callBoundIntrinsic(i,s){var u=m(i,!!s);return"function"==typeof u&&_(i,".prototype.")>-1?v(u):u}},55559:(i,s,u)=>{"use strict";var m=u(58612),v=u(40210),_=v("%Function.prototype.apply%"),j=v("%Function.prototype.call%"),M=v("%Reflect.apply%",!0)||m.call(j,_),$=v("%Object.getOwnPropertyDescriptor%",!0),W=v("%Object.defineProperty%",!0),X=v("%Math.max%");if(W)try{W({},"a",{value:1})}catch(i){W=null}i.exports=function callBind(i){var s=M(m,j,arguments);$&&W&&($(s,"length").configurable&&W(s,"length",{value:1+X(0,i.length-(arguments.length-1))}));return s};var Y=function applyBind(){return M(m,_,arguments)};W?W(i.exports,"apply",{value:Y}):i.exports.apply=Y},94184:(i,s)=>{var u;!function(){"use strict";var m={}.hasOwnProperty;function classNames(){for(var i=[],s=0;s{"use strict";s.parse=function parse(i,s){if("string"!=typeof i)throw new TypeError("argument str must be a string");var u={},m=(s||{}).decode||decode,v=0;for(;v{"use strict";var m=u(11742),v={"text/plain":"Text","text/html":"Url",default:"Text"};i.exports=function copy(i,s){var u,_,j,M,$,W,X=!1;s||(s={}),u=s.debug||!1;try{if(j=m(),M=document.createRange(),$=document.getSelection(),(W=document.createElement("span")).textContent=i,W.ariaHidden="true",W.style.all="unset",W.style.position="fixed",W.style.top=0,W.style.clip="rect(0, 0, 0, 0)",W.style.whiteSpace="pre",W.style.webkitUserSelect="text",W.style.MozUserSelect="text",W.style.msUserSelect="text",W.style.userSelect="text",W.addEventListener("copy",(function(m){if(m.stopPropagation(),s.format)if(m.preventDefault(),void 0===m.clipboardData){u&&console.warn("unable to use e.clipboardData"),u&&console.warn("trying IE specific stuff"),window.clipboardData.clearData();var _=v[s.format]||v.default;window.clipboardData.setData(_,i)}else m.clipboardData.clearData(),m.clipboardData.setData(s.format,i);s.onCopy&&(m.preventDefault(),s.onCopy(m.clipboardData))})),document.body.appendChild(W),M.selectNodeContents(W),$.addRange(M),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");X=!0}catch(m){u&&console.error("unable to copy using execCommand: ",m),u&&console.warn("trying IE specific stuff");try{window.clipboardData.setData(s.format||"text",i),s.onCopy&&s.onCopy(window.clipboardData),X=!0}catch(m){u&&console.error("unable to copy using clipboardData: ",m),u&&console.error("falling back to prompt"),_=function format(i){var s=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return i.replace(/#{\s*key\s*}/g,s)}("message"in s?s.message:"Copy to clipboard: #{key}, Enter"),window.prompt(_,i)}}finally{$&&("function"==typeof $.removeRange?$.removeRange(M):$.removeAllRanges()),W&&document.body.removeChild(W),j()}return X}},90093:(i,s,u)=>{var m=u(28196);i.exports=m},3688:(i,s,u)=>{var m=u(11955);i.exports=m},83838:(i,s,u)=>{var m=u(46279);i.exports=m},15684:(i,s,u)=>{var m=u(19373);i.exports=m},81331:(i,s,u)=>{var m=u(52759);i.exports=m},65362:(i,s,u)=>{var m=u(63383);i.exports=m},91254:(i,s,u)=>{var m=u(57396);i.exports=m},43536:(i,s,u)=>{var m=u(41910);i.exports=m},37331:(i,s,u)=>{var m=u(79427);i.exports=m},68522:(i,s,u)=>{var m=u(62857);i.exports=m},73151:(i,s,u)=>{var m=u(9534);i.exports=m},45012:(i,s,u)=>{var m=u(23059);i.exports=m},80281:(i,s,u)=>{var m=u(92547);u(97522),u(43975),u(45414),i.exports=m},40031:(i,s,u)=>{var m=u(46509);i.exports=m},17487:(i,s,u)=>{var m=u(35774);i.exports=m},62383:(i,s,u)=>{u(21501);var m=u(35703);i.exports=m("Array").filter},99324:(i,s,u)=>{u(2437);var m=u(35703);i.exports=m("Array").forEach},8700:(i,s,u)=>{u(99076);var m=u(35703);i.exports=m("Array").indexOf},9896:(i,s,u)=>{u(48528);var m=u(35703);i.exports=m("Array").push},27700:(i,s,u)=>{u(73381);var m=u(35703);i.exports=m("Function").bind},16246:(i,s,u)=>{var m=u(7046),v=u(27700),_=Function.prototype;i.exports=function(i){var s=i.bind;return i===_||m(_,i)&&s===_.bind?v:s}},2480:(i,s,u)=>{var m=u(7046),v=u(62383),_=Array.prototype;i.exports=function(i){var s=i.filter;return i===_||m(_,i)&&s===_.filter?v:s}},34570:(i,s,u)=>{var m=u(7046),v=u(8700),_=Array.prototype;i.exports=function(i){var s=i.indexOf;return i===_||m(_,i)&&s===_.indexOf?v:s}},93993:(i,s,u)=>{var m=u(7046),v=u(9896),_=Array.prototype;i.exports=function(i){var s=i.push;return i===_||m(_,i)&&s===_.push?v:s}},45999:(i,s,u)=>{u(49221);var m=u(54058);i.exports=m.Object.assign},7702:(i,s,u)=>{u(74979);var m=u(54058).Object,v=i.exports=function defineProperties(i,s){return m.defineProperties(i,s)};m.defineProperties.sham&&(v.sham=!0)},48171:(i,s,u)=>{u(86450);var m=u(54058).Object,v=i.exports=function defineProperty(i,s,u){return m.defineProperty(i,s,u)};m.defineProperty.sham&&(v.sham=!0)},286:(i,s,u)=>{u(46924);var m=u(54058).Object,v=i.exports=function getOwnPropertyDescriptor(i,s){return m.getOwnPropertyDescriptor(i,s)};m.getOwnPropertyDescriptor.sham&&(v.sham=!0)},92766:(i,s,u)=>{u(88482);var m=u(54058);i.exports=m.Object.getOwnPropertyDescriptors},30498:(i,s,u)=>{u(35824);var m=u(54058);i.exports=m.Object.getOwnPropertySymbols},48494:(i,s,u)=>{u(21724);var m=u(54058);i.exports=m.Object.keys},57473:(i,s,u)=>{u(85906),u(55967),u(35824),u(8555),u(52615),u(21732),u(35903),u(1825),u(28394),u(45915),u(61766),u(62737),u(89911),u(74315),u(63131),u(64714),u(70659),u(69120),u(79413),u(1502);var m=u(54058);i.exports=m.Symbol},24227:(i,s,u)=>{u(66274),u(55967),u(77971),u(1825);var m=u(11477);i.exports=m.f("iterator")},62978:(i,s,u)=>{u(18084),u(63131);var m=u(11477);i.exports=m.f("toPrimitive")},14122:(i,s,u)=>{i.exports=u(89097)},44442:(i,s,u)=>{i.exports=u(51675)},57152:(i,s,u)=>{i.exports=u(82507)},69447:(i,s,u)=>{i.exports=u(628)},1449:(i,s,u)=>{i.exports=u(34501)},60269:(i,s,u)=>{i.exports=u(76936)},70573:(i,s,u)=>{i.exports=u(18180)},73685:(i,s,u)=>{i.exports=u(80621)},27533:(i,s,u)=>{i.exports=u(22948)},39057:(i,s,u)=>{i.exports=u(82108)},84710:(i,s,u)=>{i.exports=u(14058)},93799:(i,s,u)=>{i.exports=u(92093)},86600:(i,s,u)=>{i.exports=u(52201)},9759:(i,s,u)=>{i.exports=u(27398)},71384:(i,s,u)=>{i.exports=u(26189)},89097:(i,s,u)=>{var m=u(90093);i.exports=m},51675:(i,s,u)=>{var m=u(3688);i.exports=m},82507:(i,s,u)=>{var m=u(83838);i.exports=m},628:(i,s,u)=>{var m=u(15684);i.exports=m},34501:(i,s,u)=>{var m=u(81331);i.exports=m},76936:(i,s,u)=>{var m=u(65362);i.exports=m},18180:(i,s,u)=>{var m=u(91254);i.exports=m},80621:(i,s,u)=>{var m=u(43536);i.exports=m},22948:(i,s,u)=>{var m=u(37331);i.exports=m},82108:(i,s,u)=>{var m=u(68522);i.exports=m},14058:(i,s,u)=>{var m=u(73151);i.exports=m},92093:(i,s,u)=>{var m=u(45012);i.exports=m},52201:(i,s,u)=>{var m=u(80281);u(28783),u(97618),u(6989),u(65799),u(46774),u(22731),u(85605),u(31943),u(80620),u(36172),i.exports=m},27398:(i,s,u)=>{var m=u(40031);i.exports=m},26189:(i,s,u)=>{var m=u(17487);i.exports=m},24883:(i,s,u)=>{var m=u(57475),v=u(69826),_=TypeError;i.exports=function(i){if(m(i))return i;throw _(v(i)+" is not a function")}},11851:(i,s,u)=>{var m=u(57475),v=String,_=TypeError;i.exports=function(i){if("object"==typeof i||m(i))return i;throw _("Can't set "+v(i)+" as a prototype")}},18479:i=>{i.exports=function(){}},96059:(i,s,u)=>{var m=u(10941),v=String,_=TypeError;i.exports=function(i){if(m(i))return i;throw _(v(i)+" is not an object")}},56837:(i,s,u)=>{"use strict";var m=u(3610).forEach,v=u(34194)("forEach");i.exports=v?[].forEach:function forEach(i){return m(this,i,arguments.length>1?arguments[1]:void 0)}},31692:(i,s,u)=>{var m=u(74529),v=u(59413),_=u(10623),createMethod=function(i){return function(s,u,j){var M,$=m(s),W=_($),X=v(j,W);if(i&&u!=u){for(;W>X;)if((M=$[X++])!=M)return!0}else for(;W>X;X++)if((i||X in $)&&$[X]===u)return i||X||0;return!i&&-1}};i.exports={includes:createMethod(!0),indexOf:createMethod(!1)}},3610:(i,s,u)=>{var m=u(86843),v=u(95329),_=u(37026),j=u(89678),M=u(10623),$=u(64692),W=v([].push),createMethod=function(i){var s=1==i,u=2==i,v=3==i,X=4==i,Y=6==i,Z=7==i,ee=5==i||Y;return function(ie,ae,ce,le){for(var pe,de,fe=j(ie),ye=_(fe),be=m(ae,ce),_e=M(ye),we=0,Se=le||$,xe=s?Se(ie,_e):u||Z?Se(ie,0):void 0;_e>we;we++)if((ee||we in ye)&&(de=be(pe=ye[we],we,fe),i))if(s)xe[we]=de;else if(de)switch(i){case 3:return!0;case 5:return pe;case 6:return we;case 2:W(xe,pe)}else switch(i){case 4:return!1;case 7:W(xe,pe)}return Y?-1:v||X?X:xe}};i.exports={forEach:createMethod(0),map:createMethod(1),filter:createMethod(2),some:createMethod(3),every:createMethod(4),find:createMethod(5),findIndex:createMethod(6),filterReject:createMethod(7)}},50568:(i,s,u)=>{var m=u(95981),v=u(99813),_=u(53385),j=v("species");i.exports=function(i){return _>=51||!m((function(){var s=[];return(s.constructor={})[j]=function(){return{foo:1}},1!==s[i](Boolean).foo}))}},34194:(i,s,u)=>{"use strict";var m=u(95981);i.exports=function(i,s){var u=[][i];return!!u&&m((function(){u.call(null,s||function(){return 1},1)}))}},89779:(i,s,u)=>{"use strict";var m=u(55746),v=u(1052),_=TypeError,j=Object.getOwnPropertyDescriptor,M=m&&!function(){if(void 0!==this)return!0;try{Object.defineProperty([],"length",{writable:!1}).length=1}catch(i){return i instanceof TypeError}}();i.exports=M?function(i,s){if(v(i)&&!j(i,"length").writable)throw _("Cannot set read only .length");return i.length=s}:function(i,s){return i.length=s}},15790:(i,s,u)=>{var m=u(59413),v=u(10623),_=u(55449),j=Array,M=Math.max;i.exports=function(i,s,u){for(var $=v(i),W=m(s,$),X=m(void 0===u?$:u,$),Y=j(M(X-W,0)),Z=0;W{var m=u(95329);i.exports=m([].slice)},5693:(i,s,u)=>{var m=u(1052),v=u(24284),_=u(10941),j=u(99813)("species"),M=Array;i.exports=function(i){var s;return m(i)&&(s=i.constructor,(v(s)&&(s===M||m(s.prototype))||_(s)&&null===(s=s[j]))&&(s=void 0)),void 0===s?M:s}},64692:(i,s,u)=>{var m=u(5693);i.exports=function(i,s){return new(m(i))(0===s?0:s)}},82532:(i,s,u)=>{var m=u(95329),v=m({}.toString),_=m("".slice);i.exports=function(i){return _(v(i),8,-1)}},9697:(i,s,u)=>{var m=u(22885),v=u(57475),_=u(82532),j=u(99813)("toStringTag"),M=Object,$="Arguments"==_(function(){return arguments}());i.exports=m?_:function(i){var s,u,m;return void 0===i?"Undefined":null===i?"Null":"string"==typeof(u=function(i,s){try{return i[s]}catch(i){}}(s=M(i),j))?u:$?_(s):"Object"==(m=_(s))&&v(s.callee)?"Arguments":m}},91310:(i,s,u)=>{var m=u(95981);i.exports=!m((function(){function F(){}return F.prototype.constructor=null,Object.getPrototypeOf(new F)!==F.prototype}))},23538:i=>{i.exports=function(i,s){return{value:i,done:s}}},32029:(i,s,u)=>{var m=u(55746),v=u(65988),_=u(31887);i.exports=m?function(i,s,u){return v.f(i,s,_(1,u))}:function(i,s,u){return i[s]=u,i}},31887:i=>{i.exports=function(i,s){return{enumerable:!(1&i),configurable:!(2&i),writable:!(4&i),value:s}}},55449:(i,s,u)=>{"use strict";var m=u(83894),v=u(65988),_=u(31887);i.exports=function(i,s,u){var j=m(s);j in i?v.f(i,j,_(0,u)):i[j]=u}},29202:(i,s,u)=>{var m=u(65988);i.exports=function(i,s,u){return m.f(i,s,u)}},95929:(i,s,u)=>{var m=u(32029);i.exports=function(i,s,u,v){return v&&v.enumerable?i[s]=u:m(i,s,u),i}},75609:(i,s,u)=>{var m=u(21899),v=Object.defineProperty;i.exports=function(i,s){try{v(m,i,{value:s,configurable:!0,writable:!0})}catch(u){m[i]=s}return s}},55746:(i,s,u)=>{var m=u(95981);i.exports=!m((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},76616:i=>{var s="object"==typeof document&&document.all,u=void 0===s&&void 0!==s;i.exports={all:s,IS_HTMLDDA:u}},61333:(i,s,u)=>{var m=u(21899),v=u(10941),_=m.document,j=v(_)&&v(_.createElement);i.exports=function(i){return j?_.createElement(i):{}}},66796:i=>{var s=TypeError;i.exports=function(i){if(i>9007199254740991)throw s("Maximum allowed index exceeded");return i}},63281:i=>{i.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},2861:i=>{i.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},53385:(i,s,u)=>{var m,v,_=u(21899),j=u(2861),M=_.process,$=_.Deno,W=M&&M.versions||$&&$.version,X=W&&W.v8;X&&(v=(m=X.split("."))[0]>0&&m[0]<4?1:+(m[0]+m[1])),!v&&j&&(!(m=j.match(/Edge\/(\d+)/))||m[1]>=74)&&(m=j.match(/Chrome\/(\d+)/))&&(v=+m[1]),i.exports=v},35703:(i,s,u)=>{var m=u(54058);i.exports=function(i){return m[i+"Prototype"]}},56759:i=>{i.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},76887:(i,s,u)=>{"use strict";var m=u(21899),v=u(79730),_=u(97484),j=u(57475),M=u(49677).f,$=u(37252),W=u(54058),X=u(86843),Y=u(32029),Z=u(90953),wrapConstructor=function(i){var Wrapper=function(s,u,m){if(this instanceof Wrapper){switch(arguments.length){case 0:return new i;case 1:return new i(s);case 2:return new i(s,u)}return new i(s,u,m)}return v(i,this,arguments)};return Wrapper.prototype=i.prototype,Wrapper};i.exports=function(i,s){var u,v,ee,ie,ae,ce,le,pe,de,fe=i.target,ye=i.global,be=i.stat,_e=i.proto,we=ye?m:be?m[fe]:(m[fe]||{}).prototype,Se=ye?W:W[fe]||Y(W,fe,{})[fe],xe=Se.prototype;for(ie in s)v=!(u=$(ye?ie:fe+(be?".":"#")+ie,i.forced))&&we&&Z(we,ie),ce=Se[ie],v&&(le=i.dontCallGetSet?(de=M(we,ie))&&de.value:we[ie]),ae=v&&le?le:s[ie],v&&typeof ce==typeof ae||(pe=i.bind&&v?X(ae,m):i.wrap&&v?wrapConstructor(ae):_e&&j(ae)?_(ae):ae,(i.sham||ae&&ae.sham||ce&&ce.sham)&&Y(pe,"sham",!0),Y(Se,ie,pe),_e&&(Z(W,ee=fe+"Prototype")||Y(W,ee,{}),Y(W[ee],ie,ae),i.real&&xe&&(u||!xe[ie])&&Y(xe,ie,ae)))}},95981:i=>{i.exports=function(i){try{return!!i()}catch(i){return!0}}},79730:(i,s,u)=>{var m=u(18285),v=Function.prototype,_=v.apply,j=v.call;i.exports="object"==typeof Reflect&&Reflect.apply||(m?j.bind(_):function(){return j.apply(_,arguments)})},86843:(i,s,u)=>{var m=u(97484),v=u(24883),_=u(18285),j=m(m.bind);i.exports=function(i,s){return v(i),void 0===s?i:_?j(i,s):function(){return i.apply(s,arguments)}}},18285:(i,s,u)=>{var m=u(95981);i.exports=!m((function(){var i=function(){}.bind();return"function"!=typeof i||i.hasOwnProperty("prototype")}))},98308:(i,s,u)=>{"use strict";var m=u(95329),v=u(24883),_=u(10941),j=u(90953),M=u(93765),$=u(18285),W=Function,X=m([].concat),Y=m([].join),Z={};i.exports=$?W.bind:function bind(i){var s=v(this),u=s.prototype,m=M(arguments,1),$=function bound(){var u=X(m,M(arguments));return this instanceof $?function(i,s,u){if(!j(Z,s)){for(var m=[],v=0;v{var m=u(18285),v=Function.prototype.call;i.exports=m?v.bind(v):function(){return v.apply(v,arguments)}},79417:(i,s,u)=>{var m=u(55746),v=u(90953),_=Function.prototype,j=m&&Object.getOwnPropertyDescriptor,M=v(_,"name"),$=M&&"something"===function something(){}.name,W=M&&(!m||m&&j(_,"name").configurable);i.exports={EXISTS:M,PROPER:$,CONFIGURABLE:W}},45526:(i,s,u)=>{var m=u(95329),v=u(24883);i.exports=function(i,s,u){try{return m(v(Object.getOwnPropertyDescriptor(i,s)[u]))}catch(i){}}},97484:(i,s,u)=>{var m=u(82532),v=u(95329);i.exports=function(i){if("Function"===m(i))return v(i)}},95329:(i,s,u)=>{var m=u(18285),v=Function.prototype,_=v.call,j=m&&v.bind.bind(_,_);i.exports=m?j:function(i){return function(){return _.apply(i,arguments)}}},626:(i,s,u)=>{var m=u(54058),v=u(21899),_=u(57475),aFunction=function(i){return _(i)?i:void 0};i.exports=function(i,s){return arguments.length<2?aFunction(m[i])||aFunction(v[i]):m[i]&&m[i][s]||v[i]&&v[i][s]}},33323:(i,s,u)=>{var m=u(95329),v=u(1052),_=u(57475),j=u(82532),M=u(85803),$=m([].push);i.exports=function(i){if(_(i))return i;if(v(i)){for(var s=i.length,u=[],m=0;m{var m=u(24883),v=u(82119);i.exports=function(i,s){var u=i[s];return v(u)?void 0:m(u)}},21899:function(i,s,u){var check=function(i){return i&&i.Math==Math&&i};i.exports=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof u.g&&u.g)||function(){return this}()||this||Function("return this")()},90953:(i,s,u)=>{var m=u(95329),v=u(89678),_=m({}.hasOwnProperty);i.exports=Object.hasOwn||function hasOwn(i,s){return _(v(i),s)}},27748:i=>{i.exports={}},15463:(i,s,u)=>{var m=u(626);i.exports=m("document","documentElement")},2840:(i,s,u)=>{var m=u(55746),v=u(95981),_=u(61333);i.exports=!m&&!v((function(){return 7!=Object.defineProperty(_("div"),"a",{get:function(){return 7}}).a}))},37026:(i,s,u)=>{var m=u(95329),v=u(95981),_=u(82532),j=Object,M=m("".split);i.exports=v((function(){return!j("z").propertyIsEnumerable(0)}))?function(i){return"String"==_(i)?M(i,""):j(i)}:j},81302:(i,s,u)=>{var m=u(95329),v=u(57475),_=u(63030),j=m(Function.toString);v(_.inspectSource)||(_.inspectSource=function(i){return j(i)}),i.exports=_.inspectSource},45402:(i,s,u)=>{var m,v,_,j=u(47093),M=u(21899),$=u(10941),W=u(32029),X=u(90953),Y=u(63030),Z=u(44262),ee=u(27748),ie="Object already initialized",ae=M.TypeError,ce=M.WeakMap;if(j||Y.state){var le=Y.state||(Y.state=new ce);le.get=le.get,le.has=le.has,le.set=le.set,m=function(i,s){if(le.has(i))throw ae(ie);return s.facade=i,le.set(i,s),s},v=function(i){return le.get(i)||{}},_=function(i){return le.has(i)}}else{var pe=Z("state");ee[pe]=!0,m=function(i,s){if(X(i,pe))throw ae(ie);return s.facade=i,W(i,pe,s),s},v=function(i){return X(i,pe)?i[pe]:{}},_=function(i){return X(i,pe)}}i.exports={set:m,get:v,has:_,enforce:function(i){return _(i)?v(i):m(i,{})},getterFor:function(i){return function(s){var u;if(!$(s)||(u=v(s)).type!==i)throw ae("Incompatible receiver, "+i+" required");return u}}}},1052:(i,s,u)=>{var m=u(82532);i.exports=Array.isArray||function isArray(i){return"Array"==m(i)}},57475:(i,s,u)=>{var m=u(76616),v=m.all;i.exports=m.IS_HTMLDDA?function(i){return"function"==typeof i||i===v}:function(i){return"function"==typeof i}},24284:(i,s,u)=>{var m=u(95329),v=u(95981),_=u(57475),j=u(9697),M=u(626),$=u(81302),noop=function(){},W=[],X=M("Reflect","construct"),Y=/^\s*(?:class|function)\b/,Z=m(Y.exec),ee=!Y.exec(noop),ie=function isConstructor(i){if(!_(i))return!1;try{return X(noop,W,i),!0}catch(i){return!1}},ae=function isConstructor(i){if(!_(i))return!1;switch(j(i)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return ee||!!Z(Y,$(i))}catch(i){return!0}};ae.sham=!0,i.exports=!X||v((function(){var i;return ie(ie.call)||!ie(Object)||!ie((function(){i=!0}))||i}))?ae:ie},37252:(i,s,u)=>{var m=u(95981),v=u(57475),_=/#|\.prototype\./,isForced=function(i,s){var u=M[j(i)];return u==W||u!=$&&(v(s)?m(s):!!s)},j=isForced.normalize=function(i){return String(i).replace(_,".").toLowerCase()},M=isForced.data={},$=isForced.NATIVE="N",W=isForced.POLYFILL="P";i.exports=isForced},82119:i=>{i.exports=function(i){return null==i}},10941:(i,s,u)=>{var m=u(57475),v=u(76616),_=v.all;i.exports=v.IS_HTMLDDA?function(i){return"object"==typeof i?null!==i:m(i)||i===_}:function(i){return"object"==typeof i?null!==i:m(i)}},82529:i=>{i.exports=!0},56664:(i,s,u)=>{var m=u(626),v=u(57475),_=u(7046),j=u(32302),M=Object;i.exports=j?function(i){return"symbol"==typeof i}:function(i){var s=m("Symbol");return v(s)&&_(s.prototype,M(i))}},53847:(i,s,u)=>{"use strict";var m=u(35143).IteratorPrototype,v=u(29290),_=u(31887),j=u(90904),M=u(12077),returnThis=function(){return this};i.exports=function(i,s,u,$){var W=s+" Iterator";return i.prototype=v(m,{next:_(+!$,u)}),j(i,W,!1,!0),M[W]=returnThis,i}},75105:(i,s,u)=>{"use strict";var m=u(76887),v=u(78834),_=u(82529),j=u(79417),M=u(57475),$=u(53847),W=u(249),X=u(88929),Y=u(90904),Z=u(32029),ee=u(95929),ie=u(99813),ae=u(12077),ce=u(35143),le=j.PROPER,pe=j.CONFIGURABLE,de=ce.IteratorPrototype,fe=ce.BUGGY_SAFARI_ITERATORS,ye=ie("iterator"),be="keys",_e="values",we="entries",returnThis=function(){return this};i.exports=function(i,s,u,j,ie,ce,Se){$(u,s,j);var xe,Pe,Ie,getIterationMethod=function(i){if(i===ie&&Ve)return Ve;if(!fe&&i in qe)return qe[i];switch(i){case be:return function keys(){return new u(this,i)};case _e:return function values(){return new u(this,i)};case we:return function entries(){return new u(this,i)}}return function(){return new u(this)}},Te=s+" Iterator",Re=!1,qe=i.prototype,ze=qe[ye]||qe["@@iterator"]||ie&&qe[ie],Ve=!fe&&ze||getIterationMethod(ie),We="Array"==s&&qe.entries||ze;if(We&&(xe=W(We.call(new i)))!==Object.prototype&&xe.next&&(_||W(xe)===de||(X?X(xe,de):M(xe[ye])||ee(xe,ye,returnThis)),Y(xe,Te,!0,!0),_&&(ae[Te]=returnThis)),le&&ie==_e&&ze&&ze.name!==_e&&(!_&&pe?Z(qe,"name",_e):(Re=!0,Ve=function values(){return v(ze,this)})),ie)if(Pe={values:getIterationMethod(_e),keys:ce?Ve:getIterationMethod(be),entries:getIterationMethod(we)},Se)for(Ie in Pe)(fe||Re||!(Ie in qe))&&ee(qe,Ie,Pe[Ie]);else m({target:s,proto:!0,forced:fe||Re},Pe);return _&&!Se||qe[ye]===Ve||ee(qe,ye,Ve,{name:ie}),ae[s]=Ve,Pe}},35143:(i,s,u)=>{"use strict";var m,v,_,j=u(95981),M=u(57475),$=u(10941),W=u(29290),X=u(249),Y=u(95929),Z=u(99813),ee=u(82529),ie=Z("iterator"),ae=!1;[].keys&&("next"in(_=[].keys())?(v=X(X(_)))!==Object.prototype&&(m=v):ae=!0),!$(m)||j((function(){var i={};return m[ie].call(i)!==i}))?m={}:ee&&(m=W(m)),M(m[ie])||Y(m,ie,(function(){return this})),i.exports={IteratorPrototype:m,BUGGY_SAFARI_ITERATORS:ae}},12077:i=>{i.exports={}},10623:(i,s,u)=>{var m=u(43057);i.exports=function(i){return m(i.length)}},35331:i=>{var s=Math.ceil,u=Math.floor;i.exports=Math.trunc||function trunc(i){var m=+i;return(m>0?u:s)(m)}},24420:(i,s,u)=>{"use strict";var m=u(55746),v=u(95329),_=u(78834),j=u(95981),M=u(14771),$=u(87857),W=u(36760),X=u(89678),Y=u(37026),Z=Object.assign,ee=Object.defineProperty,ie=v([].concat);i.exports=!Z||j((function(){if(m&&1!==Z({b:1},Z(ee({},"a",{enumerable:!0,get:function(){ee(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var i={},s={},u=Symbol(),v="abcdefghijklmnopqrst";return i[u]=7,v.split("").forEach((function(i){s[i]=i})),7!=Z({},i)[u]||M(Z({},s)).join("")!=v}))?function assign(i,s){for(var u=X(i),v=arguments.length,j=1,Z=$.f,ee=W.f;v>j;)for(var ae,ce=Y(arguments[j++]),le=Z?ie(M(ce),Z(ce)):M(ce),pe=le.length,de=0;pe>de;)ae=le[de++],m&&!_(ee,ce,ae)||(u[ae]=ce[ae]);return u}:Z},29290:(i,s,u)=>{var m,v=u(96059),_=u(59938),j=u(56759),M=u(27748),$=u(15463),W=u(61333),X=u(44262),Y="prototype",Z="script",ee=X("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(i){return"<"+Z+">"+i+""},NullProtoObjectViaActiveX=function(i){i.write(scriptTag("")),i.close();var s=i.parentWindow.Object;return i=null,s},NullProtoObject=function(){try{m=new ActiveXObject("htmlfile")}catch(i){}var i,s,u;NullProtoObject="undefined"!=typeof document?document.domain&&m?NullProtoObjectViaActiveX(m):(s=W("iframe"),u="java"+Z+":",s.style.display="none",$.appendChild(s),s.src=String(u),(i=s.contentWindow.document).open(),i.write(scriptTag("document.F=Object")),i.close(),i.F):NullProtoObjectViaActiveX(m);for(var v=j.length;v--;)delete NullProtoObject[Y][j[v]];return NullProtoObject()};M[ee]=!0,i.exports=Object.create||function create(i,s){var u;return null!==i?(EmptyConstructor[Y]=v(i),u=new EmptyConstructor,EmptyConstructor[Y]=null,u[ee]=i):u=NullProtoObject(),void 0===s?u:_.f(u,s)}},59938:(i,s,u)=>{var m=u(55746),v=u(83937),_=u(65988),j=u(96059),M=u(74529),$=u(14771);s.f=m&&!v?Object.defineProperties:function defineProperties(i,s){j(i);for(var u,m=M(s),v=$(s),W=v.length,X=0;W>X;)_.f(i,u=v[X++],m[u]);return i}},65988:(i,s,u)=>{var m=u(55746),v=u(2840),_=u(83937),j=u(96059),M=u(83894),$=TypeError,W=Object.defineProperty,X=Object.getOwnPropertyDescriptor,Y="enumerable",Z="configurable",ee="writable";s.f=m?_?function defineProperty(i,s,u){if(j(i),s=M(s),j(u),"function"==typeof i&&"prototype"===s&&"value"in u&&ee in u&&!u[ee]){var m=X(i,s);m&&m[ee]&&(i[s]=u.value,u={configurable:Z in u?u[Z]:m[Z],enumerable:Y in u?u[Y]:m[Y],writable:!1})}return W(i,s,u)}:W:function defineProperty(i,s,u){if(j(i),s=M(s),j(u),v)try{return W(i,s,u)}catch(i){}if("get"in u||"set"in u)throw $("Accessors not supported");return"value"in u&&(i[s]=u.value),i}},49677:(i,s,u)=>{var m=u(55746),v=u(78834),_=u(36760),j=u(31887),M=u(74529),$=u(83894),W=u(90953),X=u(2840),Y=Object.getOwnPropertyDescriptor;s.f=m?Y:function getOwnPropertyDescriptor(i,s){if(i=M(i),s=$(s),X)try{return Y(i,s)}catch(i){}if(W(i,s))return j(!v(_.f,i,s),i[s])}},684:(i,s,u)=>{var m=u(82532),v=u(74529),_=u(10946).f,j=u(15790),M="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];i.exports.f=function getOwnPropertyNames(i){return M&&"Window"==m(i)?function(i){try{return _(i)}catch(i){return j(M)}}(i):_(v(i))}},10946:(i,s,u)=>{var m=u(55629),v=u(56759).concat("length","prototype");s.f=Object.getOwnPropertyNames||function getOwnPropertyNames(i){return m(i,v)}},87857:(i,s)=>{s.f=Object.getOwnPropertySymbols},249:(i,s,u)=>{var m=u(90953),v=u(57475),_=u(89678),j=u(44262),M=u(91310),$=j("IE_PROTO"),W=Object,X=W.prototype;i.exports=M?W.getPrototypeOf:function(i){var s=_(i);if(m(s,$))return s[$];var u=s.constructor;return v(u)&&s instanceof u?u.prototype:s instanceof W?X:null}},7046:(i,s,u)=>{var m=u(95329);i.exports=m({}.isPrototypeOf)},55629:(i,s,u)=>{var m=u(95329),v=u(90953),_=u(74529),j=u(31692).indexOf,M=u(27748),$=m([].push);i.exports=function(i,s){var u,m=_(i),W=0,X=[];for(u in m)!v(M,u)&&v(m,u)&&$(X,u);for(;s.length>W;)v(m,u=s[W++])&&(~j(X,u)||$(X,u));return X}},14771:(i,s,u)=>{var m=u(55629),v=u(56759);i.exports=Object.keys||function keys(i){return m(i,v)}},36760:(i,s)=>{"use strict";var u={}.propertyIsEnumerable,m=Object.getOwnPropertyDescriptor,v=m&&!u.call({1:2},1);s.f=v?function propertyIsEnumerable(i){var s=m(this,i);return!!s&&s.enumerable}:u},88929:(i,s,u)=>{var m=u(45526),v=u(96059),_=u(11851);i.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var i,s=!1,u={};try{(i=m(Object.prototype,"__proto__","set"))(u,[]),s=u instanceof Array}catch(i){}return function setPrototypeOf(u,m){return v(u),_(m),s?i(u,m):u.__proto__=m,u}}():void 0)},95623:(i,s,u)=>{"use strict";var m=u(22885),v=u(9697);i.exports=m?{}.toString:function toString(){return"[object "+v(this)+"]"}},39811:(i,s,u)=>{var m=u(78834),v=u(57475),_=u(10941),j=TypeError;i.exports=function(i,s){var u,M;if("string"===s&&v(u=i.toString)&&!_(M=m(u,i)))return M;if(v(u=i.valueOf)&&!_(M=m(u,i)))return M;if("string"!==s&&v(u=i.toString)&&!_(M=m(u,i)))return M;throw j("Can't convert object to primitive value")}},31136:(i,s,u)=>{var m=u(626),v=u(95329),_=u(10946),j=u(87857),M=u(96059),$=v([].concat);i.exports=m("Reflect","ownKeys")||function ownKeys(i){var s=_.f(M(i)),u=j.f;return u?$(s,u(i)):s}},54058:i=>{i.exports={}},48219:(i,s,u)=>{var m=u(82119),v=TypeError;i.exports=function(i){if(m(i))throw v("Can't call method on "+i);return i}},90904:(i,s,u)=>{var m=u(22885),v=u(65988).f,_=u(32029),j=u(90953),M=u(95623),$=u(99813)("toStringTag");i.exports=function(i,s,u,W){if(i){var X=u?i:i.prototype;j(X,$)||v(X,$,{configurable:!0,value:s}),W&&!m&&_(X,"toString",M)}}},44262:(i,s,u)=>{var m=u(68726),v=u(99418),_=m("keys");i.exports=function(i){return _[i]||(_[i]=v(i))}},63030:(i,s,u)=>{var m=u(21899),v=u(75609),_="__core-js_shared__",j=m[_]||v(_,{});i.exports=j},68726:(i,s,u)=>{var m=u(82529),v=u(63030);(i.exports=function(i,s){return v[i]||(v[i]=void 0!==s?s:{})})("versions",[]).push({version:"3.31.1",mode:m?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.31.1/LICENSE",source:"https://github.com/zloirock/core-js"})},64620:(i,s,u)=>{var m=u(95329),v=u(62435),_=u(85803),j=u(48219),M=m("".charAt),$=m("".charCodeAt),W=m("".slice),createMethod=function(i){return function(s,u){var m,X,Y=_(j(s)),Z=v(u),ee=Y.length;return Z<0||Z>=ee?i?"":void 0:(m=$(Y,Z))<55296||m>56319||Z+1===ee||(X=$(Y,Z+1))<56320||X>57343?i?M(Y,Z):m:i?W(Y,Z,Z+2):X-56320+(m-55296<<10)+65536}};i.exports={codeAt:createMethod(!1),charAt:createMethod(!0)}},63405:(i,s,u)=>{var m=u(53385),v=u(95981),_=u(21899).String;i.exports=!!Object.getOwnPropertySymbols&&!v((function(){var i=Symbol();return!_(i)||!(Object(i)instanceof Symbol)||!Symbol.sham&&m&&m<41}))},29630:(i,s,u)=>{var m=u(78834),v=u(626),_=u(99813),j=u(95929);i.exports=function(){var i=v("Symbol"),s=i&&i.prototype,u=s&&s.valueOf,M=_("toPrimitive");s&&!s[M]&&j(s,M,(function(i){return m(u,this)}),{arity:1})}},32087:(i,s,u)=>{var m=u(626),v=u(95329),_=m("Symbol"),j=_.keyFor,M=v(_.prototype.valueOf);i.exports=_.isRegisteredSymbol||function isRegisteredSymbol(i){try{return void 0!==j(M(i))}catch(i){return!1}}},96559:(i,s,u)=>{for(var m=u(68726),v=u(626),_=u(95329),j=u(56664),M=u(99813),$=v("Symbol"),W=$.isWellKnownSymbol,X=v("Object","getOwnPropertyNames"),Y=_($.prototype.valueOf),Z=m("wks"),ee=0,ie=X($),ae=ie.length;ee{var m=u(63405);i.exports=m&&!!Symbol.for&&!!Symbol.keyFor},59413:(i,s,u)=>{var m=u(62435),v=Math.max,_=Math.min;i.exports=function(i,s){var u=m(i);return u<0?v(u+s,0):_(u,s)}},74529:(i,s,u)=>{var m=u(37026),v=u(48219);i.exports=function(i){return m(v(i))}},62435:(i,s,u)=>{var m=u(35331);i.exports=function(i){var s=+i;return s!=s||0===s?0:m(s)}},43057:(i,s,u)=>{var m=u(62435),v=Math.min;i.exports=function(i){return i>0?v(m(i),9007199254740991):0}},89678:(i,s,u)=>{var m=u(48219),v=Object;i.exports=function(i){return v(m(i))}},46935:(i,s,u)=>{var m=u(78834),v=u(10941),_=u(56664),j=u(14229),M=u(39811),$=u(99813),W=TypeError,X=$("toPrimitive");i.exports=function(i,s){if(!v(i)||_(i))return i;var u,$=j(i,X);if($){if(void 0===s&&(s="default"),u=m($,i,s),!v(u)||_(u))return u;throw W("Can't convert object to primitive value")}return void 0===s&&(s="number"),M(i,s)}},83894:(i,s,u)=>{var m=u(46935),v=u(56664);i.exports=function(i){var s=m(i,"string");return v(s)?s:s+""}},22885:(i,s,u)=>{var m={};m[u(99813)("toStringTag")]="z",i.exports="[object z]"===String(m)},85803:(i,s,u)=>{var m=u(9697),v=String;i.exports=function(i){if("Symbol"===m(i))throw TypeError("Cannot convert a Symbol value to a string");return v(i)}},69826:i=>{var s=String;i.exports=function(i){try{return s(i)}catch(i){return"Object"}}},99418:(i,s,u)=>{var m=u(95329),v=0,_=Math.random(),j=m(1..toString);i.exports=function(i){return"Symbol("+(void 0===i?"":i)+")_"+j(++v+_,36)}},32302:(i,s,u)=>{var m=u(63405);i.exports=m&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},83937:(i,s,u)=>{var m=u(55746),v=u(95981);i.exports=m&&v((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},47093:(i,s,u)=>{var m=u(21899),v=u(57475),_=m.WeakMap;i.exports=v(_)&&/native code/.test(String(_))},73464:(i,s,u)=>{var m=u(54058),v=u(90953),_=u(11477),j=u(65988).f;i.exports=function(i){var s=m.Symbol||(m.Symbol={});v(s,i)||j(s,i,{value:_.f(i)})}},11477:(i,s,u)=>{var m=u(99813);s.f=m},99813:(i,s,u)=>{var m=u(21899),v=u(68726),_=u(90953),j=u(99418),M=u(63405),$=u(32302),W=m.Symbol,X=v("wks"),Y=$?W.for||W:W&&W.withoutSetter||j;i.exports=function(i){return _(X,i)||(X[i]=M&&_(W,i)?W[i]:Y("Symbol."+i)),X[i]}},85906:(i,s,u)=>{"use strict";var m=u(76887),v=u(95981),_=u(1052),j=u(10941),M=u(89678),$=u(10623),W=u(66796),X=u(55449),Y=u(64692),Z=u(50568),ee=u(99813),ie=u(53385),ae=ee("isConcatSpreadable"),ce=ie>=51||!v((function(){var i=[];return i[ae]=!1,i.concat()[0]!==i})),isConcatSpreadable=function(i){if(!j(i))return!1;var s=i[ae];return void 0!==s?!!s:_(i)};m({target:"Array",proto:!0,arity:1,forced:!ce||!Z("concat")},{concat:function concat(i){var s,u,m,v,_,j=M(this),Z=Y(j,0),ee=0;for(s=-1,m=arguments.length;s{"use strict";var m=u(76887),v=u(3610).filter;m({target:"Array",proto:!0,forced:!u(50568)("filter")},{filter:function filter(i){return v(this,i,arguments.length>1?arguments[1]:void 0)}})},2437:(i,s,u)=>{"use strict";var m=u(76887),v=u(56837);m({target:"Array",proto:!0,forced:[].forEach!=v},{forEach:v})},99076:(i,s,u)=>{"use strict";var m=u(76887),v=u(97484),_=u(31692).indexOf,j=u(34194),M=v([].indexOf),$=!!M&&1/M([1],1,-0)<0;m({target:"Array",proto:!0,forced:$||!j("indexOf")},{indexOf:function indexOf(i){var s=arguments.length>1?arguments[1]:void 0;return $?M(this,i,s)||0:_(this,i,s)}})},66274:(i,s,u)=>{"use strict";var m=u(74529),v=u(18479),_=u(12077),j=u(45402),M=u(65988).f,$=u(75105),W=u(23538),X=u(82529),Y=u(55746),Z="Array Iterator",ee=j.set,ie=j.getterFor(Z);i.exports=$(Array,"Array",(function(i,s){ee(this,{type:Z,target:m(i),index:0,kind:s})}),(function(){var i=ie(this),s=i.target,u=i.kind,m=i.index++;return!s||m>=s.length?(i.target=void 0,W(void 0,!0)):W("keys"==u?m:"values"==u?s[m]:[m,s[m]],!1)}),"values");var ae=_.Arguments=_.Array;if(v("keys"),v("values"),v("entries"),!X&&Y&&"values"!==ae.name)try{M(ae,"name",{value:"values"})}catch(i){}},48528:(i,s,u)=>{"use strict";var m=u(76887),v=u(89678),_=u(10623),j=u(89779),M=u(66796);m({target:"Array",proto:!0,arity:1,forced:u(95981)((function(){return 4294967297!==[].push.call({length:4294967296},1)}))||!function(){try{Object.defineProperty([],"length",{writable:!1}).push()}catch(i){return i instanceof TypeError}}()},{push:function push(i){var s=v(this),u=_(s),m=arguments.length;M(u+m);for(var $=0;${},73381:(i,s,u)=>{var m=u(76887),v=u(98308);m({target:"Function",proto:!0,forced:Function.bind!==v},{bind:v})},32619:(i,s,u)=>{var m=u(76887),v=u(626),_=u(79730),j=u(78834),M=u(95329),$=u(95981),W=u(57475),X=u(56664),Y=u(93765),Z=u(33323),ee=u(63405),ie=String,ae=v("JSON","stringify"),ce=M(/./.exec),le=M("".charAt),pe=M("".charCodeAt),de=M("".replace),fe=M(1..toString),ye=/[\uD800-\uDFFF]/g,be=/^[\uD800-\uDBFF]$/,_e=/^[\uDC00-\uDFFF]$/,we=!ee||$((function(){var i=v("Symbol")();return"[null]"!=ae([i])||"{}"!=ae({a:i})||"{}"!=ae(Object(i))})),Se=$((function(){return'"\\udf06\\ud834"'!==ae("\udf06\ud834")||'"\\udead"'!==ae("\udead")})),stringifyWithSymbolsFix=function(i,s){var u=Y(arguments),m=Z(s);if(W(m)||void 0!==i&&!X(i))return u[1]=function(i,s){if(W(m)&&(s=j(m,this,ie(i),s)),!X(s))return s},_(ae,null,u)},fixIllFormed=function(i,s,u){var m=le(u,s-1),v=le(u,s+1);return ce(be,i)&&!ce(_e,v)||ce(_e,i)&&!ce(be,m)?"\\u"+fe(pe(i,0),16):i};ae&&m({target:"JSON",stat:!0,arity:3,forced:we||Se},{stringify:function stringify(i,s,u){var m=Y(arguments),v=_(we?stringifyWithSymbolsFix:ae,null,m);return Se&&"string"==typeof v?de(v,ye,fixIllFormed):v}})},69120:(i,s,u)=>{var m=u(21899);u(90904)(m.JSON,"JSON",!0)},79413:()=>{},49221:(i,s,u)=>{var m=u(76887),v=u(24420);m({target:"Object",stat:!0,arity:2,forced:Object.assign!==v},{assign:v})},74979:(i,s,u)=>{var m=u(76887),v=u(55746),_=u(59938).f;m({target:"Object",stat:!0,forced:Object.defineProperties!==_,sham:!v},{defineProperties:_})},86450:(i,s,u)=>{var m=u(76887),v=u(55746),_=u(65988).f;m({target:"Object",stat:!0,forced:Object.defineProperty!==_,sham:!v},{defineProperty:_})},46924:(i,s,u)=>{var m=u(76887),v=u(95981),_=u(74529),j=u(49677).f,M=u(55746);m({target:"Object",stat:!0,forced:!M||v((function(){j(1)})),sham:!M},{getOwnPropertyDescriptor:function getOwnPropertyDescriptor(i,s){return j(_(i),s)}})},88482:(i,s,u)=>{var m=u(76887),v=u(55746),_=u(31136),j=u(74529),M=u(49677),$=u(55449);m({target:"Object",stat:!0,sham:!v},{getOwnPropertyDescriptors:function getOwnPropertyDescriptors(i){for(var s,u,m=j(i),v=M.f,W=_(m),X={},Y=0;W.length>Y;)void 0!==(u=v(m,s=W[Y++]))&&$(X,s,u);return X}})},37144:(i,s,u)=>{var m=u(76887),v=u(63405),_=u(95981),j=u(87857),M=u(89678);m({target:"Object",stat:!0,forced:!v||_((function(){j.f(1)}))},{getOwnPropertySymbols:function getOwnPropertySymbols(i){var s=j.f;return s?s(M(i)):[]}})},21724:(i,s,u)=>{var m=u(76887),v=u(89678),_=u(14771);m({target:"Object",stat:!0,forced:u(95981)((function(){_(1)}))},{keys:function keys(i){return _(v(i))}})},55967:()=>{},1502:()=>{},77971:(i,s,u)=>{"use strict";var m=u(64620).charAt,v=u(85803),_=u(45402),j=u(75105),M=u(23538),$="String Iterator",W=_.set,X=_.getterFor($);j(String,"String",(function(i){W(this,{type:$,string:v(i),index:0})}),(function next(){var i,s=X(this),u=s.string,v=s.index;return v>=u.length?M(void 0,!0):(i=m(u,v),s.index+=i.length,M(i,!1))}))},8555:(i,s,u)=>{u(73464)("asyncIterator")},48616:(i,s,u)=>{"use strict";var m=u(76887),v=u(21899),_=u(78834),j=u(95329),M=u(82529),$=u(55746),W=u(63405),X=u(95981),Y=u(90953),Z=u(7046),ee=u(96059),ie=u(74529),ae=u(83894),ce=u(85803),le=u(31887),pe=u(29290),de=u(14771),fe=u(10946),ye=u(684),be=u(87857),_e=u(49677),we=u(65988),Se=u(59938),xe=u(36760),Pe=u(95929),Ie=u(29202),Te=u(68726),Re=u(44262),qe=u(27748),ze=u(99418),Ve=u(99813),We=u(11477),He=u(73464),Xe=u(29630),Ye=u(90904),Qe=u(45402),et=u(3610).forEach,tt=Re("hidden"),rt="Symbol",nt="prototype",ot=Qe.set,it=Qe.getterFor(rt),at=Object[nt],st=v.Symbol,ct=st&&st[nt],lt=v.TypeError,ut=v.QObject,pt=_e.f,ht=we.f,dt=ye.f,mt=xe.f,yt=j([].push),gt=Te("symbols"),vt=Te("op-symbols"),bt=Te("wks"),_t=!ut||!ut[nt]||!ut[nt].findChild,wt=$&&X((function(){return 7!=pe(ht({},"a",{get:function(){return ht(this,"a",{value:7}).a}})).a}))?function(i,s,u){var m=pt(at,s);m&&delete at[s],ht(i,s,u),m&&i!==at&&ht(at,s,m)}:ht,wrap=function(i,s){var u=gt[i]=pe(ct);return ot(u,{type:rt,tag:i,description:s}),$||(u.description=s),u},Et=function defineProperty(i,s,u){i===at&&Et(vt,s,u),ee(i);var m=ae(s);return ee(u),Y(gt,m)?(u.enumerable?(Y(i,tt)&&i[tt][m]&&(i[tt][m]=!1),u=pe(u,{enumerable:le(0,!1)})):(Y(i,tt)||ht(i,tt,le(1,{})),i[tt][m]=!0),wt(i,m,u)):ht(i,m,u)},St=function defineProperties(i,s){ee(i);var u=ie(s),m=de(u).concat($getOwnPropertySymbols(u));return et(m,(function(s){$&&!_(xt,u,s)||Et(i,s,u[s])})),i},xt=function propertyIsEnumerable(i){var s=ae(i),u=_(mt,this,s);return!(this===at&&Y(gt,s)&&!Y(vt,s))&&(!(u||!Y(this,s)||!Y(gt,s)||Y(this,tt)&&this[tt][s])||u)},Ot=function getOwnPropertyDescriptor(i,s){var u=ie(i),m=ae(s);if(u!==at||!Y(gt,m)||Y(vt,m)){var v=pt(u,m);return!v||!Y(gt,m)||Y(u,tt)&&u[tt][m]||(v.enumerable=!0),v}},kt=function getOwnPropertyNames(i){var s=dt(ie(i)),u=[];return et(s,(function(i){Y(gt,i)||Y(qe,i)||yt(u,i)})),u},$getOwnPropertySymbols=function(i){var s=i===at,u=dt(s?vt:ie(i)),m=[];return et(u,(function(i){!Y(gt,i)||s&&!Y(at,i)||yt(m,gt[i])})),m};W||(Pe(ct=(st=function Symbol(){if(Z(ct,this))throw lt("Symbol is not a constructor");var i=arguments.length&&void 0!==arguments[0]?ce(arguments[0]):void 0,s=ze(i),setter=function(i){this===at&&_(setter,vt,i),Y(this,tt)&&Y(this[tt],s)&&(this[tt][s]=!1),wt(this,s,le(1,i))};return $&&_t&&wt(at,s,{configurable:!0,set:setter}),wrap(s,i)})[nt],"toString",(function toString(){return it(this).tag})),Pe(st,"withoutSetter",(function(i){return wrap(ze(i),i)})),xe.f=xt,we.f=Et,Se.f=St,_e.f=Ot,fe.f=ye.f=kt,be.f=$getOwnPropertySymbols,We.f=function(i){return wrap(Ve(i),i)},$&&(Ie(ct,"description",{configurable:!0,get:function description(){return it(this).description}}),M||Pe(at,"propertyIsEnumerable",xt,{unsafe:!0}))),m({global:!0,constructor:!0,wrap:!0,forced:!W,sham:!W},{Symbol:st}),et(de(bt),(function(i){He(i)})),m({target:rt,stat:!0,forced:!W},{useSetter:function(){_t=!0},useSimple:function(){_t=!1}}),m({target:"Object",stat:!0,forced:!W,sham:!$},{create:function create(i,s){return void 0===s?pe(i):St(pe(i),s)},defineProperty:Et,defineProperties:St,getOwnPropertyDescriptor:Ot}),m({target:"Object",stat:!0,forced:!W},{getOwnPropertyNames:kt}),Xe(),Ye(st,rt),qe[tt]=!0},52615:()=>{},64523:(i,s,u)=>{var m=u(76887),v=u(626),_=u(90953),j=u(85803),M=u(68726),$=u(34680),W=M("string-to-symbol-registry"),X=M("symbol-to-string-registry");m({target:"Symbol",stat:!0,forced:!$},{for:function(i){var s=j(i);if(_(W,s))return W[s];var u=v("Symbol")(s);return W[s]=u,X[u]=s,u}})},21732:(i,s,u)=>{u(73464)("hasInstance")},35903:(i,s,u)=>{u(73464)("isConcatSpreadable")},1825:(i,s,u)=>{u(73464)("iterator")},35824:(i,s,u)=>{u(48616),u(64523),u(38608),u(32619),u(37144)},38608:(i,s,u)=>{var m=u(76887),v=u(90953),_=u(56664),j=u(69826),M=u(68726),$=u(34680),W=M("symbol-to-string-registry");m({target:"Symbol",stat:!0,forced:!$},{keyFor:function keyFor(i){if(!_(i))throw TypeError(j(i)+" is not a symbol");if(v(W,i))return W[i]}})},45915:(i,s,u)=>{u(73464)("matchAll")},28394:(i,s,u)=>{u(73464)("match")},61766:(i,s,u)=>{u(73464)("replace")},62737:(i,s,u)=>{u(73464)("search")},89911:(i,s,u)=>{u(73464)("species")},74315:(i,s,u)=>{u(73464)("split")},63131:(i,s,u)=>{var m=u(73464),v=u(29630);m("toPrimitive"),v()},64714:(i,s,u)=>{var m=u(626),v=u(73464),_=u(90904);v("toStringTag"),_(m("Symbol"),"Symbol")},70659:(i,s,u)=>{u(73464)("unscopables")},97522:(i,s,u)=>{var m=u(99813),v=u(65988).f,_=m("metadata"),j=Function.prototype;void 0===j[_]&&v(j,_,{value:null})},28783:(i,s,u)=>{u(73464)("asyncDispose")},43975:(i,s,u)=>{u(73464)("dispose")},97618:(i,s,u)=>{u(76887)({target:"Symbol",stat:!0},{isRegisteredSymbol:u(32087)})},22731:(i,s,u)=>{u(76887)({target:"Symbol",stat:!0,name:"isRegisteredSymbol"},{isRegistered:u(32087)})},6989:(i,s,u)=>{u(76887)({target:"Symbol",stat:!0,forced:!0},{isWellKnownSymbol:u(96559)})},85605:(i,s,u)=>{u(76887)({target:"Symbol",stat:!0,name:"isWellKnownSymbol",forced:!0},{isWellKnown:u(96559)})},65799:(i,s,u)=>{u(73464)("matcher")},31943:(i,s,u)=>{u(73464)("metadataKey")},45414:(i,s,u)=>{u(73464)("metadata")},46774:(i,s,u)=>{u(73464)("observable")},80620:(i,s,u)=>{u(73464)("patternMatch")},36172:(i,s,u)=>{u(73464)("replaceAll")},7634:(i,s,u)=>{u(66274);var m=u(63281),v=u(21899),_=u(9697),j=u(32029),M=u(12077),$=u(99813)("toStringTag");for(var W in m){var X=v[W],Y=X&&X.prototype;Y&&_(Y)!==$&&j(Y,$,W),M[W]=M.Array}},49216:(i,s,u)=>{var m=u(99324);i.exports=m},28196:(i,s,u)=>{var m=u(16246);i.exports=m},11955:(i,s,u)=>{var m=u(2480);i.exports=m},46279:(i,s,u)=>{u(7634);var m=u(9697),v=u(90953),_=u(7046),j=u(49216),M=Array.prototype,$={DOMTokenList:!0,NodeList:!0};i.exports=function(i){var s=i.forEach;return i===M||_(M,i)&&s===M.forEach||v($,m(i))?j:s}},19373:(i,s,u)=>{var m=u(34570);i.exports=m},52759:(i,s,u)=>{var m=u(93993);i.exports=m},63383:(i,s,u)=>{var m=u(45999);i.exports=m},57396:(i,s,u)=>{var m=u(7702);i.exports=m},41910:(i,s,u)=>{var m=u(48171);i.exports=m},79427:(i,s,u)=>{var m=u(286);i.exports=m},62857:(i,s,u)=>{var m=u(92766);i.exports=m},9534:(i,s,u)=>{var m=u(30498);i.exports=m},23059:(i,s,u)=>{var m=u(48494);i.exports=m},92547:(i,s,u)=>{var m=u(57473);u(7634),i.exports=m},46509:(i,s,u)=>{var m=u(24227);u(7634),i.exports=m},35774:(i,s,u)=>{var m=u(62978);i.exports=m},31905:function(){!function(i){!function(s){var u="URLSearchParams"in i,m="Symbol"in i&&"iterator"in Symbol,v="FileReader"in i&&"Blob"in i&&function(){try{return new Blob,!0}catch(i){return!1}}(),_="FormData"in i,j="ArrayBuffer"in i;if(j)var M=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],$=ArrayBuffer.isView||function(i){return i&&M.indexOf(Object.prototype.toString.call(i))>-1};function normalizeName(i){if("string"!=typeof i&&(i=String(i)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(i))throw new TypeError("Invalid character in header field name");return i.toLowerCase()}function normalizeValue(i){return"string"!=typeof i&&(i=String(i)),i}function iteratorFor(i){var s={next:function(){var s=i.shift();return{done:void 0===s,value:s}}};return m&&(s[Symbol.iterator]=function(){return s}),s}function Headers(i){this.map={},i instanceof Headers?i.forEach((function(i,s){this.append(s,i)}),this):Array.isArray(i)?i.forEach((function(i){this.append(i[0],i[1])}),this):i&&Object.getOwnPropertyNames(i).forEach((function(s){this.append(s,i[s])}),this)}function consumed(i){if(i.bodyUsed)return Promise.reject(new TypeError("Already read"));i.bodyUsed=!0}function fileReaderReady(i){return new Promise((function(s,u){i.onload=function(){s(i.result)},i.onerror=function(){u(i.error)}}))}function readBlobAsArrayBuffer(i){var s=new FileReader,u=fileReaderReady(s);return s.readAsArrayBuffer(i),u}function bufferClone(i){if(i.slice)return i.slice(0);var s=new Uint8Array(i.byteLength);return s.set(new Uint8Array(i)),s.buffer}function Body(){return this.bodyUsed=!1,this._initBody=function(i){this._bodyInit=i,i?"string"==typeof i?this._bodyText=i:v&&Blob.prototype.isPrototypeOf(i)?this._bodyBlob=i:_&&FormData.prototype.isPrototypeOf(i)?this._bodyFormData=i:u&&URLSearchParams.prototype.isPrototypeOf(i)?this._bodyText=i.toString():j&&v&&function isDataView(i){return i&&DataView.prototype.isPrototypeOf(i)}(i)?(this._bodyArrayBuffer=bufferClone(i.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):j&&(ArrayBuffer.prototype.isPrototypeOf(i)||$(i))?this._bodyArrayBuffer=bufferClone(i):this._bodyText=i=Object.prototype.toString.call(i):this._bodyText="",this.headers.get("content-type")||("string"==typeof i?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):u&&URLSearchParams.prototype.isPrototypeOf(i)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},v&&(this.blob=function(){var i=consumed(this);if(i)return i;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?consumed(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(readBlobAsArrayBuffer)}),this.text=function(){var i=consumed(this);if(i)return i;if(this._bodyBlob)return function readBlobAsText(i){var s=new FileReader,u=fileReaderReady(s);return s.readAsText(i),u}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function readArrayBufferAsText(i){for(var s=new Uint8Array(i),u=new Array(s.length),m=0;m-1?s:i}(s.method||this.method||"GET"),this.mode=s.mode||this.mode||null,this.signal=s.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&u)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(u)}function decode(i){var s=new FormData;return i.trim().split("&").forEach((function(i){if(i){var u=i.split("="),m=u.shift().replace(/\+/g," "),v=u.join("=").replace(/\+/g," ");s.append(decodeURIComponent(m),decodeURIComponent(v))}})),s}function Response(i,s){s||(s={}),this.type="default",this.status=void 0===s.status?200:s.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in s?s.statusText:"OK",this.headers=new Headers(s.headers),this.url=s.url||"",this._initBody(i)}Request.prototype.clone=function(){return new Request(this,{body:this._bodyInit})},Body.call(Request.prototype),Body.call(Response.prototype),Response.prototype.clone=function(){return new Response(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new Headers(this.headers),url:this.url})},Response.error=function(){var i=new Response(null,{status:0,statusText:""});return i.type="error",i};var X=[301,302,303,307,308];Response.redirect=function(i,s){if(-1===X.indexOf(s))throw new RangeError("Invalid status code");return new Response(null,{status:s,headers:{location:i}})},s.DOMException=i.DOMException;try{new s.DOMException}catch(i){s.DOMException=function(i,s){this.message=i,this.name=s;var u=Error(i);this.stack=u.stack},s.DOMException.prototype=Object.create(Error.prototype),s.DOMException.prototype.constructor=s.DOMException}function fetch(i,u){return new Promise((function(m,_){var j=new Request(i,u);if(j.signal&&j.signal.aborted)return _(new s.DOMException("Aborted","AbortError"));var M=new XMLHttpRequest;function abortXhr(){M.abort()}M.onload=function(){var i,s,u={status:M.status,statusText:M.statusText,headers:(i=M.getAllResponseHeaders()||"",s=new Headers,i.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach((function(i){var u=i.split(":"),m=u.shift().trim();if(m){var v=u.join(":").trim();s.append(m,v)}})),s)};u.url="responseURL"in M?M.responseURL:u.headers.get("X-Request-URL");var v="response"in M?M.response:M.responseText;m(new Response(v,u))},M.onerror=function(){_(new TypeError("Network request failed"))},M.ontimeout=function(){_(new TypeError("Network request failed"))},M.onabort=function(){_(new s.DOMException("Aborted","AbortError"))},M.open(j.method,j.url,!0),"include"===j.credentials?M.withCredentials=!0:"omit"===j.credentials&&(M.withCredentials=!1),"responseType"in M&&v&&(M.responseType="blob"),j.headers.forEach((function(i,s){M.setRequestHeader(s,i)})),j.signal&&(j.signal.addEventListener("abort",abortXhr),M.onreadystatechange=function(){4===M.readyState&&j.signal.removeEventListener("abort",abortXhr)}),M.send(void 0===j._bodyInit?null:j._bodyInit)}))}fetch.polyfill=!0,i.fetch||(i.fetch=fetch,i.Headers=Headers,i.Request=Request,i.Response=Response),s.Headers=Headers,s.Request=Request,s.Response=Response,s.fetch=fetch,Object.defineProperty(s,"__esModule",{value:!0})}({})}("undefined"!=typeof self?self:this)},8269:function(i,s,u){var m;m=void 0!==u.g?u.g:this,i.exports=function(i){if(i.CSS&&i.CSS.escape)return i.CSS.escape;var cssEscape=function(i){if(0==arguments.length)throw new TypeError("`CSS.escape` requires an argument.");for(var s,u=String(i),m=u.length,v=-1,_="",j=u.charCodeAt(0);++v=1&&s<=31||127==s||0==v&&s>=48&&s<=57||1==v&&s>=48&&s<=57&&45==j?"\\"+s.toString(16)+" ":0==v&&1==m&&45==s||!(s>=128||45==s||95==s||s>=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122)?"\\"+u.charAt(v):u.charAt(v):_+="�";return _};return i.CSS||(i.CSS={}),i.CSS.escape=cssEscape,cssEscape}(m)},27698:(i,s,u)=>{"use strict";var m=u(48764).Buffer;function isSpecificValue(i){return i instanceof m||i instanceof Date||i instanceof RegExp}function cloneSpecificValue(i){if(i instanceof m){var s=m.alloc?m.alloc(i.length):new m(i.length);return i.copy(s),s}if(i instanceof Date)return new Date(i.getTime());if(i instanceof RegExp)return new RegExp(i);throw new Error("Unexpected situation")}function deepCloneArray(i){var s=[];return i.forEach((function(i,u){"object"==typeof i&&null!==i?Array.isArray(i)?s[u]=deepCloneArray(i):isSpecificValue(i)?s[u]=cloneSpecificValue(i):s[u]=v({},i):s[u]=i})),s}function safeGetProperty(i,s){return"__proto__"===s?void 0:i[s]}var v=i.exports=function(){if(arguments.length<1||"object"!=typeof arguments[0])return!1;if(arguments.length<2)return arguments[0];var i,s,u=arguments[0];return Array.prototype.slice.call(arguments,1).forEach((function(m){"object"!=typeof m||null===m||Array.isArray(m)||Object.keys(m).forEach((function(_){return s=safeGetProperty(u,_),(i=safeGetProperty(m,_))===u?void 0:"object"!=typeof i||null===i?void(u[_]=i):Array.isArray(i)?void(u[_]=deepCloneArray(i)):isSpecificValue(i)?void(u[_]=cloneSpecificValue(i)):"object"!=typeof s||null===s||Array.isArray(s)?void(u[_]=v({},i)):void(u[_]=v(s,i))}))})),u}},9996:i=>{"use strict";var s=function isMergeableObject(i){return function isNonNullObject(i){return!!i&&"object"==typeof i}(i)&&!function isSpecial(i){var s=Object.prototype.toString.call(i);return"[object RegExp]"===s||"[object Date]"===s||function isReactElement(i){return i.$$typeof===u}(i)}(i)};var u="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function cloneUnlessOtherwiseSpecified(i,s){return!1!==s.clone&&s.isMergeableObject(i)?deepmerge(function emptyTarget(i){return Array.isArray(i)?[]:{}}(i),i,s):i}function defaultArrayMerge(i,s,u){return i.concat(s).map((function(i){return cloneUnlessOtherwiseSpecified(i,u)}))}function getKeys(i){return Object.keys(i).concat(function getEnumerableOwnPropertySymbols(i){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(i).filter((function(s){return Object.propertyIsEnumerable.call(i,s)})):[]}(i))}function propertyIsOnObject(i,s){try{return s in i}catch(i){return!1}}function mergeObject(i,s,u){var m={};return u.isMergeableObject(i)&&getKeys(i).forEach((function(s){m[s]=cloneUnlessOtherwiseSpecified(i[s],u)})),getKeys(s).forEach((function(v){(function propertyIsUnsafe(i,s){return propertyIsOnObject(i,s)&&!(Object.hasOwnProperty.call(i,s)&&Object.propertyIsEnumerable.call(i,s))})(i,v)||(propertyIsOnObject(i,v)&&u.isMergeableObject(s[v])?m[v]=function getMergeFunction(i,s){if(!s.customMerge)return deepmerge;var u=s.customMerge(i);return"function"==typeof u?u:deepmerge}(v,u)(i[v],s[v],u):m[v]=cloneUnlessOtherwiseSpecified(s[v],u))})),m}function deepmerge(i,u,m){(m=m||{}).arrayMerge=m.arrayMerge||defaultArrayMerge,m.isMergeableObject=m.isMergeableObject||s,m.cloneUnlessOtherwiseSpecified=cloneUnlessOtherwiseSpecified;var v=Array.isArray(u);return v===Array.isArray(i)?v?m.arrayMerge(i,u,m):mergeObject(i,u,m):cloneUnlessOtherwiseSpecified(u,m)}deepmerge.all=function deepmergeAll(i,s){if(!Array.isArray(i))throw new Error("first argument should be an array");return i.reduce((function(i,u){return deepmerge(i,u,s)}),{})};var m=deepmerge;i.exports=m},27856:function(i){i.exports=function(){"use strict";const{entries:i,setPrototypeOf:s,isFrozen:u,getPrototypeOf:m,getOwnPropertyDescriptor:v}=Object;let{freeze:_,seal:j,create:M}=Object,{apply:$,construct:W}="undefined"!=typeof Reflect&&Reflect;$||($=function apply(i,s,u){return i.apply(s,u)}),_||(_=function freeze(i){return i}),j||(j=function seal(i){return i}),W||(W=function construct(i,s){return new i(...s)});const X=unapply(Array.prototype.forEach),Y=unapply(Array.prototype.pop),Z=unapply(Array.prototype.push),ee=unapply(String.prototype.toLowerCase),ie=unapply(String.prototype.toString),ae=unapply(String.prototype.match),ce=unapply(String.prototype.replace),le=unapply(String.prototype.indexOf),pe=unapply(String.prototype.trim),de=unapply(RegExp.prototype.test),fe=unconstruct(TypeError);function unapply(i){return function(s){for(var u=arguments.length,m=new Array(u>1?u-1:0),v=1;v/gm),We=j(/\${[\w\W]*}/gm),He=j(/^data-[\-\w.\u00B7-\uFFFF]/),Xe=j(/^aria-[\-\w]+$/),Ye=j(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Qe=j(/^(?:\w+script|data):/i),et=j(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),tt=j(/^html$/i);var rt=Object.freeze({__proto__:null,MUSTACHE_EXPR:ze,ERB_EXPR:Ve,TMPLIT_EXPR:We,DATA_ATTR:He,ARIA_ATTR:Xe,IS_ALLOWED_URI:Ye,IS_SCRIPT_OR_DATA:Qe,ATTR_WHITESPACE:et,DOCTYPE_NAME:tt});const getGlobal=()=>"undefined"==typeof window?null:window,nt=function _createTrustedTypesPolicy(i,s){if("object"!=typeof i||"function"!=typeof i.createPolicy)return null;let u=null;const m="data-tt-policy-suffix";s&&s.hasAttribute(m)&&(u=s.getAttribute(m));const v="dompurify"+(u?"#"+u:"");try{return i.createPolicy(v,{createHTML:i=>i,createScriptURL:i=>i})}catch(i){return console.warn("TrustedTypes policy "+v+" could not be created."),null}};function createDOMPurify(){let s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:getGlobal();const DOMPurify=i=>createDOMPurify(i);if(DOMPurify.version="3.0.5",DOMPurify.removed=[],!s||!s.document||9!==s.document.nodeType)return DOMPurify.isSupported=!1,DOMPurify;const u=s.document,m=u.currentScript;let{document:v}=s;const{DocumentFragment:j,HTMLTemplateElement:M,Node:$,Element:W,NodeFilter:ze,NamedNodeMap:Ve=s.NamedNodeMap||s.MozNamedAttrMap,HTMLFormElement:We,DOMParser:He,trustedTypes:Xe}=s,Qe=W.prototype,et=lookupGetter(Qe,"cloneNode"),ot=lookupGetter(Qe,"nextSibling"),it=lookupGetter(Qe,"childNodes"),at=lookupGetter(Qe,"parentNode");if("function"==typeof M){const i=v.createElement("template");i.content&&i.content.ownerDocument&&(v=i.content.ownerDocument)}let st,ct="";const{implementation:lt,createNodeIterator:ut,createDocumentFragment:pt,getElementsByTagName:ht}=v,{importNode:dt}=u;let mt={};DOMPurify.isSupported="function"==typeof i&&"function"==typeof at&<&&void 0!==lt.createHTMLDocument;const{MUSTACHE_EXPR:yt,ERB_EXPR:gt,TMPLIT_EXPR:vt,DATA_ATTR:bt,ARIA_ATTR:_t,IS_SCRIPT_OR_DATA:wt,ATTR_WHITESPACE:Et}=rt;let{IS_ALLOWED_URI:St}=rt,xt=null;const Ot=addToSet({},[...ye,...be,..._e,...Se,...Pe]);let kt=null;const At=addToSet({},[...Ie,...Te,...Re,...qe]);let Ct=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),jt=null,Pt=null,It=!0,Nt=!0,Tt=!1,Mt=!0,Rt=!1,Dt=!1,Bt=!1,Lt=!1,Ft=!1,qt=!1,$t=!1,Ut=!0,zt=!1;const Vt="user-content-";let Wt=!0,Kt=!1,Ht={},Jt=null;const Gt=addToSet({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Xt=null;const Yt=addToSet({},["audio","video","img","source","image","track"]);let Qt=null;const Zt=addToSet({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),er="http://www.w3.org/1998/Math/MathML",tr="http://www.w3.org/2000/svg",rr="http://www.w3.org/1999/xhtml";let nr=rr,ir=!1,ar=null;const sr=addToSet({},[er,tr,rr],ie);let cr;const lr=["application/xhtml+xml","text/html"],ur="text/html";let pr,dr=null;const fr=v.createElement("form"),mr=function isRegexOrFunction(i){return i instanceof RegExp||i instanceof Function},yr=function _parseConfig(i){if(!dr||dr!==i){if(i&&"object"==typeof i||(i={}),i=clone(i),cr=cr=-1===lr.indexOf(i.PARSER_MEDIA_TYPE)?ur:i.PARSER_MEDIA_TYPE,pr="application/xhtml+xml"===cr?ie:ee,xt="ALLOWED_TAGS"in i?addToSet({},i.ALLOWED_TAGS,pr):Ot,kt="ALLOWED_ATTR"in i?addToSet({},i.ALLOWED_ATTR,pr):At,ar="ALLOWED_NAMESPACES"in i?addToSet({},i.ALLOWED_NAMESPACES,ie):sr,Qt="ADD_URI_SAFE_ATTR"in i?addToSet(clone(Zt),i.ADD_URI_SAFE_ATTR,pr):Zt,Xt="ADD_DATA_URI_TAGS"in i?addToSet(clone(Yt),i.ADD_DATA_URI_TAGS,pr):Yt,Jt="FORBID_CONTENTS"in i?addToSet({},i.FORBID_CONTENTS,pr):Gt,jt="FORBID_TAGS"in i?addToSet({},i.FORBID_TAGS,pr):{},Pt="FORBID_ATTR"in i?addToSet({},i.FORBID_ATTR,pr):{},Ht="USE_PROFILES"in i&&i.USE_PROFILES,It=!1!==i.ALLOW_ARIA_ATTR,Nt=!1!==i.ALLOW_DATA_ATTR,Tt=i.ALLOW_UNKNOWN_PROTOCOLS||!1,Mt=!1!==i.ALLOW_SELF_CLOSE_IN_ATTR,Rt=i.SAFE_FOR_TEMPLATES||!1,Dt=i.WHOLE_DOCUMENT||!1,Ft=i.RETURN_DOM||!1,qt=i.RETURN_DOM_FRAGMENT||!1,$t=i.RETURN_TRUSTED_TYPE||!1,Lt=i.FORCE_BODY||!1,Ut=!1!==i.SANITIZE_DOM,zt=i.SANITIZE_NAMED_PROPS||!1,Wt=!1!==i.KEEP_CONTENT,Kt=i.IN_PLACE||!1,St=i.ALLOWED_URI_REGEXP||Ye,nr=i.NAMESPACE||rr,Ct=i.CUSTOM_ELEMENT_HANDLING||{},i.CUSTOM_ELEMENT_HANDLING&&mr(i.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ct.tagNameCheck=i.CUSTOM_ELEMENT_HANDLING.tagNameCheck),i.CUSTOM_ELEMENT_HANDLING&&mr(i.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ct.attributeNameCheck=i.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),i.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof i.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Ct.allowCustomizedBuiltInElements=i.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Rt&&(Nt=!1),qt&&(Ft=!0),Ht&&(xt=addToSet({},[...Pe]),kt=[],!0===Ht.html&&(addToSet(xt,ye),addToSet(kt,Ie)),!0===Ht.svg&&(addToSet(xt,be),addToSet(kt,Te),addToSet(kt,qe)),!0===Ht.svgFilters&&(addToSet(xt,_e),addToSet(kt,Te),addToSet(kt,qe)),!0===Ht.mathMl&&(addToSet(xt,Se),addToSet(kt,Re),addToSet(kt,qe))),i.ADD_TAGS&&(xt===Ot&&(xt=clone(xt)),addToSet(xt,i.ADD_TAGS,pr)),i.ADD_ATTR&&(kt===At&&(kt=clone(kt)),addToSet(kt,i.ADD_ATTR,pr)),i.ADD_URI_SAFE_ATTR&&addToSet(Qt,i.ADD_URI_SAFE_ATTR,pr),i.FORBID_CONTENTS&&(Jt===Gt&&(Jt=clone(Jt)),addToSet(Jt,i.FORBID_CONTENTS,pr)),Wt&&(xt["#text"]=!0),Dt&&addToSet(xt,["html","head","body"]),xt.table&&(addToSet(xt,["tbody"]),delete jt.tbody),i.TRUSTED_TYPES_POLICY){if("function"!=typeof i.TRUSTED_TYPES_POLICY.createHTML)throw fe('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof i.TRUSTED_TYPES_POLICY.createScriptURL)throw fe('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');st=i.TRUSTED_TYPES_POLICY,ct=st.createHTML("")}else void 0===st&&(st=nt(Xe,m)),null!==st&&"string"==typeof ct&&(ct=st.createHTML(""));_&&_(i),dr=i}},gr=addToSet({},["mi","mo","mn","ms","mtext"]),vr=addToSet({},["foreignobject","desc","title","annotation-xml"]),br=addToSet({},["title","style","font","a","script"]),_r=addToSet({},be);addToSet(_r,_e),addToSet(_r,we);const wr=addToSet({},Se);addToSet(wr,xe);const Er=function _checkValidNamespace(i){let s=at(i);s&&s.tagName||(s={namespaceURI:nr,tagName:"template"});const u=ee(i.tagName),m=ee(s.tagName);return!!ar[i.namespaceURI]&&(i.namespaceURI===tr?s.namespaceURI===rr?"svg"===u:s.namespaceURI===er?"svg"===u&&("annotation-xml"===m||gr[m]):Boolean(_r[u]):i.namespaceURI===er?s.namespaceURI===rr?"math"===u:s.namespaceURI===tr?"math"===u&&vr[m]:Boolean(wr[u]):i.namespaceURI===rr?!(s.namespaceURI===tr&&!vr[m])&&!(s.namespaceURI===er&&!gr[m])&&!wr[u]&&(br[u]||!_r[u]):!("application/xhtml+xml"!==cr||!ar[i.namespaceURI]))},Sr=function _forceRemove(i){Z(DOMPurify.removed,{element:i});try{i.parentNode.removeChild(i)}catch(s){i.remove()}},xr=function _removeAttribute(i,s){try{Z(DOMPurify.removed,{attribute:s.getAttributeNode(i),from:s})}catch(i){Z(DOMPurify.removed,{attribute:null,from:s})}if(s.removeAttribute(i),"is"===i&&!kt[i])if(Ft||qt)try{Sr(s)}catch(i){}else try{s.setAttribute(i,"")}catch(i){}},Or=function _initDocument(i){let s,u;if(Lt)i=""+i;else{const s=ae(i,/^[\r\n\t ]+/);u=s&&s[0]}"application/xhtml+xml"===cr&&nr===rr&&(i=''+i+"");const m=st?st.createHTML(i):i;if(nr===rr)try{s=(new He).parseFromString(m,cr)}catch(i){}if(!s||!s.documentElement){s=lt.createDocument(nr,"template",null);try{s.documentElement.innerHTML=ir?ct:m}catch(i){}}const _=s.body||s.documentElement;return i&&u&&_.insertBefore(v.createTextNode(u),_.childNodes[0]||null),nr===rr?ht.call(s,Dt?"html":"body")[0]:Dt?s.documentElement:_},kr=function _createIterator(i){return ut.call(i.ownerDocument||i,i,ze.SHOW_ELEMENT|ze.SHOW_COMMENT|ze.SHOW_TEXT,null,!1)},Ar=function _isClobbered(i){return i instanceof We&&("string"!=typeof i.nodeName||"string"!=typeof i.textContent||"function"!=typeof i.removeChild||!(i.attributes instanceof Ve)||"function"!=typeof i.removeAttribute||"function"!=typeof i.setAttribute||"string"!=typeof i.namespaceURI||"function"!=typeof i.insertBefore||"function"!=typeof i.hasChildNodes)},Cr=function _isNode(i){return"object"==typeof $?i instanceof $:i&&"object"==typeof i&&"number"==typeof i.nodeType&&"string"==typeof i.nodeName},jr=function _executeHook(i,s,u){mt[i]&&X(mt[i],(i=>{i.call(DOMPurify,s,u,dr)}))},Pr=function _sanitizeElements(i){let s;if(jr("beforeSanitizeElements",i,null),Ar(i))return Sr(i),!0;const u=pr(i.nodeName);if(jr("uponSanitizeElement",i,{tagName:u,allowedTags:xt}),i.hasChildNodes()&&!Cr(i.firstElementChild)&&(!Cr(i.content)||!Cr(i.content.firstElementChild))&&de(/<[/\w]/g,i.innerHTML)&&de(/<[/\w]/g,i.textContent))return Sr(i),!0;if(!xt[u]||jt[u]){if(!jt[u]&&Nr(u)){if(Ct.tagNameCheck instanceof RegExp&&de(Ct.tagNameCheck,u))return!1;if(Ct.tagNameCheck instanceof Function&&Ct.tagNameCheck(u))return!1}if(Wt&&!Jt[u]){const s=at(i)||i.parentNode,u=it(i)||i.childNodes;if(u&&s)for(let m=u.length-1;m>=0;--m)s.insertBefore(et(u[m],!0),ot(i))}return Sr(i),!0}return i instanceof W&&!Er(i)?(Sr(i),!0):"noscript"!==u&&"noembed"!==u&&"noframes"!==u||!de(/<\/no(script|embed|frames)/i,i.innerHTML)?(Rt&&3===i.nodeType&&(s=i.textContent,s=ce(s,yt," "),s=ce(s,gt," "),s=ce(s,vt," "),i.textContent!==s&&(Z(DOMPurify.removed,{element:i.cloneNode()}),i.textContent=s)),jr("afterSanitizeElements",i,null),!1):(Sr(i),!0)},Ir=function _isValidAttribute(i,s,u){if(Ut&&("id"===s||"name"===s)&&(u in v||u in fr))return!1;if(Nt&&!Pt[s]&&de(bt,s));else if(It&&de(_t,s));else if(!kt[s]||Pt[s]){if(!(Nr(i)&&(Ct.tagNameCheck instanceof RegExp&&de(Ct.tagNameCheck,i)||Ct.tagNameCheck instanceof Function&&Ct.tagNameCheck(i))&&(Ct.attributeNameCheck instanceof RegExp&&de(Ct.attributeNameCheck,s)||Ct.attributeNameCheck instanceof Function&&Ct.attributeNameCheck(s))||"is"===s&&Ct.allowCustomizedBuiltInElements&&(Ct.tagNameCheck instanceof RegExp&&de(Ct.tagNameCheck,u)||Ct.tagNameCheck instanceof Function&&Ct.tagNameCheck(u))))return!1}else if(Qt[s]);else if(de(St,ce(u,Et,"")));else if("src"!==s&&"xlink:href"!==s&&"href"!==s||"script"===i||0!==le(u,"data:")||!Xt[i])if(Tt&&!de(wt,ce(u,Et,"")));else if(u)return!1;return!0},Nr=function _basicCustomElementTest(i){return i.indexOf("-")>0},Tr=function _sanitizeAttributes(i){let s,u,m,v;jr("beforeSanitizeAttributes",i,null);const{attributes:_}=i;if(!_)return;const j={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:kt};for(v=_.length;v--;){s=_[v];const{name:M,namespaceURI:$}=s;if(u="value"===M?s.value:pe(s.value),m=pr(M),j.attrName=m,j.attrValue=u,j.keepAttr=!0,j.forceKeepAttr=void 0,jr("uponSanitizeAttribute",i,j),u=j.attrValue,j.forceKeepAttr)continue;if(xr(M,i),!j.keepAttr)continue;if(!Mt&&de(/\/>/i,u)){xr(M,i);continue}Rt&&(u=ce(u,yt," "),u=ce(u,gt," "),u=ce(u,vt," "));const W=pr(i.nodeName);if(Ir(W,m,u)){if(!zt||"id"!==m&&"name"!==m||(xr(M,i),u=Vt+u),st&&"object"==typeof Xe&&"function"==typeof Xe.getAttributeType)if($);else switch(Xe.getAttributeType(W,m)){case"TrustedHTML":u=st.createHTML(u);break;case"TrustedScriptURL":u=st.createScriptURL(u)}try{$?i.setAttributeNS($,M,u):i.setAttribute(M,u),Y(DOMPurify.removed)}catch(i){}}}jr("afterSanitizeAttributes",i,null)},Mr=function _sanitizeShadowDOM(i){let s;const u=kr(i);for(jr("beforeSanitizeShadowDOM",i,null);s=u.nextNode();)jr("uponSanitizeShadowNode",s,null),Pr(s)||(s.content instanceof j&&_sanitizeShadowDOM(s.content),Tr(s));jr("afterSanitizeShadowDOM",i,null)};return DOMPurify.sanitize=function(i){let s,m,v,_,M=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(ir=!i,ir&&(i="\x3c!--\x3e"),"string"!=typeof i&&!Cr(i)){if("function"!=typeof i.toString)throw fe("toString is not a function");if("string"!=typeof(i=i.toString()))throw fe("dirty is not a string, aborting")}if(!DOMPurify.isSupported)return i;if(Bt||yr(M),DOMPurify.removed=[],"string"==typeof i&&(Kt=!1),Kt){if(i.nodeName){const s=pr(i.nodeName);if(!xt[s]||jt[s])throw fe("root node is forbidden and cannot be sanitized in-place")}}else if(i instanceof $)s=Or("\x3c!----\x3e"),m=s.ownerDocument.importNode(i,!0),1===m.nodeType&&"BODY"===m.nodeName||"HTML"===m.nodeName?s=m:s.appendChild(m);else{if(!Ft&&!Rt&&!Dt&&-1===i.indexOf("<"))return st&&$t?st.createHTML(i):i;if(s=Or(i),!s)return Ft?null:$t?ct:""}s&&Lt&&Sr(s.firstChild);const W=kr(Kt?i:s);for(;v=W.nextNode();)Pr(v)||(v.content instanceof j&&Mr(v.content),Tr(v));if(Kt)return i;if(Ft){if(qt)for(_=pt.call(s.ownerDocument);s.firstChild;)_.appendChild(s.firstChild);else _=s;return(kt.shadowroot||kt.shadowrootmode)&&(_=dt.call(u,_,!0)),_}let X=Dt?s.outerHTML:s.innerHTML;return Dt&&xt["!doctype"]&&s.ownerDocument&&s.ownerDocument.doctype&&s.ownerDocument.doctype.name&&de(tt,s.ownerDocument.doctype.name)&&(X="\n"+X),Rt&&(X=ce(X,yt," "),X=ce(X,gt," "),X=ce(X,vt," ")),st&&$t?st.createHTML(X):X},DOMPurify.setConfig=function(i){yr(i),Bt=!0},DOMPurify.clearConfig=function(){dr=null,Bt=!1},DOMPurify.isValidAttribute=function(i,s,u){dr||yr({});const m=pr(i),v=pr(s);return Ir(m,v,u)},DOMPurify.addHook=function(i,s){"function"==typeof s&&(mt[i]=mt[i]||[],Z(mt[i],s))},DOMPurify.removeHook=function(i){if(mt[i])return Y(mt[i])},DOMPurify.removeHooks=function(i){mt[i]&&(mt[i]=[])},DOMPurify.removeAllHooks=function(){mt={}},DOMPurify}return createDOMPurify()}()},69450:i=>{"use strict";class SubRange{constructor(i,s){this.low=i,this.high=s,this.length=1+s-i}overlaps(i){return!(this.highi.high)}touches(i){return!(this.high+1i.high)}add(i){return new SubRange(Math.min(this.low,i.low),Math.max(this.high,i.high))}subtract(i){return i.low<=this.low&&i.high>=this.high?[]:i.low>this.low&&i.highi+s.length),0)}add(i,s){var _add=i=>{for(var s=0;s{for(var s=0;s{for(var s=0;s{for(var u=s.low;u<=s.high;)i.push(u),u++;return i}),[])}subranges(){return this.ranges.map((i=>({low:i.low,high:i.high,length:1+i.high-i.low})))}}i.exports=DRange},17187:i=>{"use strict";var s,u="object"==typeof Reflect?Reflect:null,m=u&&"function"==typeof u.apply?u.apply:function ReflectApply(i,s,u){return Function.prototype.apply.call(i,s,u)};s=u&&"function"==typeof u.ownKeys?u.ownKeys:Object.getOwnPropertySymbols?function ReflectOwnKeys(i){return Object.getOwnPropertyNames(i).concat(Object.getOwnPropertySymbols(i))}:function ReflectOwnKeys(i){return Object.getOwnPropertyNames(i)};var v=Number.isNaN||function NumberIsNaN(i){return i!=i};function EventEmitter(){EventEmitter.init.call(this)}i.exports=EventEmitter,i.exports.once=function once(i,s){return new Promise((function(u,m){function errorListener(u){i.removeListener(s,resolver),m(u)}function resolver(){"function"==typeof i.removeListener&&i.removeListener("error",errorListener),u([].slice.call(arguments))}eventTargetAgnosticAddListener(i,s,resolver,{once:!0}),"error"!==s&&function addErrorHandlerIfEventEmitter(i,s,u){"function"==typeof i.on&&eventTargetAgnosticAddListener(i,"error",s,u)}(i,errorListener,{once:!0})}))},EventEmitter.EventEmitter=EventEmitter,EventEmitter.prototype._events=void 0,EventEmitter.prototype._eventsCount=0,EventEmitter.prototype._maxListeners=void 0;var _=10;function checkListener(i){if("function"!=typeof i)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof i)}function _getMaxListeners(i){return void 0===i._maxListeners?EventEmitter.defaultMaxListeners:i._maxListeners}function _addListener(i,s,u,m){var v,_,j;if(checkListener(u),void 0===(_=i._events)?(_=i._events=Object.create(null),i._eventsCount=0):(void 0!==_.newListener&&(i.emit("newListener",s,u.listener?u.listener:u),_=i._events),j=_[s]),void 0===j)j=_[s]=u,++i._eventsCount;else if("function"==typeof j?j=_[s]=m?[u,j]:[j,u]:m?j.unshift(u):j.push(u),(v=_getMaxListeners(i))>0&&j.length>v&&!j.warned){j.warned=!0;var M=new Error("Possible EventEmitter memory leak detected. "+j.length+" "+String(s)+" listeners added. Use emitter.setMaxListeners() to increase limit");M.name="MaxListenersExceededWarning",M.emitter=i,M.type=s,M.count=j.length,function ProcessEmitWarning(i){console&&console.warn&&console.warn(i)}(M)}return i}function onceWrapper(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function _onceWrap(i,s,u){var m={fired:!1,wrapFn:void 0,target:i,type:s,listener:u},v=onceWrapper.bind(m);return v.listener=u,m.wrapFn=v,v}function _listeners(i,s,u){var m=i._events;if(void 0===m)return[];var v=m[s];return void 0===v?[]:"function"==typeof v?u?[v.listener||v]:[v]:u?function unwrapListeners(i){for(var s=new Array(i.length),u=0;u0&&(j=s[0]),j instanceof Error)throw j;var M=new Error("Unhandled error."+(j?" ("+j.message+")":""));throw M.context=j,M}var $=_[i];if(void 0===$)return!1;if("function"==typeof $)m($,this,s);else{var W=$.length,X=arrayClone($,W);for(u=0;u=0;_--)if(u[_]===s||u[_].listener===s){j=u[_].listener,v=_;break}if(v<0)return this;0===v?u.shift():function spliceOne(i,s){for(;s+1=0;m--)this.removeListener(i,s[m]);return this},EventEmitter.prototype.listeners=function listeners(i){return _listeners(this,i,!0)},EventEmitter.prototype.rawListeners=function rawListeners(i){return _listeners(this,i,!1)},EventEmitter.listenerCount=function(i,s){return"function"==typeof i.listenerCount?i.listenerCount(s):listenerCount.call(i,s)},EventEmitter.prototype.listenerCount=listenerCount,EventEmitter.prototype.eventNames=function eventNames(){return this._eventsCount>0?s(this._events):[]}},21102:(i,s,u)=>{"use strict";var m=u(46291),v=create(Error);function create(i){return FormattedError.displayName=i.displayName||i.name,FormattedError;function FormattedError(s){return s&&(s=m.apply(null,arguments)),new i(s)}}i.exports=v,v.eval=create(EvalError),v.range=create(RangeError),v.reference=create(ReferenceError),v.syntax=create(SyntaxError),v.type=create(TypeError),v.uri=create(URIError),v.create=create},46291:i=>{!function(){var s;function format(i){for(var s,u,m,v,_=1,j=[].slice.call(arguments),M=0,$=i.length,W="",X=!1,Y=!1,nextArg=function(){return j[_++]},slurpNumber=function(){for(var u="";/\d/.test(i[M]);)u+=i[M++],s=i[M];return u.length>0?parseInt(u):null};M<$;++M)if(s=i[M],X)switch(X=!1,"."==s?(Y=!1,s=i[++M]):"0"==s&&"."==i[M+1]?(Y=!0,s=i[M+=2]):Y=!0,v=slurpNumber(),s){case"b":W+=parseInt(nextArg(),10).toString(2);break;case"c":W+="string"==typeof(u=nextArg())||u instanceof String?u:String.fromCharCode(parseInt(u,10));break;case"d":W+=parseInt(nextArg(),10);break;case"f":m=String(parseFloat(nextArg()).toFixed(v||6)),W+=Y?m:m.replace(/^0/,"");break;case"j":W+=JSON.stringify(nextArg());break;case"o":W+="0"+parseInt(nextArg(),10).toString(8);break;case"s":W+=nextArg();break;case"x":W+="0x"+parseInt(nextArg(),10).toString(16);break;case"X":W+="0x"+parseInt(nextArg(),10).toString(16).toUpperCase();break;default:W+=s}else"%"===s?X=!0:W+=s;return W}(s=i.exports=format).format=format,s.vsprintf=function vsprintf(i,s){return format.apply(null,[i].concat(s))},"undefined"!=typeof console&&"function"==typeof console.log&&(s.printf=function printf(){console.log(format.apply(null,arguments))})}()},17648:i=>{"use strict";var s=Array.prototype.slice,u=Object.prototype.toString;i.exports=function bind(i){var m=this;if("function"!=typeof m||"[object Function]"!==u.call(m))throw new TypeError("Function.prototype.bind called on incompatible "+m);for(var v,_=s.call(arguments,1),j=Math.max(0,m.length-_.length),M=[],$=0;${"use strict";var m=u(17648);i.exports=Function.prototype.bind||m},40210:(i,s,u)=>{"use strict";var m,v=SyntaxError,_=Function,j=TypeError,getEvalledConstructor=function(i){try{return _('"use strict"; return ('+i+").constructor;")()}catch(i){}},M=Object.getOwnPropertyDescriptor;if(M)try{M({},"")}catch(i){M=null}var throwTypeError=function(){throw new j},$=M?function(){try{return throwTypeError}catch(i){try{return M(arguments,"callee").get}catch(i){return throwTypeError}}}():throwTypeError,W=u(41405)(),X=u(28185)(),Y=Object.getPrototypeOf||(X?function(i){return i.__proto__}:null),Z={},ee="undefined"!=typeof Uint8Array&&Y?Y(Uint8Array):m,ie={"%AggregateError%":"undefined"==typeof AggregateError?m:AggregateError,"%Array%":Array,"%ArrayBuffer%":"undefined"==typeof ArrayBuffer?m:ArrayBuffer,"%ArrayIteratorPrototype%":W&&Y?Y([][Symbol.iterator]()):m,"%AsyncFromSyncIteratorPrototype%":m,"%AsyncFunction%":Z,"%AsyncGenerator%":Z,"%AsyncGeneratorFunction%":Z,"%AsyncIteratorPrototype%":Z,"%Atomics%":"undefined"==typeof Atomics?m:Atomics,"%BigInt%":"undefined"==typeof BigInt?m:BigInt,"%BigInt64Array%":"undefined"==typeof BigInt64Array?m:BigInt64Array,"%BigUint64Array%":"undefined"==typeof BigUint64Array?m:BigUint64Array,"%Boolean%":Boolean,"%DataView%":"undefined"==typeof DataView?m:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":"undefined"==typeof Float32Array?m:Float32Array,"%Float64Array%":"undefined"==typeof Float64Array?m:Float64Array,"%FinalizationRegistry%":"undefined"==typeof FinalizationRegistry?m:FinalizationRegistry,"%Function%":_,"%GeneratorFunction%":Z,"%Int8Array%":"undefined"==typeof Int8Array?m:Int8Array,"%Int16Array%":"undefined"==typeof Int16Array?m:Int16Array,"%Int32Array%":"undefined"==typeof Int32Array?m:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":W&&Y?Y(Y([][Symbol.iterator]())):m,"%JSON%":"object"==typeof JSON?JSON:m,"%Map%":"undefined"==typeof Map?m:Map,"%MapIteratorPrototype%":"undefined"!=typeof Map&&W&&Y?Y((new Map)[Symbol.iterator]()):m,"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":"undefined"==typeof Promise?m:Promise,"%Proxy%":"undefined"==typeof Proxy?m:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":"undefined"==typeof Reflect?m:Reflect,"%RegExp%":RegExp,"%Set%":"undefined"==typeof Set?m:Set,"%SetIteratorPrototype%":"undefined"!=typeof Set&&W&&Y?Y((new Set)[Symbol.iterator]()):m,"%SharedArrayBuffer%":"undefined"==typeof SharedArrayBuffer?m:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":W&&Y?Y(""[Symbol.iterator]()):m,"%Symbol%":W?Symbol:m,"%SyntaxError%":v,"%ThrowTypeError%":$,"%TypedArray%":ee,"%TypeError%":j,"%Uint8Array%":"undefined"==typeof Uint8Array?m:Uint8Array,"%Uint8ClampedArray%":"undefined"==typeof Uint8ClampedArray?m:Uint8ClampedArray,"%Uint16Array%":"undefined"==typeof Uint16Array?m:Uint16Array,"%Uint32Array%":"undefined"==typeof Uint32Array?m:Uint32Array,"%URIError%":URIError,"%WeakMap%":"undefined"==typeof WeakMap?m:WeakMap,"%WeakRef%":"undefined"==typeof WeakRef?m:WeakRef,"%WeakSet%":"undefined"==typeof WeakSet?m:WeakSet};if(Y)try{null.error}catch(i){var ae=Y(Y(i));ie["%Error.prototype%"]=ae}var ce=function doEval(i){var s;if("%AsyncFunction%"===i)s=getEvalledConstructor("async function () {}");else if("%GeneratorFunction%"===i)s=getEvalledConstructor("function* () {}");else if("%AsyncGeneratorFunction%"===i)s=getEvalledConstructor("async function* () {}");else if("%AsyncGenerator%"===i){var u=doEval("%AsyncGeneratorFunction%");u&&(s=u.prototype)}else if("%AsyncIteratorPrototype%"===i){var m=doEval("%AsyncGenerator%");m&&Y&&(s=Y(m.prototype))}return ie[i]=s,s},le={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},pe=u(58612),de=u(17642),fe=pe.call(Function.call,Array.prototype.concat),ye=pe.call(Function.apply,Array.prototype.splice),be=pe.call(Function.call,String.prototype.replace),_e=pe.call(Function.call,String.prototype.slice),we=pe.call(Function.call,RegExp.prototype.exec),Se=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,xe=/\\(\\)?/g,Pe=function getBaseIntrinsic(i,s){var u,m=i;if(de(le,m)&&(m="%"+(u=le[m])[0]+"%"),de(ie,m)){var _=ie[m];if(_===Z&&(_=ce(m)),void 0===_&&!s)throw new j("intrinsic "+i+" exists, but is not available. Please file an issue!");return{alias:u,name:m,value:_}}throw new v("intrinsic "+i+" does not exist!")};i.exports=function GetIntrinsic(i,s){if("string"!=typeof i||0===i.length)throw new j("intrinsic name must be a non-empty string");if(arguments.length>1&&"boolean"!=typeof s)throw new j('"allowMissing" argument must be a boolean');if(null===we(/^%?[^%]*%?$/,i))throw new v("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var u=function stringToPath(i){var s=_e(i,0,1),u=_e(i,-1);if("%"===s&&"%"!==u)throw new v("invalid intrinsic syntax, expected closing `%`");if("%"===u&&"%"!==s)throw new v("invalid intrinsic syntax, expected opening `%`");var m=[];return be(i,Se,(function(i,s,u,v){m[m.length]=u?be(v,xe,"$1"):s||i})),m}(i),m=u.length>0?u[0]:"",_=Pe("%"+m+"%",s),$=_.name,W=_.value,X=!1,Y=_.alias;Y&&(m=Y[0],ye(u,fe([0,1],Y)));for(var Z=1,ee=!0;Z=u.length){var pe=M(W,ae);W=(ee=!!pe)&&"get"in pe&&!("originalValue"in pe.get)?pe.get:W[ae]}else ee=de(W,ae),W=W[ae];ee&&!X&&(ie[$]=W)}}return W}},28185:i=>{"use strict";var s={foo:{}},u=Object;i.exports=function hasProto(){return{__proto__:s}.foo===s.foo&&!({__proto__:null}instanceof u)}},41405:(i,s,u)=>{"use strict";var m="undefined"!=typeof Symbol&&Symbol,v=u(55419);i.exports=function hasNativeSymbols(){return"function"==typeof m&&("function"==typeof Symbol&&("symbol"==typeof m("foo")&&("symbol"==typeof Symbol("bar")&&v())))}},55419:i=>{"use strict";i.exports=function hasSymbols(){if("function"!=typeof Symbol||"function"!=typeof Object.getOwnPropertySymbols)return!1;if("symbol"==typeof Symbol.iterator)return!0;var i={},s=Symbol("test"),u=Object(s);if("string"==typeof s)return!1;if("[object Symbol]"!==Object.prototype.toString.call(s))return!1;if("[object Symbol]"!==Object.prototype.toString.call(u))return!1;for(s in i[s]=42,i)return!1;if("function"==typeof Object.keys&&0!==Object.keys(i).length)return!1;if("function"==typeof Object.getOwnPropertyNames&&0!==Object.getOwnPropertyNames(i).length)return!1;var m=Object.getOwnPropertySymbols(i);if(1!==m.length||m[0]!==s)return!1;if(!Object.prototype.propertyIsEnumerable.call(i,s))return!1;if("function"==typeof Object.getOwnPropertyDescriptor){var v=Object.getOwnPropertyDescriptor(i,s);if(42!==v.value||!0!==v.enumerable)return!1}return!0}},17642:(i,s,u)=>{"use strict";var m=u(58612);i.exports=m.call(Function.call,Object.prototype.hasOwnProperty)},47802:i=>{function deepFreeze(i){return i instanceof Map?i.clear=i.delete=i.set=function(){throw new Error("map is read-only")}:i instanceof Set&&(i.add=i.clear=i.delete=function(){throw new Error("set is read-only")}),Object.freeze(i),Object.getOwnPropertyNames(i).forEach((function(s){var u=i[s];"object"!=typeof u||Object.isFrozen(u)||deepFreeze(u)})),i}var s=deepFreeze,u=deepFreeze;s.default=u;class Response{constructor(i){void 0===i.data&&(i.data={}),this.data=i.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function escapeHTML(i){return i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function inherit(i,...s){const u=Object.create(null);for(const s in i)u[s]=i[s];return s.forEach((function(i){for(const s in i)u[s]=i[s]})),u}const emitsWrappingTags=i=>!!i.kind;class HTMLRenderer{constructor(i,s){this.buffer="",this.classPrefix=s.classPrefix,i.walk(this)}addText(i){this.buffer+=escapeHTML(i)}openNode(i){if(!emitsWrappingTags(i))return;let s=i.kind;i.sublanguage||(s=`${this.classPrefix}${s}`),this.span(s)}closeNode(i){emitsWrappingTags(i)&&(this.buffer+="")}value(){return this.buffer}span(i){this.buffer+=``}}class TokenTree{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(i){this.top.children.push(i)}openNode(i){const s={kind:i,children:[]};this.add(s),this.stack.push(s)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(i){return this.constructor._walk(i,this.rootNode)}static _walk(i,s){return"string"==typeof s?i.addText(s):s.children&&(i.openNode(s),s.children.forEach((s=>this._walk(i,s))),i.closeNode(s)),i}static _collapse(i){"string"!=typeof i&&i.children&&(i.children.every((i=>"string"==typeof i))?i.children=[i.children.join("")]:i.children.forEach((i=>{TokenTree._collapse(i)})))}}class TokenTreeEmitter extends TokenTree{constructor(i){super(),this.options=i}addKeyword(i,s){""!==i&&(this.openNode(s),this.addText(i),this.closeNode())}addText(i){""!==i&&this.add(i)}addSublanguage(i,s){const u=i.root;u.kind=s,u.sublanguage=!0,this.add(u)}toHTML(){return new HTMLRenderer(this,this.options).value()}finalize(){return!0}}function source(i){return i?"string"==typeof i?i:i.source:null}const m=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;const v="[a-zA-Z]\\w*",_="[a-zA-Z_]\\w*",j="\\b\\d+(\\.\\d+)?",M="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",$="\\b(0b[01]+)",W={begin:"\\\\[\\s\\S]",relevance:0},X={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[W]},Y={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[W]},Z={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},COMMENT=function(i,s,u={}){const m=inherit({className:"comment",begin:i,end:s,contains:[]},u);return m.contains.push(Z),m.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),m},ee=COMMENT("//","$"),ie=COMMENT("/\\*","\\*/"),ae=COMMENT("#","$"),ce={className:"number",begin:j,relevance:0},le={className:"number",begin:M,relevance:0},pe={className:"number",begin:$,relevance:0},de={className:"number",begin:j+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},fe={begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[W,{begin:/\[/,end:/\]/,relevance:0,contains:[W]}]}]},ye={className:"title",begin:v,relevance:0},be={className:"title",begin:_,relevance:0},_e={begin:"\\.\\s*"+_,relevance:0};var we=Object.freeze({__proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:v,UNDERSCORE_IDENT_RE:_,NUMBER_RE:j,C_NUMBER_RE:M,BINARY_NUMBER_RE:$,RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(i={})=>{const s=/^#![ ]*\//;return i.binary&&(i.begin=function concat(...i){return i.map((i=>source(i))).join("")}(s,/.*\b/,i.binary,/\b.*/)),inherit({className:"meta",begin:s,end:/$/,relevance:0,"on:begin":(i,s)=>{0!==i.index&&s.ignoreMatch()}},i)},BACKSLASH_ESCAPE:W,APOS_STRING_MODE:X,QUOTE_STRING_MODE:Y,PHRASAL_WORDS_MODE:Z,COMMENT,C_LINE_COMMENT_MODE:ee,C_BLOCK_COMMENT_MODE:ie,HASH_COMMENT_MODE:ae,NUMBER_MODE:ce,C_NUMBER_MODE:le,BINARY_NUMBER_MODE:pe,CSS_NUMBER_MODE:de,REGEXP_MODE:fe,TITLE_MODE:ye,UNDERSCORE_TITLE_MODE:be,METHOD_GUARD:_e,END_SAME_AS_BEGIN:function(i){return Object.assign(i,{"on:begin":(i,s)=>{s.data._beginMatch=i[1]},"on:end":(i,s)=>{s.data._beginMatch!==i[1]&&s.ignoreMatch()}})}});function skipIfhasPrecedingDot(i,s){"."===i.input[i.index-1]&&s.ignoreMatch()}function beginKeywords(i,s){s&&i.beginKeywords&&(i.begin="\\b("+i.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",i.__beforeBegin=skipIfhasPrecedingDot,i.keywords=i.keywords||i.beginKeywords,delete i.beginKeywords,void 0===i.relevance&&(i.relevance=0))}function compileIllegal(i,s){Array.isArray(i.illegal)&&(i.illegal=function either(...i){return"("+i.map((i=>source(i))).join("|")+")"}(...i.illegal))}function compileMatch(i,s){if(i.match){if(i.begin||i.end)throw new Error("begin & end are not supported with match");i.begin=i.match,delete i.match}}function compileRelevance(i,s){void 0===i.relevance&&(i.relevance=1)}const Se=["of","and","for","in","not","or","if","then","parent","list","value"],xe="keyword";function compileKeywords(i,s,u=xe){const m={};return"string"==typeof i?compileList(u,i.split(" ")):Array.isArray(i)?compileList(u,i):Object.keys(i).forEach((function(u){Object.assign(m,compileKeywords(i[u],s,u))})),m;function compileList(i,u){s&&(u=u.map((i=>i.toLowerCase()))),u.forEach((function(s){const u=s.split("|");m[u[0]]=[i,scoreForKeyword(u[0],u[1])]}))}}function scoreForKeyword(i,s){return s?Number(s):function commonKeyword(i){return Se.includes(i.toLowerCase())}(i)?0:1}function compileLanguage(i,{plugins:s}){function langRe(s,u){return new RegExp(source(s),"m"+(i.case_insensitive?"i":"")+(u?"g":""))}class MultiRegex{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(i,s){s.position=this.position++,this.matchIndexes[this.matchAt]=s,this.regexes.push([s,i]),this.matchAt+=function countMatchGroups(i){return new RegExp(i.toString()+"|").exec("").length-1}(i)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const i=this.regexes.map((i=>i[1]));this.matcherRe=langRe(function join(i,s="|"){let u=0;return i.map((i=>{u+=1;const s=u;let v=source(i),_="";for(;v.length>0;){const i=m.exec(v);if(!i){_+=v;break}_+=v.substring(0,i.index),v=v.substring(i.index+i[0].length),"\\"===i[0][0]&&i[1]?_+="\\"+String(Number(i[1])+s):(_+=i[0],"("===i[0]&&u++)}return _})).map((i=>`(${i})`)).join(s)}(i),!0),this.lastIndex=0}exec(i){this.matcherRe.lastIndex=this.lastIndex;const s=this.matcherRe.exec(i);if(!s)return null;const u=s.findIndex(((i,s)=>s>0&&void 0!==i)),m=this.matchIndexes[u];return s.splice(0,u),Object.assign(s,m)}}class ResumableMultiRegex{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(i){if(this.multiRegexes[i])return this.multiRegexes[i];const s=new MultiRegex;return this.rules.slice(i).forEach((([i,u])=>s.addRule(i,u))),s.compile(),this.multiRegexes[i]=s,s}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(i,s){this.rules.push([i,s]),"begin"===s.type&&this.count++}exec(i){const s=this.getMatcher(this.regexIndex);s.lastIndex=this.lastIndex;let u=s.exec(i);if(this.resumingScanAtSamePosition())if(u&&u.index===this.lastIndex);else{const s=this.getMatcher(0);s.lastIndex=this.lastIndex+1,u=s.exec(i)}return u&&(this.regexIndex+=u.position+1,this.regexIndex===this.count&&this.considerAll()),u}}if(i.compilerExtensions||(i.compilerExtensions=[]),i.contains&&i.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return i.classNameAliases=inherit(i.classNameAliases||{}),function compileMode(s,u){const m=s;if(s.isCompiled)return m;[compileMatch].forEach((i=>i(s,u))),i.compilerExtensions.forEach((i=>i(s,u))),s.__beforeBegin=null,[beginKeywords,compileIllegal,compileRelevance].forEach((i=>i(s,u))),s.isCompiled=!0;let v=null;if("object"==typeof s.keywords&&(v=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=compileKeywords(s.keywords,i.case_insensitive)),s.lexemes&&v)throw new Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return v=v||s.lexemes||/\w+/,m.keywordPatternRe=langRe(v,!0),u&&(s.begin||(s.begin=/\B|\b/),m.beginRe=langRe(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(m.endRe=langRe(s.end)),m.terminatorEnd=source(s.end)||"",s.endsWithParent&&u.terminatorEnd&&(m.terminatorEnd+=(s.end?"|":"")+u.terminatorEnd)),s.illegal&&(m.illegalRe=langRe(s.illegal)),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(i){return function expandOrCloneMode(i){i.variants&&!i.cachedVariants&&(i.cachedVariants=i.variants.map((function(s){return inherit(i,{variants:null},s)})));if(i.cachedVariants)return i.cachedVariants;if(dependencyOnParent(i))return inherit(i,{starts:i.starts?inherit(i.starts):null});if(Object.isFrozen(i))return inherit(i);return i}("self"===i?s:i)}))),s.contains.forEach((function(i){compileMode(i,m)})),s.starts&&compileMode(s.starts,u),m.matcher=function buildModeRegex(i){const s=new ResumableMultiRegex;return i.contains.forEach((i=>s.addRule(i.begin,{rule:i,type:"begin"}))),i.terminatorEnd&&s.addRule(i.terminatorEnd,{type:"end"}),i.illegal&&s.addRule(i.illegal,{type:"illegal"}),s}(m),m}(i)}function dependencyOnParent(i){return!!i&&(i.endsWithParent||dependencyOnParent(i.starts))}function BuildVuePlugin(i){const s={props:["language","code","autodetect"],data:function(){return{detectedLanguage:"",unknownLanguage:!1}},computed:{className(){return this.unknownLanguage?"":"hljs "+this.detectedLanguage},highlighted(){if(!this.autoDetect&&!i.getLanguage(this.language))return console.warn(`The language "${this.language}" you specified could not be found.`),this.unknownLanguage=!0,escapeHTML(this.code);let s={};return this.autoDetect?(s=i.highlightAuto(this.code),this.detectedLanguage=s.language):(s=i.highlight(this.language,this.code,this.ignoreIllegals),this.detectedLanguage=this.language),s.value},autoDetect(){return!this.language||function hasValueOrEmptyAttribute(i){return Boolean(i||""===i)}(this.autodetect)},ignoreIllegals:()=>!0},render(i){return i("pre",{},[i("code",{class:this.className,domProps:{innerHTML:this.highlighted}})])}};return{Component:s,VuePlugin:{install(i){i.component("highlightjs",s)}}}}const Pe={"after:highlightElement":({el:i,result:s,text:u})=>{const m=nodeStream(i);if(!m.length)return;const v=document.createElement("div");v.innerHTML=s.value,s.value=function mergeStreams(i,s,u){let m=0,v="";const _=[];function selectStream(){return i.length&&s.length?i[0].offset!==s[0].offset?i[0].offset"}function close(i){v+=""}function render(i){("start"===i.event?open:close)(i.node)}for(;i.length||s.length;){let s=selectStream();if(v+=escapeHTML(u.substring(m,s[0].offset)),m=s[0].offset,s===i){_.reverse().forEach(close);do{render(s.splice(0,1)[0]),s=selectStream()}while(s===i&&s.length&&s[0].offset===m);_.reverse().forEach(open)}else"start"===s[0].event?_.push(s[0].node):_.pop(),render(s.splice(0,1)[0])}return v+escapeHTML(u.substr(m))}(m,nodeStream(v),u)}};function tag(i){return i.nodeName.toLowerCase()}function nodeStream(i){const s=[];return function _nodeStream(i,u){for(let m=i.firstChild;m;m=m.nextSibling)3===m.nodeType?u+=m.nodeValue.length:1===m.nodeType&&(s.push({event:"start",offset:u,node:m}),u=_nodeStream(m,u),tag(m).match(/br|hr|img|input/)||s.push({event:"stop",offset:u,node:m}));return u}(i,0),s}const Ie={},error=i=>{console.error(i)},warn=(i,...s)=>{console.log(`WARN: ${i}`,...s)},deprecated=(i,s)=>{Ie[`${i}/${s}`]||(console.log(`Deprecated as of ${i}. ${s}`),Ie[`${i}/${s}`]=!0)},Te=escapeHTML,Re=inherit,qe=Symbol("nomatch");var ze=function(i){const u=Object.create(null),m=Object.create(null),v=[];let _=!0;const j=/(^(<[^>]+>|\t|)+|\n)/gm,M="Could not find the language '{}', did you forget to load/include a language module?",$={disableAutodetect:!0,name:"Plain text",contains:[]};let W={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:TokenTreeEmitter};function shouldNotHighlight(i){return W.noHighlightRe.test(i)}function highlight(i,s,u,m){let v="",_="";"object"==typeof s?(v=i,u=s.ignoreIllegals,_=s.language,m=void 0):(deprecated("10.7.0","highlight(lang, code, ...args) has been deprecated."),deprecated("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),_=i,v=s);const j={code:v,language:_};fire("before:highlight",j);const M=j.result?j.result:_highlight(j.language,j.code,u,m);return M.code=j.code,fire("after:highlight",M),M}function _highlight(i,s,m,j){function keywordData(i,s){const u=X.case_insensitive?s[0].toLowerCase():s[0];return Object.prototype.hasOwnProperty.call(i.keywords,u)&&i.keywords[u]}function processBuffer(){null!=ee.subLanguage?function processSubLanguage(){if(""===ce)return;let i=null;if("string"==typeof ee.subLanguage){if(!u[ee.subLanguage])return void ae.addText(ce);i=_highlight(ee.subLanguage,ce,!0,ie[ee.subLanguage]),ie[ee.subLanguage]=i.top}else i=highlightAuto(ce,ee.subLanguage.length?ee.subLanguage:null);ee.relevance>0&&(le+=i.relevance),ae.addSublanguage(i.emitter,i.language)}():function processKeywords(){if(!ee.keywords)return void ae.addText(ce);let i=0;ee.keywordPatternRe.lastIndex=0;let s=ee.keywordPatternRe.exec(ce),u="";for(;s;){u+=ce.substring(i,s.index);const m=keywordData(ee,s);if(m){const[i,v]=m;if(ae.addText(u),u="",le+=v,i.startsWith("_"))u+=s[0];else{const u=X.classNameAliases[i]||i;ae.addKeyword(s[0],u)}}else u+=s[0];i=ee.keywordPatternRe.lastIndex,s=ee.keywordPatternRe.exec(ce)}u+=ce.substr(i),ae.addText(u)}(),ce=""}function startNewMode(i){return i.className&&ae.openNode(X.classNameAliases[i.className]||i.className),ee=Object.create(i,{parent:{value:ee}}),ee}function endOfMode(i,s,u){let m=function startsWith(i,s){const u=i&&i.exec(s);return u&&0===u.index}(i.endRe,u);if(m){if(i["on:end"]){const u=new Response(i);i["on:end"](s,u),u.isMatchIgnored&&(m=!1)}if(m){for(;i.endsParent&&i.parent;)i=i.parent;return i}}if(i.endsWithParent)return endOfMode(i.parent,s,u)}function doIgnore(i){return 0===ee.matcher.regexIndex?(ce+=i[0],1):(fe=!0,0)}function doBeginMatch(i){const s=i[0],u=i.rule,m=new Response(u),v=[u.__beforeBegin,u["on:begin"]];for(const u of v)if(u&&(u(i,m),m.isMatchIgnored))return doIgnore(s);return u&&u.endSameAsBegin&&(u.endRe=function escape(i){return new RegExp(i.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}(s)),u.skip?ce+=s:(u.excludeBegin&&(ce+=s),processBuffer(),u.returnBegin||u.excludeBegin||(ce=s)),startNewMode(u),u.returnBegin?0:s.length}function doEndMatch(i){const u=i[0],m=s.substr(i.index),v=endOfMode(ee,i,m);if(!v)return qe;const _=ee;_.skip?ce+=u:(_.returnEnd||_.excludeEnd||(ce+=u),processBuffer(),_.excludeEnd&&(ce=u));do{ee.className&&ae.closeNode(),ee.skip||ee.subLanguage||(le+=ee.relevance),ee=ee.parent}while(ee!==v.parent);return v.starts&&(v.endSameAsBegin&&(v.starts.endRe=v.endRe),startNewMode(v.starts)),_.returnEnd?0:u.length}let $={};function processLexeme(u,v){const j=v&&v[0];if(ce+=u,null==j)return processBuffer(),0;if("begin"===$.type&&"end"===v.type&&$.index===v.index&&""===j){if(ce+=s.slice(v.index,v.index+1),!_){const s=new Error("0 width match regex");throw s.languageName=i,s.badRule=$.rule,s}return 1}if($=v,"begin"===v.type)return doBeginMatch(v);if("illegal"===v.type&&!m){const i=new Error('Illegal lexeme "'+j+'" for mode "'+(ee.className||"")+'"');throw i.mode=ee,i}if("end"===v.type){const i=doEndMatch(v);if(i!==qe)return i}if("illegal"===v.type&&""===j)return 1;if(de>1e5&&de>3*v.index){throw new Error("potential infinite loop, way more iterations than matches")}return ce+=j,j.length}const X=getLanguage(i);if(!X)throw error(M.replace("{}",i)),new Error('Unknown language: "'+i+'"');const Y=compileLanguage(X,{plugins:v});let Z="",ee=j||Y;const ie={},ae=new W.__emitter(W);!function processContinuations(){const i=[];for(let s=ee;s!==X;s=s.parent)s.className&&i.unshift(s.className);i.forEach((i=>ae.openNode(i)))}();let ce="",le=0,pe=0,de=0,fe=!1;try{for(ee.matcher.considerAll();;){de++,fe?fe=!1:ee.matcher.considerAll(),ee.matcher.lastIndex=pe;const i=ee.matcher.exec(s);if(!i)break;const u=processLexeme(s.substring(pe,i.index),i);pe=i.index+u}return processLexeme(s.substr(pe)),ae.closeAllNodes(),ae.finalize(),Z=ae.toHTML(),{relevance:Math.floor(le),value:Z,language:i,illegal:!1,emitter:ae,top:ee}}catch(u){if(u.message&&u.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:u.message,context:s.slice(pe-100,pe+100),mode:u.mode},sofar:Z,relevance:0,value:Te(s),emitter:ae};if(_)return{illegal:!1,relevance:0,value:Te(s),emitter:ae,language:i,top:ee,errorRaised:u};throw u}}function highlightAuto(i,s){s=s||W.languages||Object.keys(u);const m=function justTextHighlightResult(i){const s={relevance:0,emitter:new W.__emitter(W),value:Te(i),illegal:!1,top:$};return s.emitter.addText(i),s}(i),v=s.filter(getLanguage).filter(autoDetection).map((s=>_highlight(s,i,!1)));v.unshift(m);const _=v.sort(((i,s)=>{if(i.relevance!==s.relevance)return s.relevance-i.relevance;if(i.language&&s.language){if(getLanguage(i.language).supersetOf===s.language)return 1;if(getLanguage(s.language).supersetOf===i.language)return-1}return 0})),[j,M]=_,X=j;return X.second_best=M,X}const X={"before:highlightElement":({el:i})=>{W.useBR&&(i.innerHTML=i.innerHTML.replace(/\n/g,"").replace(//g,"\n"))},"after:highlightElement":({result:i})=>{W.useBR&&(i.value=i.value.replace(/\n/g,"
"))}},Y=/^(<[^>]+>|\t)+/gm,Z={"after:highlightElement":({result:i})=>{W.tabReplace&&(i.value=i.value.replace(Y,(i=>i.replace(/\t/g,W.tabReplace))))}};function highlightElement(i){let s=null;const u=function blockLanguage(i){let s=i.className+" ";s+=i.parentNode?i.parentNode.className:"";const u=W.languageDetectRe.exec(s);if(u){const s=getLanguage(u[1]);return s||(warn(M.replace("{}",u[1])),warn("Falling back to no-highlight mode for this block.",i)),s?u[1]:"no-highlight"}return s.split(/\s+/).find((i=>shouldNotHighlight(i)||getLanguage(i)))}(i);if(shouldNotHighlight(u))return;fire("before:highlightElement",{el:i,language:u}),s=i;const v=s.textContent,_=u?highlight(v,{language:u,ignoreIllegals:!0}):highlightAuto(v);fire("after:highlightElement",{el:i,result:_,text:v}),i.innerHTML=_.value,function updateClassName(i,s,u){const v=s?m[s]:u;i.classList.add("hljs"),v&&i.classList.add(v)}(i,u,_.language),i.result={language:_.language,re:_.relevance,relavance:_.relevance},_.second_best&&(i.second_best={language:_.second_best.language,re:_.second_best.relevance,relavance:_.second_best.relevance})}const initHighlighting=()=>{if(initHighlighting.called)return;initHighlighting.called=!0,deprecated("10.6.0","initHighlighting() is deprecated. Use highlightAll() instead.");document.querySelectorAll("pre code").forEach(highlightElement)};let ee=!1;function highlightAll(){if("loading"===document.readyState)return void(ee=!0);document.querySelectorAll("pre code").forEach(highlightElement)}function getLanguage(i){return i=(i||"").toLowerCase(),u[i]||u[m[i]]}function registerAliases(i,{languageName:s}){"string"==typeof i&&(i=[i]),i.forEach((i=>{m[i.toLowerCase()]=s}))}function autoDetection(i){const s=getLanguage(i);return s&&!s.disableAutodetect}function fire(i,s){const u=i;v.forEach((function(i){i[u]&&i[u](s)}))}"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(function boot(){ee&&highlightAll()}),!1),Object.assign(i,{highlight,highlightAuto,highlightAll,fixMarkup:function deprecateFixMarkup(i){return deprecated("10.2.0","fixMarkup will be removed entirely in v11.0"),deprecated("10.2.0","Please see https://github.com/highlightjs/highlight.js/issues/2534"),function fixMarkup(i){return W.tabReplace||W.useBR?i.replace(j,(i=>"\n"===i?W.useBR?"
":i:W.tabReplace?i.replace(/\t/g,W.tabReplace):i)):i}(i)},highlightElement,highlightBlock:function deprecateHighlightBlock(i){return deprecated("10.7.0","highlightBlock will be removed entirely in v12.0"),deprecated("10.7.0","Please use highlightElement now."),highlightElement(i)},configure:function configure(i){i.useBR&&(deprecated("10.3.0","'useBR' will be removed entirely in v11.0"),deprecated("10.3.0","Please see https://github.com/highlightjs/highlight.js/issues/2559")),W=Re(W,i)},initHighlighting,initHighlightingOnLoad:function initHighlightingOnLoad(){deprecated("10.6.0","initHighlightingOnLoad() is deprecated. Use highlightAll() instead."),ee=!0},registerLanguage:function registerLanguage(s,m){let v=null;try{v=m(i)}catch(i){if(error("Language definition for '{}' could not be registered.".replace("{}",s)),!_)throw i;error(i),v=$}v.name||(v.name=s),u[s]=v,v.rawDefinition=m.bind(null,i),v.aliases&®isterAliases(v.aliases,{languageName:s})},unregisterLanguage:function unregisterLanguage(i){delete u[i];for(const s of Object.keys(m))m[s]===i&&delete m[s]},listLanguages:function listLanguages(){return Object.keys(u)},getLanguage,registerAliases,requireLanguage:function requireLanguage(i){deprecated("10.4.0","requireLanguage will be removed entirely in v11."),deprecated("10.4.0","Please see https://github.com/highlightjs/highlight.js/pull/2844");const s=getLanguage(i);if(s)return s;throw new Error("The '{}' language is required, but not loaded.".replace("{}",i))},autoDetection,inherit:Re,addPlugin:function addPlugin(i){!function upgradePluginAPI(i){i["before:highlightBlock"]&&!i["before:highlightElement"]&&(i["before:highlightElement"]=s=>{i["before:highlightBlock"](Object.assign({block:s.el},s))}),i["after:highlightBlock"]&&!i["after:highlightElement"]&&(i["after:highlightElement"]=s=>{i["after:highlightBlock"](Object.assign({block:s.el},s))})}(i),v.push(i)},vuePlugin:BuildVuePlugin(i).VuePlugin}),i.debugMode=function(){_=!1},i.safeMode=function(){_=!0},i.versionString="10.7.3";for(const i in we)"object"==typeof we[i]&&s(we[i]);return Object.assign(i,we),i.addPlugin(X),i.addPlugin(Pe),i.addPlugin(Z),i}({});i.exports=ze},61519:i=>{function concat(...i){return i.map((i=>function source(i){return i?"string"==typeof i?i:i.source:null}(i))).join("")}i.exports=function bash(i){const s={},u={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[s]}]};Object.assign(s,{className:"variable",variants:[{begin:concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},u]});const m={className:"subst",begin:/\$\(/,end:/\)/,contains:[i.BACKSLASH_ESCAPE]},v={begin:/<<-?\s*(?=\w+)/,starts:{contains:[i.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},_={className:"string",begin:/"/,end:/"/,contains:[i.BACKSLASH_ESCAPE,s,m]};m.contains.push(_);const j={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},i.NUMBER_MODE,s]},M=i.SHEBANG({binary:`(${["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"].join("|")})`,relevance:10}),$={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[i.inherit(i.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z._-]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp"},contains:[M,i.SHEBANG(),$,j,i.HASH_COMMENT_MODE,v,_,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}},30786:i=>{function concat(...i){return i.map((i=>function source(i){return i?"string"==typeof i?i:i.source:null}(i))).join("")}i.exports=function http(i){const s="HTTP/(2|1\\.[01])",u={className:"attribute",begin:concat("^",/[A-Za-z][A-Za-z0-9-]*/,"(?=\\:\\s)"),starts:{contains:[{className:"punctuation",begin:/: /,relevance:0,starts:{end:"$",relevance:0}}]}},m=[u,{begin:"\\n\\n",starts:{subLanguage:[],endsWithParent:!0}}];return{name:"HTTP",aliases:["https"],illegal:/\S/,contains:[{begin:"^(?="+s+" \\d{3})",end:/$/,contains:[{className:"meta",begin:s},{className:"number",begin:"\\b\\d{3}\\b"}],starts:{end:/\b\B/,illegal:/\S/,contains:m}},{begin:"(?=^[A-Z]+ (.*?) "+s+"$)",end:/$/,contains:[{className:"string",begin:" ",end:" ",excludeBegin:!0,excludeEnd:!0},{className:"meta",begin:s},{className:"keyword",begin:"[A-Z]+"}],starts:{end:/\b\B/,illegal:/\S/,contains:m}},i.inherit(u,{relevance:0})]}}},96344:i=>{const s="[A-Za-z$_][0-9A-Za-z$_]*",u=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],m=["true","false","null","undefined","NaN","Infinity"],v=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer","BigInt64Array","BigUint64Array","BigInt"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function lookahead(i){return concat("(?=",i,")")}function concat(...i){return i.map((i=>function source(i){return i?"string"==typeof i?i:i.source:null}(i))).join("")}i.exports=function javascript(i){const _=s,j="<>",M="",$={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(i,s)=>{const u=i[0].length+i.index,m=i.input[u];"<"!==m?">"===m&&(((i,{after:s})=>{const u="",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:i.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:W,contains:ye}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:j,end:M},{begin:$.begin,"on:begin":$.isTrulyOpeningTag,end:$.end}],subLanguage:"xml",contains:[{begin:$.begin,end:$.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[{;]/,excludeEnd:!0,keywords:W,contains:["self",i.inherit(i.TITLE_MODE,{begin:_}),be],illegal:/%/},{beginKeywords:"while if switch catch for"},{className:"function",begin:i.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,contains:[be,i.inherit(i.TITLE_MODE,{begin:_})]},{variants:[{begin:"\\."+_},{begin:"\\$"+_}],relevance:0},{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"[\]]/,contains:[{beginKeywords:"extends"},i.UNDERSCORE_TITLE_MODE]},{begin:/\b(?=constructor)/,end:/[{;]/,excludeEnd:!0,contains:[i.inherit(i.TITLE_MODE,{begin:_}),"self",be]},{begin:"(get|set)\\s+(?="+_+"\\()",end:/\{/,keywords:"get set",contains:[i.inherit(i.TITLE_MODE,{begin:_}),{begin:/\(\)/},be]},{begin:/\$[(.]/}]}}},82026:i=>{i.exports=function json(i){const s={literal:"true false null"},u=[i.C_LINE_COMMENT_MODE,i.C_BLOCK_COMMENT_MODE],m=[i.QUOTE_STRING_MODE,i.C_NUMBER_MODE],v={end:",",endsWithParent:!0,excludeEnd:!0,contains:m,keywords:s},_={begin:/\{/,end:/\}/,contains:[{className:"attr",begin:/"/,end:/"/,contains:[i.BACKSLASH_ESCAPE],illegal:"\\n"},i.inherit(v,{begin:/:/})].concat(u),illegal:"\\S"},j={begin:"\\[",end:"\\]",contains:[i.inherit(v)],illegal:"\\S"};return m.push(_,j),u.forEach((function(i){m.push(i)})),{name:"JSON",contains:m,keywords:s,illegal:"\\S"}}},66336:i=>{i.exports=function powershell(i){const s={$pattern:/-?[A-z\.\-]+\b/,keyword:"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter",built_in:"ac asnp cat cd CFS chdir clc clear clhy cli clp cls clv cnsn compare copy cp cpi cpp curl cvpa dbp del diff dir dnsn ebp echo|0 epal epcsv epsn erase etsn exsn fc fhx fl ft fw gal gbp gc gcb gci gcm gcs gdr gerr ghy gi gin gjb gl gm gmo gp gps gpv group gsn gsnp gsv gtz gu gv gwmi h history icm iex ihy ii ipal ipcsv ipmo ipsn irm ise iwmi iwr kill lp ls man md measure mi mount move mp mv nal ndr ni nmo npssc nsn nv ogv oh popd ps pushd pwd r rbp rcjb rcsn rd rdr ren ri rjb rm rmdir rmo rni rnp rp rsn rsnp rujb rv rvpa rwmi sajb sal saps sasv sbp sc scb select set shcm si sl sleep sls sort sp spjb spps spsv start stz sujb sv swmi tee trcm type wget where wjb write"},u={begin:"`[\\s\\S]",relevance:0},m={className:"variable",variants:[{begin:/\$\B/},{className:"keyword",begin:/\$this/},{begin:/\$[\w\d][\w\d_:]*/}]},v={className:"string",variants:[{begin:/"/,end:/"/},{begin:/@"/,end:/^"@/}],contains:[u,m,{className:"variable",begin:/\$[A-z]/,end:/[^A-z]/}]},_={className:"string",variants:[{begin:/'/,end:/'/},{begin:/@'/,end:/^'@/}]},j=i.inherit(i.COMMENT(null,null),{variants:[{begin:/#/,end:/$/},{begin:/<#/,end:/#>/}],contains:[{className:"doctag",variants:[{begin:/\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{begin:/\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\s+\S+/}]}]}),M={className:"built_in",variants:[{begin:"(".concat("Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|Mount|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Build|Complete|Confirm|Deny|Deploy|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where",")+(-)[\\w\\d]+")}]},$={className:"class",beginKeywords:"class enum",end:/\s*[{]/,excludeEnd:!0,relevance:0,contains:[i.TITLE_MODE]},W={className:"function",begin:/function\s+/,end:/\s*\{|$/,excludeEnd:!0,returnBegin:!0,relevance:0,contains:[{begin:"function",relevance:0,className:"keyword"},{className:"title",begin:/\w[\w\d]*((-)[\w\d]+)*/,relevance:0},{begin:/\(/,end:/\)/,className:"params",relevance:0,contains:[m]}]},X={begin:/using\s/,end:/$/,returnBegin:!0,contains:[v,_,{className:"keyword",begin:/(using|assembly|command|module|namespace|type)/}]},Y={variants:[{className:"operator",begin:"(".concat("-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor",")\\b")},{className:"literal",begin:/(-)[\w\d]+/,relevance:0}]},Z={className:"function",begin:/\[.*\]\s*[\w]+[ ]??\(/,end:/$/,returnBegin:!0,relevance:0,contains:[{className:"keyword",begin:"(".concat(s.keyword.toString().replace(/\s/g,"|"),")\\b"),endsParent:!0,relevance:0},i.inherit(i.TITLE_MODE,{endsParent:!0})]},ee=[Z,j,u,i.NUMBER_MODE,v,_,M,m,{className:"literal",begin:/\$(null|true|false)\b/},{className:"selector-tag",begin:/@\B/,relevance:0}],ie={begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[].concat("self",ee,{begin:"("+["string","char","byte","int","long","bool","decimal","single","double","DateTime","xml","array","hashtable","void"].join("|")+")",className:"built_in",relevance:0},{className:"type",begin:/[\.\w\d]+/,relevance:0})};return Z.contains.unshift(ie),{name:"PowerShell",aliases:["ps","ps1"],case_insensitive:!0,keywords:s,contains:ee.concat($,W,X,Y,ie)}}},42157:i=>{function source(i){return i?"string"==typeof i?i:i.source:null}function lookahead(i){return concat("(?=",i,")")}function concat(...i){return i.map((i=>source(i))).join("")}function either(...i){return"("+i.map((i=>source(i))).join("|")+")"}i.exports=function xml(i){const s=concat(/[A-Z_]/,function optional(i){return concat("(",i,")?")}(/[A-Z0-9_.-]*:/),/[A-Z0-9_.-]*/),u={className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},m={begin:/\s/,contains:[{className:"meta-keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},v=i.inherit(m,{begin:/\(/,end:/\)/}),_=i.inherit(i.APOS_STRING_MODE,{className:"meta-string"}),j=i.inherit(i.QUOTE_STRING_MODE,{className:"meta-string"}),M={endsWithParent:!0,illegal:/`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin://,relevance:10,contains:[m,j,_,v,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[m,v,j,_]}]}]},i.COMMENT(//,{relevance:10}),{begin://,relevance:10},u,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:/)/,end:/>/,keywords:{name:"style"},contains:[M],starts:{end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:/)/,end:/>/,keywords:{name:"script"},contains:[M],starts:{end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:/<>|<\/>/},{className:"tag",begin:concat(//,/>/,/\s/)))),end:/\/?>/,contains:[{className:"name",begin:s,relevance:0,starts:M}]},{className:"tag",begin:concat(/<\//,lookahead(concat(s,/>/))),contains:[{className:"name",begin:s,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]}}},54587:i=>{i.exports=function yaml(i){var s="true false yes no null",u="[\\w#;/?:@&=+$,.~*'()[\\]]+",m={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[i.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},v=i.inherit(m,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),_={className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},j={end:",",endsWithParent:!0,excludeEnd:!0,keywords:s,relevance:0},M={begin:/\{/,end:/\}/,contains:[j],illegal:"\\n",relevance:0},$={begin:"\\[",end:"\\]",contains:[j],illegal:"\\n",relevance:0},W=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+u},{className:"type",begin:"!<"+u+">"},{className:"type",begin:"!"+u},{className:"type",begin:"!!"+u},{className:"meta",begin:"&"+i.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+i.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},i.HASH_COMMENT_MODE,{beginKeywords:s,keywords:{literal:s}},_,{className:"number",begin:i.C_NUMBER_RE+"\\b",relevance:0},M,$,m],X=[...W];return X.pop(),X.push(v),j.contains=X,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:W}}},8679:(i,s,u)=>{"use strict";var m=u(59864),v={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},_={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},j={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},M={};function getStatics(i){return m.isMemo(i)?j:M[i.$$typeof]||v}M[m.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},M[m.Memo]=j;var $=Object.defineProperty,W=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols,Y=Object.getOwnPropertyDescriptor,Z=Object.getPrototypeOf,ee=Object.prototype;i.exports=function hoistNonReactStatics(i,s,u){if("string"!=typeof s){if(ee){var m=Z(s);m&&m!==ee&&hoistNonReactStatics(i,m,u)}var v=W(s);X&&(v=v.concat(X(s)));for(var j=getStatics(i),M=getStatics(s),ie=0;ie{s.read=function(i,s,u,m,v){var _,j,M=8*v-m-1,$=(1<>1,X=-7,Y=u?v-1:0,Z=u?-1:1,ee=i[s+Y];for(Y+=Z,_=ee&(1<<-X)-1,ee>>=-X,X+=M;X>0;_=256*_+i[s+Y],Y+=Z,X-=8);for(j=_&(1<<-X)-1,_>>=-X,X+=m;X>0;j=256*j+i[s+Y],Y+=Z,X-=8);if(0===_)_=1-W;else{if(_===$)return j?NaN:1/0*(ee?-1:1);j+=Math.pow(2,m),_-=W}return(ee?-1:1)*j*Math.pow(2,_-m)},s.write=function(i,s,u,m,v,_){var j,M,$,W=8*_-v-1,X=(1<>1,Z=23===v?Math.pow(2,-24)-Math.pow(2,-77):0,ee=m?0:_-1,ie=m?1:-1,ae=s<0||0===s&&1/s<0?1:0;for(s=Math.abs(s),isNaN(s)||s===1/0?(M=isNaN(s)?1:0,j=X):(j=Math.floor(Math.log(s)/Math.LN2),s*($=Math.pow(2,-j))<1&&(j--,$*=2),(s+=j+Y>=1?Z/$:Z*Math.pow(2,1-Y))*$>=2&&(j++,$/=2),j+Y>=X?(M=0,j=X):j+Y>=1?(M=(s*$-1)*Math.pow(2,v),j+=Y):(M=s*Math.pow(2,Y-1)*Math.pow(2,v),j=0));v>=8;i[u+ee]=255&M,ee+=ie,M/=256,v-=8);for(j=j<0;i[u+ee]=255&j,ee+=ie,j/=256,W-=8);i[u+ee-ie]|=128*ae}},43393:function(i){i.exports=function(){"use strict";var i=Array.prototype.slice;function createClass(i,s){s&&(i.prototype=Object.create(s.prototype)),i.prototype.constructor=i}function Iterable(i){return isIterable(i)?i:Seq(i)}function KeyedIterable(i){return isKeyed(i)?i:KeyedSeq(i)}function IndexedIterable(i){return isIndexed(i)?i:IndexedSeq(i)}function SetIterable(i){return isIterable(i)&&!isAssociative(i)?i:SetSeq(i)}function isIterable(i){return!(!i||!i[s])}function isKeyed(i){return!(!i||!i[u])}function isIndexed(i){return!(!i||!i[m])}function isAssociative(i){return isKeyed(i)||isIndexed(i)}function isOrdered(i){return!(!i||!i[v])}createClass(KeyedIterable,Iterable),createClass(IndexedIterable,Iterable),createClass(SetIterable,Iterable),Iterable.isIterable=isIterable,Iterable.isKeyed=isKeyed,Iterable.isIndexed=isIndexed,Iterable.isAssociative=isAssociative,Iterable.isOrdered=isOrdered,Iterable.Keyed=KeyedIterable,Iterable.Indexed=IndexedIterable,Iterable.Set=SetIterable;var s="@@__IMMUTABLE_ITERABLE__@@",u="@@__IMMUTABLE_KEYED__@@",m="@@__IMMUTABLE_INDEXED__@@",v="@@__IMMUTABLE_ORDERED__@@",_="delete",j=5,M=1<>>0;if(""+u!==s||4294967295===u)return NaN;s=u}return s<0?ensureSize(i)+s:s}function returnTrue(){return!0}function wholeSlice(i,s,u){return(0===i||void 0!==u&&i<=-u)&&(void 0===s||void 0!==u&&s>=u)}function resolveBegin(i,s){return resolveIndex(i,s,0)}function resolveEnd(i,s){return resolveIndex(i,s,s)}function resolveIndex(i,s,u){return void 0===i?u:i<0?Math.max(0,s+i):void 0===s?i:Math.min(s,i)}var Z=0,ee=1,ie=2,ae="function"==typeof Symbol&&Symbol.iterator,ce="@@iterator",le=ae||ce;function Iterator(i){this.next=i}function iteratorValue(i,s,u,m){var v=0===i?s:1===i?u:[s,u];return m?m.value=v:m={value:v,done:!1},m}function iteratorDone(){return{value:void 0,done:!0}}function hasIterator(i){return!!getIteratorFn(i)}function isIterator(i){return i&&"function"==typeof i.next}function getIterator(i){var s=getIteratorFn(i);return s&&s.call(i)}function getIteratorFn(i){var s=i&&(ae&&i[ae]||i[ce]);if("function"==typeof s)return s}function isArrayLike(i){return i&&"number"==typeof i.length}function Seq(i){return null==i?emptySequence():isIterable(i)?i.toSeq():seqFromValue(i)}function KeyedSeq(i){return null==i?emptySequence().toKeyedSeq():isIterable(i)?isKeyed(i)?i.toSeq():i.fromEntrySeq():keyedSeqFromValue(i)}function IndexedSeq(i){return null==i?emptySequence():isIterable(i)?isKeyed(i)?i.entrySeq():i.toIndexedSeq():indexedSeqFromValue(i)}function SetSeq(i){return(null==i?emptySequence():isIterable(i)?isKeyed(i)?i.entrySeq():i:indexedSeqFromValue(i)).toSetSeq()}Iterator.prototype.toString=function(){return"[Iterator]"},Iterator.KEYS=Z,Iterator.VALUES=ee,Iterator.ENTRIES=ie,Iterator.prototype.inspect=Iterator.prototype.toSource=function(){return this.toString()},Iterator.prototype[le]=function(){return this},createClass(Seq,Iterable),Seq.of=function(){return Seq(arguments)},Seq.prototype.toSeq=function(){return this},Seq.prototype.toString=function(){return this.__toString("Seq {","}")},Seq.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},Seq.prototype.__iterate=function(i,s){return seqIterate(this,i,s,!0)},Seq.prototype.__iterator=function(i,s){return seqIterator(this,i,s,!0)},createClass(KeyedSeq,Seq),KeyedSeq.prototype.toKeyedSeq=function(){return this},createClass(IndexedSeq,Seq),IndexedSeq.of=function(){return IndexedSeq(arguments)},IndexedSeq.prototype.toIndexedSeq=function(){return this},IndexedSeq.prototype.toString=function(){return this.__toString("Seq [","]")},IndexedSeq.prototype.__iterate=function(i,s){return seqIterate(this,i,s,!1)},IndexedSeq.prototype.__iterator=function(i,s){return seqIterator(this,i,s,!1)},createClass(SetSeq,Seq),SetSeq.of=function(){return SetSeq(arguments)},SetSeq.prototype.toSetSeq=function(){return this},Seq.isSeq=isSeq,Seq.Keyed=KeyedSeq,Seq.Set=SetSeq,Seq.Indexed=IndexedSeq;var pe,de,fe,ye="@@__IMMUTABLE_SEQ__@@";function ArraySeq(i){this._array=i,this.size=i.length}function ObjectSeq(i){var s=Object.keys(i);this._object=i,this._keys=s,this.size=s.length}function IterableSeq(i){this._iterable=i,this.size=i.length||i.size}function IteratorSeq(i){this._iterator=i,this._iteratorCache=[]}function isSeq(i){return!(!i||!i[ye])}function emptySequence(){return pe||(pe=new ArraySeq([]))}function keyedSeqFromValue(i){var s=Array.isArray(i)?new ArraySeq(i).fromEntrySeq():isIterator(i)?new IteratorSeq(i).fromEntrySeq():hasIterator(i)?new IterableSeq(i).fromEntrySeq():"object"==typeof i?new ObjectSeq(i):void 0;if(!s)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+i);return s}function indexedSeqFromValue(i){var s=maybeIndexedSeqFromValue(i);if(!s)throw new TypeError("Expected Array or iterable object of values: "+i);return s}function seqFromValue(i){var s=maybeIndexedSeqFromValue(i)||"object"==typeof i&&new ObjectSeq(i);if(!s)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+i);return s}function maybeIndexedSeqFromValue(i){return isArrayLike(i)?new ArraySeq(i):isIterator(i)?new IteratorSeq(i):hasIterator(i)?new IterableSeq(i):void 0}function seqIterate(i,s,u,m){var v=i._cache;if(v){for(var _=v.length-1,j=0;j<=_;j++){var M=v[u?_-j:j];if(!1===s(M[1],m?M[0]:j,i))return j+1}return j}return i.__iterateUncached(s,u)}function seqIterator(i,s,u,m){var v=i._cache;if(v){var _=v.length-1,j=0;return new Iterator((function(){var i=v[u?_-j:j];return j++>_?iteratorDone():iteratorValue(s,m?i[0]:j-1,i[1])}))}return i.__iteratorUncached(s,u)}function fromJS(i,s){return s?fromJSWith(s,i,"",{"":i}):fromJSDefault(i)}function fromJSWith(i,s,u,m){return Array.isArray(s)?i.call(m,u,IndexedSeq(s).map((function(u,m){return fromJSWith(i,u,m,s)}))):isPlainObj(s)?i.call(m,u,KeyedSeq(s).map((function(u,m){return fromJSWith(i,u,m,s)}))):s}function fromJSDefault(i){return Array.isArray(i)?IndexedSeq(i).map(fromJSDefault).toList():isPlainObj(i)?KeyedSeq(i).map(fromJSDefault).toMap():i}function isPlainObj(i){return i&&(i.constructor===Object||void 0===i.constructor)}function is(i,s){if(i===s||i!=i&&s!=s)return!0;if(!i||!s)return!1;if("function"==typeof i.valueOf&&"function"==typeof s.valueOf){if((i=i.valueOf())===(s=s.valueOf())||i!=i&&s!=s)return!0;if(!i||!s)return!1}return!("function"!=typeof i.equals||"function"!=typeof s.equals||!i.equals(s))}function deepEqual(i,s){if(i===s)return!0;if(!isIterable(s)||void 0!==i.size&&void 0!==s.size&&i.size!==s.size||void 0!==i.__hash&&void 0!==s.__hash&&i.__hash!==s.__hash||isKeyed(i)!==isKeyed(s)||isIndexed(i)!==isIndexed(s)||isOrdered(i)!==isOrdered(s))return!1;if(0===i.size&&0===s.size)return!0;var u=!isAssociative(i);if(isOrdered(i)){var m=i.entries();return s.every((function(i,s){var v=m.next().value;return v&&is(v[1],i)&&(u||is(v[0],s))}))&&m.next().done}var v=!1;if(void 0===i.size)if(void 0===s.size)"function"==typeof i.cacheResult&&i.cacheResult();else{v=!0;var _=i;i=s,s=_}var j=!0,M=s.__iterate((function(s,m){if(u?!i.has(s):v?!is(s,i.get(m,W)):!is(i.get(m,W),s))return j=!1,!1}));return j&&i.size===M}function Repeat(i,s){if(!(this instanceof Repeat))return new Repeat(i,s);if(this._value=i,this.size=void 0===s?1/0:Math.max(0,s),0===this.size){if(de)return de;de=this}}function invariant(i,s){if(!i)throw new Error(s)}function Range(i,s,u){if(!(this instanceof Range))return new Range(i,s,u);if(invariant(0!==u,"Cannot step a Range by 0"),i=i||0,void 0===s&&(s=1/0),u=void 0===u?1:Math.abs(u),sm?iteratorDone():iteratorValue(i,v,u[s?m-v++:v++])}))},createClass(ObjectSeq,KeyedSeq),ObjectSeq.prototype.get=function(i,s){return void 0===s||this.has(i)?this._object[i]:s},ObjectSeq.prototype.has=function(i){return this._object.hasOwnProperty(i)},ObjectSeq.prototype.__iterate=function(i,s){for(var u=this._object,m=this._keys,v=m.length-1,_=0;_<=v;_++){var j=m[s?v-_:_];if(!1===i(u[j],j,this))return _+1}return _},ObjectSeq.prototype.__iterator=function(i,s){var u=this._object,m=this._keys,v=m.length-1,_=0;return new Iterator((function(){var j=m[s?v-_:_];return _++>v?iteratorDone():iteratorValue(i,j,u[j])}))},ObjectSeq.prototype[v]=!0,createClass(IterableSeq,IndexedSeq),IterableSeq.prototype.__iterateUncached=function(i,s){if(s)return this.cacheResult().__iterate(i,s);var u=getIterator(this._iterable),m=0;if(isIterator(u))for(var v;!(v=u.next()).done&&!1!==i(v.value,m++,this););return m},IterableSeq.prototype.__iteratorUncached=function(i,s){if(s)return this.cacheResult().__iterator(i,s);var u=getIterator(this._iterable);if(!isIterator(u))return new Iterator(iteratorDone);var m=0;return new Iterator((function(){var s=u.next();return s.done?s:iteratorValue(i,m++,s.value)}))},createClass(IteratorSeq,IndexedSeq),IteratorSeq.prototype.__iterateUncached=function(i,s){if(s)return this.cacheResult().__iterate(i,s);for(var u,m=this._iterator,v=this._iteratorCache,_=0;_=m.length){var s=u.next();if(s.done)return s;m[v]=s.value}return iteratorValue(i,v,m[v++])}))},createClass(Repeat,IndexedSeq),Repeat.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Repeat.prototype.get=function(i,s){return this.has(i)?this._value:s},Repeat.prototype.includes=function(i){return is(this._value,i)},Repeat.prototype.slice=function(i,s){var u=this.size;return wholeSlice(i,s,u)?this:new Repeat(this._value,resolveEnd(s,u)-resolveBegin(i,u))},Repeat.prototype.reverse=function(){return this},Repeat.prototype.indexOf=function(i){return is(this._value,i)?0:-1},Repeat.prototype.lastIndexOf=function(i){return is(this._value,i)?this.size:-1},Repeat.prototype.__iterate=function(i,s){for(var u=0;u=0&&s=0&&uu?iteratorDone():iteratorValue(i,_++,j)}))},Range.prototype.equals=function(i){return i instanceof Range?this._start===i._start&&this._end===i._end&&this._step===i._step:deepEqual(this,i)},createClass(Collection,Iterable),createClass(KeyedCollection,Collection),createClass(IndexedCollection,Collection),createClass(SetCollection,Collection),Collection.Keyed=KeyedCollection,Collection.Indexed=IndexedCollection,Collection.Set=SetCollection;var be="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function imul(i,s){var u=65535&(i|=0),m=65535&(s|=0);return u*m+((i>>>16)*m+u*(s>>>16)<<16>>>0)|0};function smi(i){return i>>>1&1073741824|3221225471&i}function hash(i){if(!1===i||null==i)return 0;if("function"==typeof i.valueOf&&(!1===(i=i.valueOf())||null==i))return 0;if(!0===i)return 1;var s=typeof i;if("number"===s){if(i!=i||i===1/0)return 0;var u=0|i;for(u!==i&&(u^=4294967295*i);i>4294967295;)u^=i/=4294967295;return smi(u)}if("string"===s)return i.length>Te?cachedHashString(i):hashString(i);if("function"==typeof i.hashCode)return i.hashCode();if("object"===s)return hashJSObj(i);if("function"==typeof i.toString)return hashString(i.toString());throw new Error("Value type "+s+" cannot be hashed.")}function cachedHashString(i){var s=ze[i];return void 0===s&&(s=hashString(i),qe===Re&&(qe=0,ze={}),qe++,ze[i]=s),s}function hashString(i){for(var s=0,u=0;u0)switch(i.nodeType){case 1:return i.uniqueID;case 9:return i.documentElement&&i.documentElement.uniqueID}}var Se,xe="function"==typeof WeakMap;xe&&(Se=new WeakMap);var Pe=0,Ie="__immutablehash__";"function"==typeof Symbol&&(Ie=Symbol(Ie));var Te=16,Re=255,qe=0,ze={};function assertNotInfinite(i){invariant(i!==1/0,"Cannot perform this action with an infinite size.")}function Map(i){return null==i?emptyMap():isMap(i)&&!isOrdered(i)?i:emptyMap().withMutations((function(s){var u=KeyedIterable(i);assertNotInfinite(u.size),u.forEach((function(i,u){return s.set(u,i)}))}))}function isMap(i){return!(!i||!i[We])}createClass(Map,KeyedCollection),Map.of=function(){var s=i.call(arguments,0);return emptyMap().withMutations((function(i){for(var u=0;u=s.length)throw new Error("Missing value for key: "+s[u]);i.set(s[u],s[u+1])}}))},Map.prototype.toString=function(){return this.__toString("Map {","}")},Map.prototype.get=function(i,s){return this._root?this._root.get(0,void 0,i,s):s},Map.prototype.set=function(i,s){return updateMap(this,i,s)},Map.prototype.setIn=function(i,s){return this.updateIn(i,W,(function(){return s}))},Map.prototype.remove=function(i){return updateMap(this,i,W)},Map.prototype.deleteIn=function(i){return this.updateIn(i,(function(){return W}))},Map.prototype.update=function(i,s,u){return 1===arguments.length?i(this):this.updateIn([i],s,u)},Map.prototype.updateIn=function(i,s,u){u||(u=s,s=void 0);var m=updateInDeepMap(this,forceIterator(i),s,u);return m===W?void 0:m},Map.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):emptyMap()},Map.prototype.merge=function(){return mergeIntoMapWith(this,void 0,arguments)},Map.prototype.mergeWith=function(s){return mergeIntoMapWith(this,s,i.call(arguments,1))},Map.prototype.mergeIn=function(s){var u=i.call(arguments,1);return this.updateIn(s,emptyMap(),(function(i){return"function"==typeof i.merge?i.merge.apply(i,u):u[u.length-1]}))},Map.prototype.mergeDeep=function(){return mergeIntoMapWith(this,deepMerger,arguments)},Map.prototype.mergeDeepWith=function(s){var u=i.call(arguments,1);return mergeIntoMapWith(this,deepMergerWith(s),u)},Map.prototype.mergeDeepIn=function(s){var u=i.call(arguments,1);return this.updateIn(s,emptyMap(),(function(i){return"function"==typeof i.mergeDeep?i.mergeDeep.apply(i,u):u[u.length-1]}))},Map.prototype.sort=function(i){return OrderedMap(sortFactory(this,i))},Map.prototype.sortBy=function(i,s){return OrderedMap(sortFactory(this,s,i))},Map.prototype.withMutations=function(i){var s=this.asMutable();return i(s),s.wasAltered()?s.__ensureOwner(this.__ownerID):this},Map.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new OwnerID)},Map.prototype.asImmutable=function(){return this.__ensureOwner()},Map.prototype.wasAltered=function(){return this.__altered},Map.prototype.__iterator=function(i,s){return new MapIterator(this,i,s)},Map.prototype.__iterate=function(i,s){var u=this,m=0;return this._root&&this._root.iterate((function(s){return m++,i(s[1],s[0],u)}),s),m},Map.prototype.__ensureOwner=function(i){return i===this.__ownerID?this:i?makeMap(this.size,this._root,i,this.__hash):(this.__ownerID=i,this.__altered=!1,this)},Map.isMap=isMap;var Ve,We="@@__IMMUTABLE_MAP__@@",He=Map.prototype;function ArrayMapNode(i,s){this.ownerID=i,this.entries=s}function BitmapIndexedNode(i,s,u){this.ownerID=i,this.bitmap=s,this.nodes=u}function HashArrayMapNode(i,s,u){this.ownerID=i,this.count=s,this.nodes=u}function HashCollisionNode(i,s,u){this.ownerID=i,this.keyHash=s,this.entries=u}function ValueNode(i,s,u){this.ownerID=i,this.keyHash=s,this.entry=u}function MapIterator(i,s,u){this._type=s,this._reverse=u,this._stack=i._root&&mapIteratorFrame(i._root)}function mapIteratorValue(i,s){return iteratorValue(i,s[0],s[1])}function mapIteratorFrame(i,s){return{node:i,index:0,__prev:s}}function makeMap(i,s,u,m){var v=Object.create(He);return v.size=i,v._root=s,v.__ownerID=u,v.__hash=m,v.__altered=!1,v}function emptyMap(){return Ve||(Ve=makeMap(0))}function updateMap(i,s,u){var m,v;if(i._root){var _=MakeRef(X),j=MakeRef(Y);if(m=updateNode(i._root,i.__ownerID,0,void 0,s,u,_,j),!j.value)return i;v=i.size+(_.value?u===W?-1:1:0)}else{if(u===W)return i;v=1,m=new ArrayMapNode(i.__ownerID,[[s,u]])}return i.__ownerID?(i.size=v,i._root=m,i.__hash=void 0,i.__altered=!0,i):m?makeMap(v,m):emptyMap()}function updateNode(i,s,u,m,v,_,j,M){return i?i.update(s,u,m,v,_,j,M):_===W?i:(SetRef(M),SetRef(j),new ValueNode(s,m,[v,_]))}function isLeafNode(i){return i.constructor===ValueNode||i.constructor===HashCollisionNode}function mergeIntoNode(i,s,u,m,v){if(i.keyHash===m)return new HashCollisionNode(s,m,[i.entry,v]);var _,M=(0===u?i.keyHash:i.keyHash>>>u)&$,W=(0===u?m:m>>>u)&$;return new BitmapIndexedNode(s,1<>>=1)j[$]=1&u?s[_++]:void 0;return j[m]=v,new HashArrayMapNode(i,_+1,j)}function mergeIntoMapWith(i,s,u){for(var m=[],v=0;v>1&1431655765))+(i>>2&858993459))+(i>>4)&252645135,i+=i>>8,127&(i+=i>>16)}function setIn(i,s,u,m){var v=m?i:arrCopy(i);return v[s]=u,v}function spliceIn(i,s,u,m){var v=i.length+1;if(m&&s+1===v)return i[s]=u,i;for(var _=new Array(v),j=0,M=0;M=Xe)return createNodes(i,$,m,v);var ee=i&&i===this.ownerID,ie=ee?$:arrCopy($);return Z?M?X===Y-1?ie.pop():ie[X]=ie.pop():ie[X]=[m,v]:ie.push([m,v]),ee?(this.entries=ie,this):new ArrayMapNode(i,ie)}},BitmapIndexedNode.prototype.get=function(i,s,u,m){void 0===s&&(s=hash(u));var v=1<<((0===i?s:s>>>i)&$),_=this.bitmap;return 0==(_&v)?m:this.nodes[popCount(_&v-1)].get(i+j,s,u,m)},BitmapIndexedNode.prototype.update=function(i,s,u,m,v,_,M){void 0===u&&(u=hash(m));var X=(0===s?u:u>>>s)&$,Y=1<=Ye)return expandNodes(i,ae,Z,X,le);if(ee&&!le&&2===ae.length&&isLeafNode(ae[1^ie]))return ae[1^ie];if(ee&&le&&1===ae.length&&isLeafNode(le))return le;var pe=i&&i===this.ownerID,de=ee?le?Z:Z^Y:Z|Y,fe=ee?le?setIn(ae,ie,le,pe):spliceOut(ae,ie,pe):spliceIn(ae,ie,le,pe);return pe?(this.bitmap=de,this.nodes=fe,this):new BitmapIndexedNode(i,de,fe)},HashArrayMapNode.prototype.get=function(i,s,u,m){void 0===s&&(s=hash(u));var v=(0===i?s:s>>>i)&$,_=this.nodes[v];return _?_.get(i+j,s,u,m):m},HashArrayMapNode.prototype.update=function(i,s,u,m,v,_,M){void 0===u&&(u=hash(m));var X=(0===s?u:u>>>s)&$,Y=v===W,Z=this.nodes,ee=Z[X];if(Y&&!ee)return this;var ie=updateNode(ee,i,s+j,u,m,v,_,M);if(ie===ee)return this;var ae=this.count;if(ee){if(!ie&&--ae0&&m=0&&i>>s&$;if(m>=this.array.length)return new VNode([],i);var v,_=0===m;if(s>0){var M=this.array[m];if((v=M&&M.removeBefore(i,s-j,u))===M&&_)return this}if(_&&!v)return this;var W=editableVNode(this,i);if(!_)for(var X=0;X>>s&$;if(v>=this.array.length)return this;if(s>0){var _=this.array[v];if((m=_&&_.removeAfter(i,s-j,u))===_&&v===this.array.length-1)return this}var M=editableVNode(this,i);return M.array.splice(v+1),m&&(M.array[v]=m),M};var rt,nt,ot={};function iterateList(i,s){var u=i._origin,m=i._capacity,v=getTailOffset(m),_=i._tail;return iterateNodeOrLeaf(i._root,i._level,0);function iterateNodeOrLeaf(i,s,u){return 0===s?iterateLeaf(i,u):iterateNode(i,s,u)}function iterateLeaf(i,j){var $=j===v?_&&_.array:i&&i.array,W=j>u?0:u-j,X=m-j;return X>M&&(X=M),function(){if(W===X)return ot;var i=s?--X:W++;return $&&$[i]}}function iterateNode(i,v,_){var $,W=i&&i.array,X=_>u?0:u-_>>v,Y=1+(m-_>>v);return Y>M&&(Y=M),function(){for(;;){if($){var i=$();if(i!==ot)return i;$=null}if(X===Y)return ot;var u=s?--Y:X++;$=iterateNodeOrLeaf(W&&W[u],v-j,_+(u<=i.size||s<0)return i.withMutations((function(i){s<0?setListBounds(i,s).set(0,u):setListBounds(i,0,s+1).set(s,u)}));s+=i._origin;var m=i._tail,v=i._root,_=MakeRef(Y);return s>=getTailOffset(i._capacity)?m=updateVNode(m,i.__ownerID,0,s,u,_):v=updateVNode(v,i.__ownerID,i._level,s,u,_),_.value?i.__ownerID?(i._root=v,i._tail=m,i.__hash=void 0,i.__altered=!0,i):makeList(i._origin,i._capacity,i._level,v,m):i}function updateVNode(i,s,u,m,v,_){var M,W=m>>>u&$,X=i&&W0){var Y=i&&i.array[W],Z=updateVNode(Y,s,u-j,m,v,_);return Z===Y?i:((M=editableVNode(i,s)).array[W]=Z,M)}return X&&i.array[W]===v?i:(SetRef(_),M=editableVNode(i,s),void 0===v&&W===M.array.length-1?M.array.pop():M.array[W]=v,M)}function editableVNode(i,s){return s&&i&&s===i.ownerID?i:new VNode(i?i.array.slice():[],s)}function listNodeFor(i,s){if(s>=getTailOffset(i._capacity))return i._tail;if(s<1<0;)u=u.array[s>>>m&$],m-=j;return u}}function setListBounds(i,s,u){void 0!==s&&(s|=0),void 0!==u&&(u|=0);var m=i.__ownerID||new OwnerID,v=i._origin,_=i._capacity,M=v+s,W=void 0===u?_:u<0?_+u:v+u;if(M===v&&W===_)return i;if(M>=W)return i.clear();for(var X=i._level,Y=i._root,Z=0;M+Z<0;)Y=new VNode(Y&&Y.array.length?[void 0,Y]:[],m),Z+=1<<(X+=j);Z&&(M+=Z,v+=Z,W+=Z,_+=Z);for(var ee=getTailOffset(_),ie=getTailOffset(W);ie>=1<ee?new VNode([],m):ae;if(ae&&ie>ee&&M<_&&ae.array.length){for(var le=Y=editableVNode(Y,m),pe=X;pe>j;pe-=j){var de=ee>>>pe&$;le=le.array[de]=editableVNode(le.array[de],m)}le.array[ee>>>j&$]=ae}if(W<_&&(ce=ce&&ce.removeAfter(m,0,W)),M>=ie)M-=ie,W-=ie,X=j,Y=null,ce=ce&&ce.removeBefore(m,0,M);else if(M>v||ie>>X&$;if(fe!==ie>>>X&$)break;fe&&(Z+=(1<v&&(Y=Y.removeBefore(m,X,M-Z)),Y&&iev&&(v=M.size),isIterable(j)||(M=M.map((function(i){return fromJS(i)}))),m.push(M)}return v>i.size&&(i=i.setSize(v)),mergeIntoCollectionWith(i,s,m)}function getTailOffset(i){return i>>j<=M&&j.size>=2*_.size?(m=(v=j.filter((function(i,s){return void 0!==i&&$!==s}))).toKeyedSeq().map((function(i){return i[0]})).flip().toMap(),i.__ownerID&&(m.__ownerID=v.__ownerID=i.__ownerID)):(m=_.remove(s),v=$===j.size-1?j.pop():j.set($,void 0))}else if(X){if(u===j.get($)[1])return i;m=_,v=j.set($,[s,u])}else m=_.set(s,j.size),v=j.set(j.size,[s,u]);return i.__ownerID?(i.size=m.size,i._map=m,i._list=v,i.__hash=void 0,i):makeOrderedMap(m,v)}function ToKeyedSequence(i,s){this._iter=i,this._useKeys=s,this.size=i.size}function ToIndexedSequence(i){this._iter=i,this.size=i.size}function ToSetSequence(i){this._iter=i,this.size=i.size}function FromEntriesSequence(i){this._iter=i,this.size=i.size}function flipFactory(i){var s=makeSequence(i);return s._iter=i,s.size=i.size,s.flip=function(){return i},s.reverse=function(){var s=i.reverse.apply(this);return s.flip=function(){return i.reverse()},s},s.has=function(s){return i.includes(s)},s.includes=function(s){return i.has(s)},s.cacheResult=cacheResultThrough,s.__iterateUncached=function(s,u){var m=this;return i.__iterate((function(i,u){return!1!==s(u,i,m)}),u)},s.__iteratorUncached=function(s,u){if(s===ie){var m=i.__iterator(s,u);return new Iterator((function(){var i=m.next();if(!i.done){var s=i.value[0];i.value[0]=i.value[1],i.value[1]=s}return i}))}return i.__iterator(s===ee?Z:ee,u)},s}function mapFactory(i,s,u){var m=makeSequence(i);return m.size=i.size,m.has=function(s){return i.has(s)},m.get=function(m,v){var _=i.get(m,W);return _===W?v:s.call(u,_,m,i)},m.__iterateUncached=function(m,v){var _=this;return i.__iterate((function(i,v,j){return!1!==m(s.call(u,i,v,j),v,_)}),v)},m.__iteratorUncached=function(m,v){var _=i.__iterator(ie,v);return new Iterator((function(){var v=_.next();if(v.done)return v;var j=v.value,M=j[0];return iteratorValue(m,M,s.call(u,j[1],M,i),v)}))},m}function reverseFactory(i,s){var u=makeSequence(i);return u._iter=i,u.size=i.size,u.reverse=function(){return i},i.flip&&(u.flip=function(){var s=flipFactory(i);return s.reverse=function(){return i.flip()},s}),u.get=function(u,m){return i.get(s?u:-1-u,m)},u.has=function(u){return i.has(s?u:-1-u)},u.includes=function(s){return i.includes(s)},u.cacheResult=cacheResultThrough,u.__iterate=function(s,u){var m=this;return i.__iterate((function(i,u){return s(i,u,m)}),!u)},u.__iterator=function(s,u){return i.__iterator(s,!u)},u}function filterFactory(i,s,u,m){var v=makeSequence(i);return m&&(v.has=function(m){var v=i.get(m,W);return v!==W&&!!s.call(u,v,m,i)},v.get=function(m,v){var _=i.get(m,W);return _!==W&&s.call(u,_,m,i)?_:v}),v.__iterateUncached=function(v,_){var j=this,M=0;return i.__iterate((function(i,_,$){if(s.call(u,i,_,$))return M++,v(i,m?_:M-1,j)}),_),M},v.__iteratorUncached=function(v,_){var j=i.__iterator(ie,_),M=0;return new Iterator((function(){for(;;){var _=j.next();if(_.done)return _;var $=_.value,W=$[0],X=$[1];if(s.call(u,X,W,i))return iteratorValue(v,m?W:M++,X,_)}}))},v}function countByFactory(i,s,u){var m=Map().asMutable();return i.__iterate((function(v,_){m.update(s.call(u,v,_,i),0,(function(i){return i+1}))})),m.asImmutable()}function groupByFactory(i,s,u){var m=isKeyed(i),v=(isOrdered(i)?OrderedMap():Map()).asMutable();i.__iterate((function(_,j){v.update(s.call(u,_,j,i),(function(i){return(i=i||[]).push(m?[j,_]:_),i}))}));var _=iterableClass(i);return v.map((function(s){return reify(i,_(s))}))}function sliceFactory(i,s,u,m){var v=i.size;if(void 0!==s&&(s|=0),void 0!==u&&(u===1/0?u=v:u|=0),wholeSlice(s,u,v))return i;var _=resolveBegin(s,v),j=resolveEnd(u,v);if(_!=_||j!=j)return sliceFactory(i.toSeq().cacheResult(),s,u,m);var M,$=j-_;$==$&&(M=$<0?0:$);var W=makeSequence(i);return W.size=0===M?M:i.size&&M||void 0,!m&&isSeq(i)&&M>=0&&(W.get=function(s,u){return(s=wrapIndex(this,s))>=0&&sM)return iteratorDone();var i=v.next();return m||s===ee?i:iteratorValue(s,$-1,s===Z?void 0:i.value[1],i)}))},W}function takeWhileFactory(i,s,u){var m=makeSequence(i);return m.__iterateUncached=function(m,v){var _=this;if(v)return this.cacheResult().__iterate(m,v);var j=0;return i.__iterate((function(i,v,M){return s.call(u,i,v,M)&&++j&&m(i,v,_)})),j},m.__iteratorUncached=function(m,v){var _=this;if(v)return this.cacheResult().__iterator(m,v);var j=i.__iterator(ie,v),M=!0;return new Iterator((function(){if(!M)return iteratorDone();var i=j.next();if(i.done)return i;var v=i.value,$=v[0],W=v[1];return s.call(u,W,$,_)?m===ie?i:iteratorValue(m,$,W,i):(M=!1,iteratorDone())}))},m}function skipWhileFactory(i,s,u,m){var v=makeSequence(i);return v.__iterateUncached=function(v,_){var j=this;if(_)return this.cacheResult().__iterate(v,_);var M=!0,$=0;return i.__iterate((function(i,_,W){if(!M||!(M=s.call(u,i,_,W)))return $++,v(i,m?_:$-1,j)})),$},v.__iteratorUncached=function(v,_){var j=this;if(_)return this.cacheResult().__iterator(v,_);var M=i.__iterator(ie,_),$=!0,W=0;return new Iterator((function(){var i,_,X;do{if((i=M.next()).done)return m||v===ee?i:iteratorValue(v,W++,v===Z?void 0:i.value[1],i);var Y=i.value;_=Y[0],X=Y[1],$&&($=s.call(u,X,_,j))}while($);return v===ie?i:iteratorValue(v,_,X,i)}))},v}function concatFactory(i,s){var u=isKeyed(i),m=[i].concat(s).map((function(i){return isIterable(i)?u&&(i=KeyedIterable(i)):i=u?keyedSeqFromValue(i):indexedSeqFromValue(Array.isArray(i)?i:[i]),i})).filter((function(i){return 0!==i.size}));if(0===m.length)return i;if(1===m.length){var v=m[0];if(v===i||u&&isKeyed(v)||isIndexed(i)&&isIndexed(v))return v}var _=new ArraySeq(m);return u?_=_.toKeyedSeq():isIndexed(i)||(_=_.toSetSeq()),(_=_.flatten(!0)).size=m.reduce((function(i,s){if(void 0!==i){var u=s.size;if(void 0!==u)return i+u}}),0),_}function flattenFactory(i,s,u){var m=makeSequence(i);return m.__iterateUncached=function(m,v){var _=0,j=!1;function flatDeep(i,M){var $=this;i.__iterate((function(i,v){return(!s||M0}function zipWithFactory(i,s,u){var m=makeSequence(i);return m.size=new ArraySeq(u).map((function(i){return i.size})).min(),m.__iterate=function(i,s){for(var u,m=this.__iterator(ee,s),v=0;!(u=m.next()).done&&!1!==i(u.value,v++,this););return v},m.__iteratorUncached=function(i,m){var v=u.map((function(i){return i=Iterable(i),getIterator(m?i.reverse():i)})),_=0,j=!1;return new Iterator((function(){var u;return j||(u=v.map((function(i){return i.next()})),j=u.some((function(i){return i.done}))),j?iteratorDone():iteratorValue(i,_++,s.apply(null,u.map((function(i){return i.value}))))}))},m}function reify(i,s){return isSeq(i)?s:i.constructor(s)}function validateEntry(i){if(i!==Object(i))throw new TypeError("Expected [K, V] tuple: "+i)}function resolveSize(i){return assertNotInfinite(i.size),ensureSize(i)}function iterableClass(i){return isKeyed(i)?KeyedIterable:isIndexed(i)?IndexedIterable:SetIterable}function makeSequence(i){return Object.create((isKeyed(i)?KeyedSeq:isIndexed(i)?IndexedSeq:SetSeq).prototype)}function cacheResultThrough(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):Seq.prototype.cacheResult.call(this)}function defaultComparator(i,s){return i>s?1:i=0;u--)s={value:arguments[u],next:s};return this.__ownerID?(this.size=i,this._head=s,this.__hash=void 0,this.__altered=!0,this):makeStack(i,s)},Stack.prototype.pushAll=function(i){if(0===(i=IndexedIterable(i)).size)return this;assertNotInfinite(i.size);var s=this.size,u=this._head;return i.reverse().forEach((function(i){s++,u={value:i,next:u}})),this.__ownerID?(this.size=s,this._head=u,this.__hash=void 0,this.__altered=!0,this):makeStack(s,u)},Stack.prototype.pop=function(){return this.slice(1)},Stack.prototype.unshift=function(){return this.push.apply(this,arguments)},Stack.prototype.unshiftAll=function(i){return this.pushAll(i)},Stack.prototype.shift=function(){return this.pop.apply(this,arguments)},Stack.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):emptyStack()},Stack.prototype.slice=function(i,s){if(wholeSlice(i,s,this.size))return this;var u=resolveBegin(i,this.size);if(resolveEnd(s,this.size)!==this.size)return IndexedCollection.prototype.slice.call(this,i,s);for(var m=this.size-u,v=this._head;u--;)v=v.next;return this.__ownerID?(this.size=m,this._head=v,this.__hash=void 0,this.__altered=!0,this):makeStack(m,v)},Stack.prototype.__ensureOwner=function(i){return i===this.__ownerID?this:i?makeStack(this.size,this._head,i,this.__hash):(this.__ownerID=i,this.__altered=!1,this)},Stack.prototype.__iterate=function(i,s){if(s)return this.reverse().__iterate(i);for(var u=0,m=this._head;m&&!1!==i(m.value,u++,this);)m=m.next;return u},Stack.prototype.__iterator=function(i,s){if(s)return this.reverse().__iterator(i);var u=0,m=this._head;return new Iterator((function(){if(m){var s=m.value;return m=m.next,iteratorValue(i,u++,s)}return iteratorDone()}))},Stack.isStack=isStack;var pt,ht="@@__IMMUTABLE_STACK__@@",dt=Stack.prototype;function makeStack(i,s,u,m){var v=Object.create(dt);return v.size=i,v._head=s,v.__ownerID=u,v.__hash=m,v.__altered=!1,v}function emptyStack(){return pt||(pt=makeStack(0))}function mixin(i,s){var keyCopier=function(u){i.prototype[u]=s[u]};return Object.keys(s).forEach(keyCopier),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(s).forEach(keyCopier),i}dt[ht]=!0,dt.withMutations=He.withMutations,dt.asMutable=He.asMutable,dt.asImmutable=He.asImmutable,dt.wasAltered=He.wasAltered,Iterable.Iterator=Iterator,mixin(Iterable,{toArray:function(){assertNotInfinite(this.size);var i=new Array(this.size||0);return this.valueSeq().__iterate((function(s,u){i[u]=s})),i},toIndexedSeq:function(){return new ToIndexedSequence(this)},toJS:function(){return this.toSeq().map((function(i){return i&&"function"==typeof i.toJS?i.toJS():i})).__toJS()},toJSON:function(){return this.toSeq().map((function(i){return i&&"function"==typeof i.toJSON?i.toJSON():i})).__toJS()},toKeyedSeq:function(){return new ToKeyedSequence(this,!0)},toMap:function(){return Map(this.toKeyedSeq())},toObject:function(){assertNotInfinite(this.size);var i={};return this.__iterate((function(s,u){i[u]=s})),i},toOrderedMap:function(){return OrderedMap(this.toKeyedSeq())},toOrderedSet:function(){return OrderedSet(isKeyed(this)?this.valueSeq():this)},toSet:function(){return Set(isKeyed(this)?this.valueSeq():this)},toSetSeq:function(){return new ToSetSequence(this)},toSeq:function(){return isIndexed(this)?this.toIndexedSeq():isKeyed(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Stack(isKeyed(this)?this.valueSeq():this)},toList:function(){return List(isKeyed(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(i,s){return 0===this.size?i+s:i+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+s},concat:function(){return reify(this,concatFactory(this,i.call(arguments,0)))},includes:function(i){return this.some((function(s){return is(s,i)}))},entries:function(){return this.__iterator(ie)},every:function(i,s){assertNotInfinite(this.size);var u=!0;return this.__iterate((function(m,v,_){if(!i.call(s,m,v,_))return u=!1,!1})),u},filter:function(i,s){return reify(this,filterFactory(this,i,s,!0))},find:function(i,s,u){var m=this.findEntry(i,s);return m?m[1]:u},forEach:function(i,s){return assertNotInfinite(this.size),this.__iterate(s?i.bind(s):i)},join:function(i){assertNotInfinite(this.size),i=void 0!==i?""+i:",";var s="",u=!0;return this.__iterate((function(m){u?u=!1:s+=i,s+=null!=m?m.toString():""})),s},keys:function(){return this.__iterator(Z)},map:function(i,s){return reify(this,mapFactory(this,i,s))},reduce:function(i,s,u){var m,v;return assertNotInfinite(this.size),arguments.length<2?v=!0:m=s,this.__iterate((function(s,_,j){v?(v=!1,m=s):m=i.call(u,m,s,_,j)})),m},reduceRight:function(i,s,u){var m=this.toKeyedSeq().reverse();return m.reduce.apply(m,arguments)},reverse:function(){return reify(this,reverseFactory(this,!0))},slice:function(i,s){return reify(this,sliceFactory(this,i,s,!0))},some:function(i,s){return!this.every(not(i),s)},sort:function(i){return reify(this,sortFactory(this,i))},values:function(){return this.__iterator(ee)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(i,s){return ensureSize(i?this.toSeq().filter(i,s):this)},countBy:function(i,s){return countByFactory(this,i,s)},equals:function(i){return deepEqual(this,i)},entrySeq:function(){var i=this;if(i._cache)return new ArraySeq(i._cache);var s=i.toSeq().map(entryMapper).toIndexedSeq();return s.fromEntrySeq=function(){return i.toSeq()},s},filterNot:function(i,s){return this.filter(not(i),s)},findEntry:function(i,s,u){var m=u;return this.__iterate((function(u,v,_){if(i.call(s,u,v,_))return m=[v,u],!1})),m},findKey:function(i,s){var u=this.findEntry(i,s);return u&&u[0]},findLast:function(i,s,u){return this.toKeyedSeq().reverse().find(i,s,u)},findLastEntry:function(i,s,u){return this.toKeyedSeq().reverse().findEntry(i,s,u)},findLastKey:function(i,s){return this.toKeyedSeq().reverse().findKey(i,s)},first:function(){return this.find(returnTrue)},flatMap:function(i,s){return reify(this,flatMapFactory(this,i,s))},flatten:function(i){return reify(this,flattenFactory(this,i,!0))},fromEntrySeq:function(){return new FromEntriesSequence(this)},get:function(i,s){return this.find((function(s,u){return is(u,i)}),void 0,s)},getIn:function(i,s){for(var u,m=this,v=forceIterator(i);!(u=v.next()).done;){var _=u.value;if((m=m&&m.get?m.get(_,W):W)===W)return s}return m},groupBy:function(i,s){return groupByFactory(this,i,s)},has:function(i){return this.get(i,W)!==W},hasIn:function(i){return this.getIn(i,W)!==W},isSubset:function(i){return i="function"==typeof i.includes?i:Iterable(i),this.every((function(s){return i.includes(s)}))},isSuperset:function(i){return(i="function"==typeof i.isSubset?i:Iterable(i)).isSubset(this)},keyOf:function(i){return this.findKey((function(s){return is(s,i)}))},keySeq:function(){return this.toSeq().map(keyMapper).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(i){return this.toKeyedSeq().reverse().keyOf(i)},max:function(i){return maxFactory(this,i)},maxBy:function(i,s){return maxFactory(this,s,i)},min:function(i){return maxFactory(this,i?neg(i):defaultNegComparator)},minBy:function(i,s){return maxFactory(this,s?neg(s):defaultNegComparator,i)},rest:function(){return this.slice(1)},skip:function(i){return this.slice(Math.max(0,i))},skipLast:function(i){return reify(this,this.toSeq().reverse().skip(i).reverse())},skipWhile:function(i,s){return reify(this,skipWhileFactory(this,i,s,!0))},skipUntil:function(i,s){return this.skipWhile(not(i),s)},sortBy:function(i,s){return reify(this,sortFactory(this,s,i))},take:function(i){return this.slice(0,Math.max(0,i))},takeLast:function(i){return reify(this,this.toSeq().reverse().take(i).reverse())},takeWhile:function(i,s){return reify(this,takeWhileFactory(this,i,s))},takeUntil:function(i,s){return this.takeWhile(not(i),s)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=hashIterable(this))}});var mt=Iterable.prototype;mt[s]=!0,mt[le]=mt.values,mt.__toJS=mt.toArray,mt.__toStringMapper=quoteString,mt.inspect=mt.toSource=function(){return this.toString()},mt.chain=mt.flatMap,mt.contains=mt.includes,mixin(KeyedIterable,{flip:function(){return reify(this,flipFactory(this))},mapEntries:function(i,s){var u=this,m=0;return reify(this,this.toSeq().map((function(v,_){return i.call(s,[_,v],m++,u)})).fromEntrySeq())},mapKeys:function(i,s){var u=this;return reify(this,this.toSeq().flip().map((function(m,v){return i.call(s,m,v,u)})).flip())}});var yt=KeyedIterable.prototype;function keyMapper(i,s){return s}function entryMapper(i,s){return[s,i]}function not(i){return function(){return!i.apply(this,arguments)}}function neg(i){return function(){return-i.apply(this,arguments)}}function quoteString(i){return"string"==typeof i?JSON.stringify(i):String(i)}function defaultZipper(){return arrCopy(arguments)}function defaultNegComparator(i,s){return is?-1:0}function hashIterable(i){if(i.size===1/0)return 0;var s=isOrdered(i),u=isKeyed(i),m=s?1:0;return murmurHashOfSize(i.__iterate(u?s?function(i,s){m=31*m+hashMerge(hash(i),hash(s))|0}:function(i,s){m=m+hashMerge(hash(i),hash(s))|0}:s?function(i){m=31*m+hash(i)|0}:function(i){m=m+hash(i)|0}),m)}function murmurHashOfSize(i,s){return s=be(s,3432918353),s=be(s<<15|s>>>-15,461845907),s=be(s<<13|s>>>-13,5),s=be((s=(s+3864292196|0)^i)^s>>>16,2246822507),s=smi((s=be(s^s>>>13,3266489909))^s>>>16)}function hashMerge(i,s){return i^s+2654435769+(i<<6)+(i>>2)|0}return yt[u]=!0,yt[le]=mt.entries,yt.__toJS=mt.toObject,yt.__toStringMapper=function(i,s){return JSON.stringify(s)+": "+quoteString(i)},mixin(IndexedIterable,{toKeyedSeq:function(){return new ToKeyedSequence(this,!1)},filter:function(i,s){return reify(this,filterFactory(this,i,s,!1))},findIndex:function(i,s){var u=this.findEntry(i,s);return u?u[0]:-1},indexOf:function(i){var s=this.keyOf(i);return void 0===s?-1:s},lastIndexOf:function(i){var s=this.lastKeyOf(i);return void 0===s?-1:s},reverse:function(){return reify(this,reverseFactory(this,!1))},slice:function(i,s){return reify(this,sliceFactory(this,i,s,!1))},splice:function(i,s){var u=arguments.length;if(s=Math.max(0|s,0),0===u||2===u&&!s)return this;i=resolveBegin(i,i<0?this.count():this.size);var m=this.slice(0,i);return reify(this,1===u?m:m.concat(arrCopy(arguments,2),this.slice(i+s)))},findLastIndex:function(i,s){var u=this.findLastEntry(i,s);return u?u[0]:-1},first:function(){return this.get(0)},flatten:function(i){return reify(this,flattenFactory(this,i,!1))},get:function(i,s){return(i=wrapIndex(this,i))<0||this.size===1/0||void 0!==this.size&&i>this.size?s:this.find((function(s,u){return u===i}),void 0,s)},has:function(i){return(i=wrapIndex(this,i))>=0&&(void 0!==this.size?this.size===1/0||i{"function"==typeof Object.create?i.exports=function inherits(i,s){s&&(i.super_=s,i.prototype=Object.create(s.prototype,{constructor:{value:i,enumerable:!1,writable:!0,configurable:!0}}))}:i.exports=function inherits(i,s){if(s){i.super_=s;var TempCtor=function(){};TempCtor.prototype=s.prototype,i.prototype=new TempCtor,i.prototype.constructor=i}}},35823:i=>{i.exports=function(i,s,u,m){var v=new Blob(void 0!==m?[m,i]:[i],{type:u||"application/octet-stream"});if(void 0!==window.navigator.msSaveBlob)window.navigator.msSaveBlob(v,s);else{var _=window.URL&&window.URL.createObjectURL?window.URL.createObjectURL(v):window.webkitURL.createObjectURL(v),j=document.createElement("a");j.style.display="none",j.href=_,j.setAttribute("download",s),void 0===j.download&&j.setAttribute("target","_blank"),document.body.appendChild(j),j.click(),setTimeout((function(){document.body.removeChild(j),window.URL.revokeObjectURL(_)}),200)}}},91296:(i,s,u)=>{var m=NaN,v="[object Symbol]",_=/^\s+|\s+$/g,j=/^[-+]0x[0-9a-f]+$/i,M=/^0b[01]+$/i,$=/^0o[0-7]+$/i,W=parseInt,X="object"==typeof u.g&&u.g&&u.g.Object===Object&&u.g,Y="object"==typeof self&&self&&self.Object===Object&&self,Z=X||Y||Function("return this")(),ee=Object.prototype.toString,ie=Math.max,ae=Math.min,now=function(){return Z.Date.now()};function isObject(i){var s=typeof i;return!!i&&("object"==s||"function"==s)}function toNumber(i){if("number"==typeof i)return i;if(function isSymbol(i){return"symbol"==typeof i||function isObjectLike(i){return!!i&&"object"==typeof i}(i)&&ee.call(i)==v}(i))return m;if(isObject(i)){var s="function"==typeof i.valueOf?i.valueOf():i;i=isObject(s)?s+"":s}if("string"!=typeof i)return 0===i?i:+i;i=i.replace(_,"");var u=M.test(i);return u||$.test(i)?W(i.slice(2),u?2:8):j.test(i)?m:+i}i.exports=function debounce(i,s,u){var m,v,_,j,M,$,W=0,X=!1,Y=!1,Z=!0;if("function"!=typeof i)throw new TypeError("Expected a function");function invokeFunc(s){var u=m,_=v;return m=v=void 0,W=s,j=i.apply(_,u)}function shouldInvoke(i){var u=i-$;return void 0===$||u>=s||u<0||Y&&i-W>=_}function timerExpired(){var i=now();if(shouldInvoke(i))return trailingEdge(i);M=setTimeout(timerExpired,function remainingWait(i){var u=s-(i-$);return Y?ae(u,_-(i-W)):u}(i))}function trailingEdge(i){return M=void 0,Z&&m?invokeFunc(i):(m=v=void 0,j)}function debounced(){var i=now(),u=shouldInvoke(i);if(m=arguments,v=this,$=i,u){if(void 0===M)return function leadingEdge(i){return W=i,M=setTimeout(timerExpired,s),X?invokeFunc(i):j}($);if(Y)return M=setTimeout(timerExpired,s),invokeFunc($)}return void 0===M&&(M=setTimeout(timerExpired,s)),j}return s=toNumber(s)||0,isObject(u)&&(X=!!u.leading,_=(Y="maxWait"in u)?ie(toNumber(u.maxWait)||0,s):_,Z="trailing"in u?!!u.trailing:Z),debounced.cancel=function cancel(){void 0!==M&&clearTimeout(M),W=0,m=$=v=M=void 0},debounced.flush=function flush(){return void 0===M?j:trailingEdge(now())},debounced}},18552:(i,s,u)=>{var m=u(10852)(u(55639),"DataView");i.exports=m},1989:(i,s,u)=>{var m=u(51789),v=u(80401),_=u(57667),j=u(21327),M=u(81866);function Hash(i){var s=-1,u=null==i?0:i.length;for(this.clear();++s{var m=u(3118),v=u(9435);function LazyWrapper(i){this.__wrapped__=i,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}LazyWrapper.prototype=m(v.prototype),LazyWrapper.prototype.constructor=LazyWrapper,i.exports=LazyWrapper},38407:(i,s,u)=>{var m=u(27040),v=u(14125),_=u(82117),j=u(67518),M=u(54705);function ListCache(i){var s=-1,u=null==i?0:i.length;for(this.clear();++s{var m=u(3118),v=u(9435);function LodashWrapper(i,s){this.__wrapped__=i,this.__actions__=[],this.__chain__=!!s,this.__index__=0,this.__values__=void 0}LodashWrapper.prototype=m(v.prototype),LodashWrapper.prototype.constructor=LodashWrapper,i.exports=LodashWrapper},57071:(i,s,u)=>{var m=u(10852)(u(55639),"Map");i.exports=m},83369:(i,s,u)=>{var m=u(24785),v=u(11285),_=u(96e3),j=u(49916),M=u(95265);function MapCache(i){var s=-1,u=null==i?0:i.length;for(this.clear();++s{var m=u(10852)(u(55639),"Promise");i.exports=m},58525:(i,s,u)=>{var m=u(10852)(u(55639),"Set");i.exports=m},88668:(i,s,u)=>{var m=u(83369),v=u(90619),_=u(72385);function SetCache(i){var s=-1,u=null==i?0:i.length;for(this.__data__=new m;++s{var m=u(38407),v=u(37465),_=u(63779),j=u(67599),M=u(44758),$=u(34309);function Stack(i){var s=this.__data__=new m(i);this.size=s.size}Stack.prototype.clear=v,Stack.prototype.delete=_,Stack.prototype.get=j,Stack.prototype.has=M,Stack.prototype.set=$,i.exports=Stack},62705:(i,s,u)=>{var m=u(55639).Symbol;i.exports=m},11149:(i,s,u)=>{var m=u(55639).Uint8Array;i.exports=m},70577:(i,s,u)=>{var m=u(10852)(u(55639),"WeakMap");i.exports=m},96874:i=>{i.exports=function apply(i,s,u){switch(u.length){case 0:return i.call(s);case 1:return i.call(s,u[0]);case 2:return i.call(s,u[0],u[1]);case 3:return i.call(s,u[0],u[1],u[2])}return i.apply(s,u)}},77412:i=>{i.exports=function arrayEach(i,s){for(var u=-1,m=null==i?0:i.length;++u{i.exports=function arrayFilter(i,s){for(var u=-1,m=null==i?0:i.length,v=0,_=[];++u{var m=u(42118);i.exports=function arrayIncludes(i,s){return!!(null==i?0:i.length)&&m(i,s,0)>-1}},14636:(i,s,u)=>{var m=u(22545),v=u(35694),_=u(1469),j=u(44144),M=u(65776),$=u(36719),W=Object.prototype.hasOwnProperty;i.exports=function arrayLikeKeys(i,s){var u=_(i),X=!u&&v(i),Y=!u&&!X&&j(i),Z=!u&&!X&&!Y&&$(i),ee=u||X||Y||Z,ie=ee?m(i.length,String):[],ae=ie.length;for(var ce in i)!s&&!W.call(i,ce)||ee&&("length"==ce||Y&&("offset"==ce||"parent"==ce)||Z&&("buffer"==ce||"byteLength"==ce||"byteOffset"==ce)||M(ce,ae))||ie.push(ce);return ie}},29932:i=>{i.exports=function arrayMap(i,s){for(var u=-1,m=null==i?0:i.length,v=Array(m);++u{i.exports=function arrayPush(i,s){for(var u=-1,m=s.length,v=i.length;++u{i.exports=function arrayReduce(i,s,u,m){var v=-1,_=null==i?0:i.length;for(m&&_&&(u=i[++v]);++v<_;)u=s(u,i[v],v,i);return u}},82908:i=>{i.exports=function arraySome(i,s){for(var u=-1,m=null==i?0:i.length;++u{i.exports=function asciiToArray(i){return i.split("")}},49029:i=>{var s=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;i.exports=function asciiWords(i){return i.match(s)||[]}},86556:(i,s,u)=>{var m=u(89465),v=u(77813);i.exports=function assignMergeValue(i,s,u){(void 0!==u&&!v(i[s],u)||void 0===u&&!(s in i))&&m(i,s,u)}},34865:(i,s,u)=>{var m=u(89465),v=u(77813),_=Object.prototype.hasOwnProperty;i.exports=function assignValue(i,s,u){var j=i[s];_.call(i,s)&&v(j,u)&&(void 0!==u||s in i)||m(i,s,u)}},18470:(i,s,u)=>{var m=u(77813);i.exports=function assocIndexOf(i,s){for(var u=i.length;u--;)if(m(i[u][0],s))return u;return-1}},44037:(i,s,u)=>{var m=u(98363),v=u(3674);i.exports=function baseAssign(i,s){return i&&m(s,v(s),i)}},63886:(i,s,u)=>{var m=u(98363),v=u(81704);i.exports=function baseAssignIn(i,s){return i&&m(s,v(s),i)}},89465:(i,s,u)=>{var m=u(38777);i.exports=function baseAssignValue(i,s,u){"__proto__"==s&&m?m(i,s,{configurable:!0,enumerable:!0,value:u,writable:!0}):i[s]=u}},85990:(i,s,u)=>{var m=u(46384),v=u(77412),_=u(34865),j=u(44037),M=u(63886),$=u(64626),W=u(278),X=u(18805),Y=u(1911),Z=u(58234),ee=u(46904),ie=u(64160),ae=u(43824),ce=u(29148),le=u(38517),pe=u(1469),de=u(44144),fe=u(56688),ye=u(13218),be=u(72928),_e=u(3674),we=u(81704),Se="[object Arguments]",xe="[object Function]",Pe="[object Object]",Ie={};Ie[Se]=Ie["[object Array]"]=Ie["[object ArrayBuffer]"]=Ie["[object DataView]"]=Ie["[object Boolean]"]=Ie["[object Date]"]=Ie["[object Float32Array]"]=Ie["[object Float64Array]"]=Ie["[object Int8Array]"]=Ie["[object Int16Array]"]=Ie["[object Int32Array]"]=Ie["[object Map]"]=Ie["[object Number]"]=Ie[Pe]=Ie["[object RegExp]"]=Ie["[object Set]"]=Ie["[object String]"]=Ie["[object Symbol]"]=Ie["[object Uint8Array]"]=Ie["[object Uint8ClampedArray]"]=Ie["[object Uint16Array]"]=Ie["[object Uint32Array]"]=!0,Ie["[object Error]"]=Ie[xe]=Ie["[object WeakMap]"]=!1,i.exports=function baseClone(i,s,u,Te,Re,qe){var ze,Ve=1&s,We=2&s,He=4&s;if(u&&(ze=Re?u(i,Te,Re,qe):u(i)),void 0!==ze)return ze;if(!ye(i))return i;var Xe=pe(i);if(Xe){if(ze=ae(i),!Ve)return W(i,ze)}else{var Ye=ie(i),Qe=Ye==xe||"[object GeneratorFunction]"==Ye;if(de(i))return $(i,Ve);if(Ye==Pe||Ye==Se||Qe&&!Re){if(ze=We||Qe?{}:le(i),!Ve)return We?Y(i,M(ze,i)):X(i,j(ze,i))}else{if(!Ie[Ye])return Re?i:{};ze=ce(i,Ye,Ve)}}qe||(qe=new m);var et=qe.get(i);if(et)return et;qe.set(i,ze),be(i)?i.forEach((function(m){ze.add(baseClone(m,s,u,m,i,qe))})):fe(i)&&i.forEach((function(m,v){ze.set(v,baseClone(m,s,u,v,i,qe))}));var tt=Xe?void 0:(He?We?ee:Z:We?we:_e)(i);return v(tt||i,(function(m,v){tt&&(m=i[v=m]),_(ze,v,baseClone(m,s,u,v,i,qe))})),ze}},3118:(i,s,u)=>{var m=u(13218),v=Object.create,_=function(){function object(){}return function(i){if(!m(i))return{};if(v)return v(i);object.prototype=i;var s=new object;return object.prototype=void 0,s}}();i.exports=_},89881:(i,s,u)=>{var m=u(47816),v=u(99291)(m);i.exports=v},41848:i=>{i.exports=function baseFindIndex(i,s,u,m){for(var v=i.length,_=u+(m?1:-1);m?_--:++_{var m=u(62488),v=u(37285);i.exports=function baseFlatten(i,s,u,_,j){var M=-1,$=i.length;for(u||(u=v),j||(j=[]);++M<$;){var W=i[M];s>0&&u(W)?s>1?baseFlatten(W,s-1,u,_,j):m(j,W):_||(j[j.length]=W)}return j}},28483:(i,s,u)=>{var m=u(25063)();i.exports=m},47816:(i,s,u)=>{var m=u(28483),v=u(3674);i.exports=function baseForOwn(i,s){return i&&m(i,s,v)}},97786:(i,s,u)=>{var m=u(71811),v=u(40327);i.exports=function baseGet(i,s){for(var u=0,_=(s=m(s,i)).length;null!=i&&u<_;)i=i[v(s[u++])];return u&&u==_?i:void 0}},68866:(i,s,u)=>{var m=u(62488),v=u(1469);i.exports=function baseGetAllKeys(i,s,u){var _=s(i);return v(i)?_:m(_,u(i))}},44239:(i,s,u)=>{var m=u(62705),v=u(89607),_=u(2333),j=m?m.toStringTag:void 0;i.exports=function baseGetTag(i){return null==i?void 0===i?"[object Undefined]":"[object Null]":j&&j in Object(i)?v(i):_(i)}},13:i=>{i.exports=function baseHasIn(i,s){return null!=i&&s in Object(i)}},42118:(i,s,u)=>{var m=u(41848),v=u(62722),_=u(42351);i.exports=function baseIndexOf(i,s,u){return s==s?_(i,s,u):m(i,v,u)}},9454:(i,s,u)=>{var m=u(44239),v=u(37005);i.exports=function baseIsArguments(i){return v(i)&&"[object Arguments]"==m(i)}},90939:(i,s,u)=>{var m=u(2492),v=u(37005);i.exports=function baseIsEqual(i,s,u,_,j){return i===s||(null==i||null==s||!v(i)&&!v(s)?i!=i&&s!=s:m(i,s,u,_,baseIsEqual,j))}},2492:(i,s,u)=>{var m=u(46384),v=u(67114),_=u(18351),j=u(16096),M=u(64160),$=u(1469),W=u(44144),X=u(36719),Y="[object Arguments]",Z="[object Array]",ee="[object Object]",ie=Object.prototype.hasOwnProperty;i.exports=function baseIsEqualDeep(i,s,u,ae,ce,le){var pe=$(i),de=$(s),fe=pe?Z:M(i),ye=de?Z:M(s),be=(fe=fe==Y?ee:fe)==ee,_e=(ye=ye==Y?ee:ye)==ee,we=fe==ye;if(we&&W(i)){if(!W(s))return!1;pe=!0,be=!1}if(we&&!be)return le||(le=new m),pe||X(i)?v(i,s,u,ae,ce,le):_(i,s,fe,u,ae,ce,le);if(!(1&u)){var Se=be&&ie.call(i,"__wrapped__"),xe=_e&&ie.call(s,"__wrapped__");if(Se||xe){var Pe=Se?i.value():i,Ie=xe?s.value():s;return le||(le=new m),ce(Pe,Ie,u,ae,le)}}return!!we&&(le||(le=new m),j(i,s,u,ae,ce,le))}},25588:(i,s,u)=>{var m=u(64160),v=u(37005);i.exports=function baseIsMap(i){return v(i)&&"[object Map]"==m(i)}},2958:(i,s,u)=>{var m=u(46384),v=u(90939);i.exports=function baseIsMatch(i,s,u,_){var j=u.length,M=j,$=!_;if(null==i)return!M;for(i=Object(i);j--;){var W=u[j];if($&&W[2]?W[1]!==i[W[0]]:!(W[0]in i))return!1}for(;++j{i.exports=function baseIsNaN(i){return i!=i}},28458:(i,s,u)=>{var m=u(23560),v=u(15346),_=u(13218),j=u(80346),M=/^\[object .+?Constructor\]$/,$=Function.prototype,W=Object.prototype,X=$.toString,Y=W.hasOwnProperty,Z=RegExp("^"+X.call(Y).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");i.exports=function baseIsNative(i){return!(!_(i)||v(i))&&(m(i)?Z:M).test(j(i))}},29221:(i,s,u)=>{var m=u(64160),v=u(37005);i.exports=function baseIsSet(i){return v(i)&&"[object Set]"==m(i)}},38749:(i,s,u)=>{var m=u(44239),v=u(41780),_=u(37005),j={};j["[object Float32Array]"]=j["[object Float64Array]"]=j["[object Int8Array]"]=j["[object Int16Array]"]=j["[object Int32Array]"]=j["[object Uint8Array]"]=j["[object Uint8ClampedArray]"]=j["[object Uint16Array]"]=j["[object Uint32Array]"]=!0,j["[object Arguments]"]=j["[object Array]"]=j["[object ArrayBuffer]"]=j["[object Boolean]"]=j["[object DataView]"]=j["[object Date]"]=j["[object Error]"]=j["[object Function]"]=j["[object Map]"]=j["[object Number]"]=j["[object Object]"]=j["[object RegExp]"]=j["[object Set]"]=j["[object String]"]=j["[object WeakMap]"]=!1,i.exports=function baseIsTypedArray(i){return _(i)&&v(i.length)&&!!j[m(i)]}},67206:(i,s,u)=>{var m=u(91573),v=u(16432),_=u(6557),j=u(1469),M=u(39601);i.exports=function baseIteratee(i){return"function"==typeof i?i:null==i?_:"object"==typeof i?j(i)?v(i[0],i[1]):m(i):M(i)}},280:(i,s,u)=>{var m=u(25726),v=u(86916),_=Object.prototype.hasOwnProperty;i.exports=function baseKeys(i){if(!m(i))return v(i);var s=[];for(var u in Object(i))_.call(i,u)&&"constructor"!=u&&s.push(u);return s}},10313:(i,s,u)=>{var m=u(13218),v=u(25726),_=u(33498),j=Object.prototype.hasOwnProperty;i.exports=function baseKeysIn(i){if(!m(i))return _(i);var s=v(i),u=[];for(var M in i)("constructor"!=M||!s&&j.call(i,M))&&u.push(M);return u}},9435:i=>{i.exports=function baseLodash(){}},91573:(i,s,u)=>{var m=u(2958),v=u(1499),_=u(42634);i.exports=function baseMatches(i){var s=v(i);return 1==s.length&&s[0][2]?_(s[0][0],s[0][1]):function(u){return u===i||m(u,i,s)}}},16432:(i,s,u)=>{var m=u(90939),v=u(27361),_=u(79095),j=u(15403),M=u(89162),$=u(42634),W=u(40327);i.exports=function baseMatchesProperty(i,s){return j(i)&&M(s)?$(W(i),s):function(u){var j=v(u,i);return void 0===j&&j===s?_(u,i):m(s,j,3)}}},42980:(i,s,u)=>{var m=u(46384),v=u(86556),_=u(28483),j=u(59783),M=u(13218),$=u(81704),W=u(36390);i.exports=function baseMerge(i,s,u,X,Y){i!==s&&_(s,(function(_,$){if(Y||(Y=new m),M(_))j(i,s,$,u,baseMerge,X,Y);else{var Z=X?X(W(i,$),_,$+"",i,s,Y):void 0;void 0===Z&&(Z=_),v(i,$,Z)}}),$)}},59783:(i,s,u)=>{var m=u(86556),v=u(64626),_=u(77133),j=u(278),M=u(38517),$=u(35694),W=u(1469),X=u(29246),Y=u(44144),Z=u(23560),ee=u(13218),ie=u(68630),ae=u(36719),ce=u(36390),le=u(59881);i.exports=function baseMergeDeep(i,s,u,pe,de,fe,ye){var be=ce(i,u),_e=ce(s,u),we=ye.get(_e);if(we)m(i,u,we);else{var Se=fe?fe(be,_e,u+"",i,s,ye):void 0,xe=void 0===Se;if(xe){var Pe=W(_e),Ie=!Pe&&Y(_e),Te=!Pe&&!Ie&&ae(_e);Se=_e,Pe||Ie||Te?W(be)?Se=be:X(be)?Se=j(be):Ie?(xe=!1,Se=v(_e,!0)):Te?(xe=!1,Se=_(_e,!0)):Se=[]:ie(_e)||$(_e)?(Se=be,$(be)?Se=le(be):ee(be)&&!Z(be)||(Se=M(_e))):xe=!1}xe&&(ye.set(_e,Se),de(Se,_e,pe,fe,ye),ye.delete(_e)),m(i,u,Se)}}},40371:i=>{i.exports=function baseProperty(i){return function(s){return null==s?void 0:s[i]}}},79152:(i,s,u)=>{var m=u(97786);i.exports=function basePropertyDeep(i){return function(s){return m(s,i)}}},18674:i=>{i.exports=function basePropertyOf(i){return function(s){return null==i?void 0:i[s]}}},10107:i=>{i.exports=function baseReduce(i,s,u,m,v){return v(i,(function(i,v,_){u=m?(m=!1,i):s(u,i,v,_)})),u}},5976:(i,s,u)=>{var m=u(6557),v=u(45357),_=u(30061);i.exports=function baseRest(i,s){return _(v(i,s,m),i+"")}},10611:(i,s,u)=>{var m=u(34865),v=u(71811),_=u(65776),j=u(13218),M=u(40327);i.exports=function baseSet(i,s,u,$){if(!j(i))return i;for(var W=-1,X=(s=v(s,i)).length,Y=X-1,Z=i;null!=Z&&++W{var m=u(6557),v=u(89250),_=v?function(i,s){return v.set(i,s),i}:m;i.exports=_},56560:(i,s,u)=>{var m=u(75703),v=u(38777),_=u(6557),j=v?function(i,s){return v(i,"toString",{configurable:!0,enumerable:!1,value:m(s),writable:!0})}:_;i.exports=j},14259:i=>{i.exports=function baseSlice(i,s,u){var m=-1,v=i.length;s<0&&(s=-s>v?0:v+s),(u=u>v?v:u)<0&&(u+=v),v=s>u?0:u-s>>>0,s>>>=0;for(var _=Array(v);++m{var m=u(89881);i.exports=function baseSome(i,s){var u;return m(i,(function(i,m,v){return!(u=s(i,m,v))})),!!u}},22545:i=>{i.exports=function baseTimes(i,s){for(var u=-1,m=Array(i);++u{var m=u(62705),v=u(29932),_=u(1469),j=u(33448),M=m?m.prototype:void 0,$=M?M.toString:void 0;i.exports=function baseToString(i){if("string"==typeof i)return i;if(_(i))return v(i,baseToString)+"";if(j(i))return $?$.call(i):"";var s=i+"";return"0"==s&&1/i==-Infinity?"-0":s}},27561:(i,s,u)=>{var m=u(67990),v=/^\s+/;i.exports=function baseTrim(i){return i?i.slice(0,m(i)+1).replace(v,""):i}},7518:i=>{i.exports=function baseUnary(i){return function(s){return i(s)}}},57406:(i,s,u)=>{var m=u(71811),v=u(10928),_=u(40292),j=u(40327);i.exports=function baseUnset(i,s){return s=m(s,i),null==(i=_(i,s))||delete i[j(v(s))]}},1757:i=>{i.exports=function baseZipObject(i,s,u){for(var m=-1,v=i.length,_=s.length,j={};++m{i.exports=function cacheHas(i,s){return i.has(s)}},71811:(i,s,u)=>{var m=u(1469),v=u(15403),_=u(55514),j=u(79833);i.exports=function castPath(i,s){return m(i)?i:v(i,s)?[i]:_(j(i))}},40180:(i,s,u)=>{var m=u(14259);i.exports=function castSlice(i,s,u){var v=i.length;return u=void 0===u?v:u,!s&&u>=v?i:m(i,s,u)}},74318:(i,s,u)=>{var m=u(11149);i.exports=function cloneArrayBuffer(i){var s=new i.constructor(i.byteLength);return new m(s).set(new m(i)),s}},64626:(i,s,u)=>{i=u.nmd(i);var m=u(55639),v=s&&!s.nodeType&&s,_=v&&i&&!i.nodeType&&i,j=_&&_.exports===v?m.Buffer:void 0,M=j?j.allocUnsafe:void 0;i.exports=function cloneBuffer(i,s){if(s)return i.slice();var u=i.length,m=M?M(u):new i.constructor(u);return i.copy(m),m}},57157:(i,s,u)=>{var m=u(74318);i.exports=function cloneDataView(i,s){var u=s?m(i.buffer):i.buffer;return new i.constructor(u,i.byteOffset,i.byteLength)}},93147:i=>{var s=/\w*$/;i.exports=function cloneRegExp(i){var u=new i.constructor(i.source,s.exec(i));return u.lastIndex=i.lastIndex,u}},40419:(i,s,u)=>{var m=u(62705),v=m?m.prototype:void 0,_=v?v.valueOf:void 0;i.exports=function cloneSymbol(i){return _?Object(_.call(i)):{}}},77133:(i,s,u)=>{var m=u(74318);i.exports=function cloneTypedArray(i,s){var u=s?m(i.buffer):i.buffer;return new i.constructor(u,i.byteOffset,i.length)}},52157:i=>{var s=Math.max;i.exports=function composeArgs(i,u,m,v){for(var _=-1,j=i.length,M=m.length,$=-1,W=u.length,X=s(j-M,0),Y=Array(W+X),Z=!v;++${var s=Math.max;i.exports=function composeArgsRight(i,u,m,v){for(var _=-1,j=i.length,M=-1,$=m.length,W=-1,X=u.length,Y=s(j-$,0),Z=Array(Y+X),ee=!v;++_{i.exports=function copyArray(i,s){var u=-1,m=i.length;for(s||(s=Array(m));++u{var m=u(34865),v=u(89465);i.exports=function copyObject(i,s,u,_){var j=!u;u||(u={});for(var M=-1,$=s.length;++M<$;){var W=s[M],X=_?_(u[W],i[W],W,u,i):void 0;void 0===X&&(X=i[W]),j?v(u,W,X):m(u,W,X)}return u}},18805:(i,s,u)=>{var m=u(98363),v=u(99551);i.exports=function copySymbols(i,s){return m(i,v(i),s)}},1911:(i,s,u)=>{var m=u(98363),v=u(51442);i.exports=function copySymbolsIn(i,s){return m(i,v(i),s)}},14429:(i,s,u)=>{var m=u(55639)["__core-js_shared__"];i.exports=m},97991:i=>{i.exports=function countHolders(i,s){for(var u=i.length,m=0;u--;)i[u]===s&&++m;return m}},21463:(i,s,u)=>{var m=u(5976),v=u(16612);i.exports=function createAssigner(i){return m((function(s,u){var m=-1,_=u.length,j=_>1?u[_-1]:void 0,M=_>2?u[2]:void 0;for(j=i.length>3&&"function"==typeof j?(_--,j):void 0,M&&v(u[0],u[1],M)&&(j=_<3?void 0:j,_=1),s=Object(s);++m<_;){var $=u[m];$&&i(s,$,m,j)}return s}))}},99291:(i,s,u)=>{var m=u(98612);i.exports=function createBaseEach(i,s){return function(u,v){if(null==u)return u;if(!m(u))return i(u,v);for(var _=u.length,j=s?_:-1,M=Object(u);(s?j--:++j<_)&&!1!==v(M[j],j,M););return u}}},25063:i=>{i.exports=function createBaseFor(i){return function(s,u,m){for(var v=-1,_=Object(s),j=m(s),M=j.length;M--;){var $=j[i?M:++v];if(!1===u(_[$],$,_))break}return s}}},22402:(i,s,u)=>{var m=u(71774),v=u(55639);i.exports=function createBind(i,s,u){var _=1&s,j=m(i);return function wrapper(){return(this&&this!==v&&this instanceof wrapper?j:i).apply(_?u:this,arguments)}}},98805:(i,s,u)=>{var m=u(40180),v=u(62689),_=u(83140),j=u(79833);i.exports=function createCaseFirst(i){return function(s){s=j(s);var u=v(s)?_(s):void 0,M=u?u[0]:s.charAt(0),$=u?m(u,1).join(""):s.slice(1);return M[i]()+$}}},35393:(i,s,u)=>{var m=u(62663),v=u(53816),_=u(58748),j=RegExp("['’]","g");i.exports=function createCompounder(i){return function(s){return m(_(v(s).replace(j,"")),i,"")}}},71774:(i,s,u)=>{var m=u(3118),v=u(13218);i.exports=function createCtor(i){return function(){var s=arguments;switch(s.length){case 0:return new i;case 1:return new i(s[0]);case 2:return new i(s[0],s[1]);case 3:return new i(s[0],s[1],s[2]);case 4:return new i(s[0],s[1],s[2],s[3]);case 5:return new i(s[0],s[1],s[2],s[3],s[4]);case 6:return new i(s[0],s[1],s[2],s[3],s[4],s[5]);case 7:return new i(s[0],s[1],s[2],s[3],s[4],s[5],s[6])}var u=m(i.prototype),_=i.apply(u,s);return v(_)?_:u}}},46347:(i,s,u)=>{var m=u(96874),v=u(71774),_=u(86935),j=u(94487),M=u(20893),$=u(46460),W=u(55639);i.exports=function createCurry(i,s,u){var X=v(i);return function wrapper(){for(var v=arguments.length,Y=Array(v),Z=v,ee=M(wrapper);Z--;)Y[Z]=arguments[Z];var ie=v<3&&Y[0]!==ee&&Y[v-1]!==ee?[]:$(Y,ee);return(v-=ie.length){var m=u(67206),v=u(98612),_=u(3674);i.exports=function createFind(i){return function(s,u,j){var M=Object(s);if(!v(s)){var $=m(u,3);s=_(s),u=function(i){return $(M[i],i,M)}}var W=i(s,u,j);return W>-1?M[$?s[W]:W]:void 0}}},86935:(i,s,u)=>{var m=u(52157),v=u(14054),_=u(97991),j=u(71774),M=u(94487),$=u(20893),W=u(90451),X=u(46460),Y=u(55639);i.exports=function createHybrid(i,s,u,Z,ee,ie,ae,ce,le,pe){var de=128&s,fe=1&s,ye=2&s,be=24&s,_e=512&s,we=ye?void 0:j(i);return function wrapper(){for(var Se=arguments.length,xe=Array(Se),Pe=Se;Pe--;)xe[Pe]=arguments[Pe];if(be)var Ie=$(wrapper),Te=_(xe,Ie);if(Z&&(xe=m(xe,Z,ee,be)),ie&&(xe=v(xe,ie,ae,be)),Se-=Te,be&&Se1&&xe.reverse(),de&&le{var m=u(96874),v=u(71774),_=u(55639);i.exports=function createPartial(i,s,u,j){var M=1&s,$=v(i);return function wrapper(){for(var s=-1,v=arguments.length,W=-1,X=j.length,Y=Array(X+v),Z=this&&this!==_&&this instanceof wrapper?$:i;++W{var m=u(86528),v=u(258),_=u(69255);i.exports=function createRecurry(i,s,u,j,M,$,W,X,Y,Z){var ee=8&s;s|=ee?32:64,4&(s&=~(ee?64:32))||(s&=-4);var ie=[i,s,M,ee?$:void 0,ee?W:void 0,ee?void 0:$,ee?void 0:W,X,Y,Z],ae=u.apply(void 0,ie);return m(i)&&v(ae,ie),ae.placeholder=j,_(ae,i,s)}},97727:(i,s,u)=>{var m=u(28045),v=u(22402),_=u(46347),j=u(86935),M=u(84375),$=u(66833),W=u(63833),X=u(258),Y=u(69255),Z=u(40554),ee=Math.max;i.exports=function createWrap(i,s,u,ie,ae,ce,le,pe){var de=2&s;if(!de&&"function"!=typeof i)throw new TypeError("Expected a function");var fe=ie?ie.length:0;if(fe||(s&=-97,ie=ae=void 0),le=void 0===le?le:ee(Z(le),0),pe=void 0===pe?pe:Z(pe),fe-=ae?ae.length:0,64&s){var ye=ie,be=ae;ie=ae=void 0}var _e=de?void 0:$(i),we=[i,s,u,ie,ae,ye,be,ce,le,pe];if(_e&&W(we,_e),i=we[0],s=we[1],u=we[2],ie=we[3],ae=we[4],!(pe=we[9]=void 0===we[9]?de?0:i.length:ee(we[9]-fe,0))&&24&s&&(s&=-25),s&&1!=s)Se=8==s||16==s?_(i,s,pe):32!=s&&33!=s||ae.length?j.apply(void 0,we):M(i,s,u,ie);else var Se=v(i,s,u);return Y((_e?m:X)(Se,we),i,s)}},60696:(i,s,u)=>{var m=u(68630);i.exports=function customOmitClone(i){return m(i)?void 0:i}},69389:(i,s,u)=>{var m=u(18674)({À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"});i.exports=m},38777:(i,s,u)=>{var m=u(10852),v=function(){try{var i=m(Object,"defineProperty");return i({},"",{}),i}catch(i){}}();i.exports=v},67114:(i,s,u)=>{var m=u(88668),v=u(82908),_=u(74757);i.exports=function equalArrays(i,s,u,j,M,$){var W=1&u,X=i.length,Y=s.length;if(X!=Y&&!(W&&Y>X))return!1;var Z=$.get(i),ee=$.get(s);if(Z&&ee)return Z==s&&ee==i;var ie=-1,ae=!0,ce=2&u?new m:void 0;for($.set(i,s),$.set(s,i);++ie{var m=u(62705),v=u(11149),_=u(77813),j=u(67114),M=u(68776),$=u(21814),W=m?m.prototype:void 0,X=W?W.valueOf:void 0;i.exports=function equalByTag(i,s,u,m,W,Y,Z){switch(u){case"[object DataView]":if(i.byteLength!=s.byteLength||i.byteOffset!=s.byteOffset)return!1;i=i.buffer,s=s.buffer;case"[object ArrayBuffer]":return!(i.byteLength!=s.byteLength||!Y(new v(i),new v(s)));case"[object Boolean]":case"[object Date]":case"[object Number]":return _(+i,+s);case"[object Error]":return i.name==s.name&&i.message==s.message;case"[object RegExp]":case"[object String]":return i==s+"";case"[object Map]":var ee=M;case"[object Set]":var ie=1&m;if(ee||(ee=$),i.size!=s.size&&!ie)return!1;var ae=Z.get(i);if(ae)return ae==s;m|=2,Z.set(i,s);var ce=j(ee(i),ee(s),m,W,Y,Z);return Z.delete(i),ce;case"[object Symbol]":if(X)return X.call(i)==X.call(s)}return!1}},16096:(i,s,u)=>{var m=u(58234),v=Object.prototype.hasOwnProperty;i.exports=function equalObjects(i,s,u,_,j,M){var $=1&u,W=m(i),X=W.length;if(X!=m(s).length&&!$)return!1;for(var Y=X;Y--;){var Z=W[Y];if(!($?Z in s:v.call(s,Z)))return!1}var ee=M.get(i),ie=M.get(s);if(ee&&ie)return ee==s&&ie==i;var ae=!0;M.set(i,s),M.set(s,i);for(var ce=$;++Y{var m=u(85564),v=u(45357),_=u(30061);i.exports=function flatRest(i){return _(v(i,void 0,m),i+"")}},31957:(i,s,u)=>{var m="object"==typeof u.g&&u.g&&u.g.Object===Object&&u.g;i.exports=m},58234:(i,s,u)=>{var m=u(68866),v=u(99551),_=u(3674);i.exports=function getAllKeys(i){return m(i,_,v)}},46904:(i,s,u)=>{var m=u(68866),v=u(51442),_=u(81704);i.exports=function getAllKeysIn(i){return m(i,_,v)}},66833:(i,s,u)=>{var m=u(89250),v=u(50308),_=m?function(i){return m.get(i)}:v;i.exports=_},97658:(i,s,u)=>{var m=u(52060),v=Object.prototype.hasOwnProperty;i.exports=function getFuncName(i){for(var s=i.name+"",u=m[s],_=v.call(m,s)?u.length:0;_--;){var j=u[_],M=j.func;if(null==M||M==i)return j.name}return s}},20893:i=>{i.exports=function getHolder(i){return i.placeholder}},45050:(i,s,u)=>{var m=u(37019);i.exports=function getMapData(i,s){var u=i.__data__;return m(s)?u["string"==typeof s?"string":"hash"]:u.map}},1499:(i,s,u)=>{var m=u(89162),v=u(3674);i.exports=function getMatchData(i){for(var s=v(i),u=s.length;u--;){var _=s[u],j=i[_];s[u]=[_,j,m(j)]}return s}},10852:(i,s,u)=>{var m=u(28458),v=u(47801);i.exports=function getNative(i,s){var u=v(i,s);return m(u)?u:void 0}},85924:(i,s,u)=>{var m=u(5569)(Object.getPrototypeOf,Object);i.exports=m},89607:(i,s,u)=>{var m=u(62705),v=Object.prototype,_=v.hasOwnProperty,j=v.toString,M=m?m.toStringTag:void 0;i.exports=function getRawTag(i){var s=_.call(i,M),u=i[M];try{i[M]=void 0;var m=!0}catch(i){}var v=j.call(i);return m&&(s?i[M]=u:delete i[M]),v}},99551:(i,s,u)=>{var m=u(34963),v=u(70479),_=Object.prototype.propertyIsEnumerable,j=Object.getOwnPropertySymbols,M=j?function(i){return null==i?[]:(i=Object(i),m(j(i),(function(s){return _.call(i,s)})))}:v;i.exports=M},51442:(i,s,u)=>{var m=u(62488),v=u(85924),_=u(99551),j=u(70479),M=Object.getOwnPropertySymbols?function(i){for(var s=[];i;)m(s,_(i)),i=v(i);return s}:j;i.exports=M},64160:(i,s,u)=>{var m=u(18552),v=u(57071),_=u(53818),j=u(58525),M=u(70577),$=u(44239),W=u(80346),X="[object Map]",Y="[object Promise]",Z="[object Set]",ee="[object WeakMap]",ie="[object DataView]",ae=W(m),ce=W(v),le=W(_),pe=W(j),de=W(M),fe=$;(m&&fe(new m(new ArrayBuffer(1)))!=ie||v&&fe(new v)!=X||_&&fe(_.resolve())!=Y||j&&fe(new j)!=Z||M&&fe(new M)!=ee)&&(fe=function(i){var s=$(i),u="[object Object]"==s?i.constructor:void 0,m=u?W(u):"";if(m)switch(m){case ae:return ie;case ce:return X;case le:return Y;case pe:return Z;case de:return ee}return s}),i.exports=fe},47801:i=>{i.exports=function getValue(i,s){return null==i?void 0:i[s]}},58775:i=>{var s=/\{\n\/\* \[wrapped with (.+)\] \*/,u=/,? & /;i.exports=function getWrapDetails(i){var m=i.match(s);return m?m[1].split(u):[]}},222:(i,s,u)=>{var m=u(71811),v=u(35694),_=u(1469),j=u(65776),M=u(41780),$=u(40327);i.exports=function hasPath(i,s,u){for(var W=-1,X=(s=m(s,i)).length,Y=!1;++W{var s=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");i.exports=function hasUnicode(i){return s.test(i)}},93157:i=>{var s=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;i.exports=function hasUnicodeWord(i){return s.test(i)}},51789:(i,s,u)=>{var m=u(94536);i.exports=function hashClear(){this.__data__=m?m(null):{},this.size=0}},80401:i=>{i.exports=function hashDelete(i){var s=this.has(i)&&delete this.__data__[i];return this.size-=s?1:0,s}},57667:(i,s,u)=>{var m=u(94536),v=Object.prototype.hasOwnProperty;i.exports=function hashGet(i){var s=this.__data__;if(m){var u=s[i];return"__lodash_hash_undefined__"===u?void 0:u}return v.call(s,i)?s[i]:void 0}},21327:(i,s,u)=>{var m=u(94536),v=Object.prototype.hasOwnProperty;i.exports=function hashHas(i){var s=this.__data__;return m?void 0!==s[i]:v.call(s,i)}},81866:(i,s,u)=>{var m=u(94536);i.exports=function hashSet(i,s){var u=this.__data__;return this.size+=this.has(i)?0:1,u[i]=m&&void 0===s?"__lodash_hash_undefined__":s,this}},43824:i=>{var s=Object.prototype.hasOwnProperty;i.exports=function initCloneArray(i){var u=i.length,m=new i.constructor(u);return u&&"string"==typeof i[0]&&s.call(i,"index")&&(m.index=i.index,m.input=i.input),m}},29148:(i,s,u)=>{var m=u(74318),v=u(57157),_=u(93147),j=u(40419),M=u(77133);i.exports=function initCloneByTag(i,s,u){var $=i.constructor;switch(s){case"[object ArrayBuffer]":return m(i);case"[object Boolean]":case"[object Date]":return new $(+i);case"[object DataView]":return v(i,u);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return M(i,u);case"[object Map]":case"[object Set]":return new $;case"[object Number]":case"[object String]":return new $(i);case"[object RegExp]":return _(i);case"[object Symbol]":return j(i)}}},38517:(i,s,u)=>{var m=u(3118),v=u(85924),_=u(25726);i.exports=function initCloneObject(i){return"function"!=typeof i.constructor||_(i)?{}:m(v(i))}},83112:i=>{var s=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;i.exports=function insertWrapDetails(i,u){var m=u.length;if(!m)return i;var v=m-1;return u[v]=(m>1?"& ":"")+u[v],u=u.join(m>2?", ":" "),i.replace(s,"{\n/* [wrapped with "+u+"] */\n")}},37285:(i,s,u)=>{var m=u(62705),v=u(35694),_=u(1469),j=m?m.isConcatSpreadable:void 0;i.exports=function isFlattenable(i){return _(i)||v(i)||!!(j&&i&&i[j])}},65776:i=>{var s=/^(?:0|[1-9]\d*)$/;i.exports=function isIndex(i,u){var m=typeof i;return!!(u=null==u?9007199254740991:u)&&("number"==m||"symbol"!=m&&s.test(i))&&i>-1&&i%1==0&&i{var m=u(77813),v=u(98612),_=u(65776),j=u(13218);i.exports=function isIterateeCall(i,s,u){if(!j(u))return!1;var M=typeof s;return!!("number"==M?v(u)&&_(s,u.length):"string"==M&&s in u)&&m(u[s],i)}},15403:(i,s,u)=>{var m=u(1469),v=u(33448),_=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,j=/^\w*$/;i.exports=function isKey(i,s){if(m(i))return!1;var u=typeof i;return!("number"!=u&&"symbol"!=u&&"boolean"!=u&&null!=i&&!v(i))||(j.test(i)||!_.test(i)||null!=s&&i in Object(s))}},37019:i=>{i.exports=function isKeyable(i){var s=typeof i;return"string"==s||"number"==s||"symbol"==s||"boolean"==s?"__proto__"!==i:null===i}},86528:(i,s,u)=>{var m=u(96425),v=u(66833),_=u(97658),j=u(8111);i.exports=function isLaziable(i){var s=_(i),u=j[s];if("function"!=typeof u||!(s in m.prototype))return!1;if(i===u)return!0;var M=v(u);return!!M&&i===M[0]}},15346:(i,s,u)=>{var m,v=u(14429),_=(m=/[^.]+$/.exec(v&&v.keys&&v.keys.IE_PROTO||""))?"Symbol(src)_1."+m:"";i.exports=function isMasked(i){return!!_&&_ in i}},25726:i=>{var s=Object.prototype;i.exports=function isPrototype(i){var u=i&&i.constructor;return i===("function"==typeof u&&u.prototype||s)}},89162:(i,s,u)=>{var m=u(13218);i.exports=function isStrictComparable(i){return i==i&&!m(i)}},27040:i=>{i.exports=function listCacheClear(){this.__data__=[],this.size=0}},14125:(i,s,u)=>{var m=u(18470),v=Array.prototype.splice;i.exports=function listCacheDelete(i){var s=this.__data__,u=m(s,i);return!(u<0)&&(u==s.length-1?s.pop():v.call(s,u,1),--this.size,!0)}},82117:(i,s,u)=>{var m=u(18470);i.exports=function listCacheGet(i){var s=this.__data__,u=m(s,i);return u<0?void 0:s[u][1]}},67518:(i,s,u)=>{var m=u(18470);i.exports=function listCacheHas(i){return m(this.__data__,i)>-1}},54705:(i,s,u)=>{var m=u(18470);i.exports=function listCacheSet(i,s){var u=this.__data__,v=m(u,i);return v<0?(++this.size,u.push([i,s])):u[v][1]=s,this}},24785:(i,s,u)=>{var m=u(1989),v=u(38407),_=u(57071);i.exports=function mapCacheClear(){this.size=0,this.__data__={hash:new m,map:new(_||v),string:new m}}},11285:(i,s,u)=>{var m=u(45050);i.exports=function mapCacheDelete(i){var s=m(this,i).delete(i);return this.size-=s?1:0,s}},96e3:(i,s,u)=>{var m=u(45050);i.exports=function mapCacheGet(i){return m(this,i).get(i)}},49916:(i,s,u)=>{var m=u(45050);i.exports=function mapCacheHas(i){return m(this,i).has(i)}},95265:(i,s,u)=>{var m=u(45050);i.exports=function mapCacheSet(i,s){var u=m(this,i),v=u.size;return u.set(i,s),this.size+=u.size==v?0:1,this}},68776:i=>{i.exports=function mapToArray(i){var s=-1,u=Array(i.size);return i.forEach((function(i,m){u[++s]=[m,i]})),u}},42634:i=>{i.exports=function matchesStrictComparable(i,s){return function(u){return null!=u&&(u[i]===s&&(void 0!==s||i in Object(u)))}}},24523:(i,s,u)=>{var m=u(88306);i.exports=function memoizeCapped(i){var s=m(i,(function(i){return 500===u.size&&u.clear(),i})),u=s.cache;return s}},63833:(i,s,u)=>{var m=u(52157),v=u(14054),_=u(46460),j="__lodash_placeholder__",M=128,$=Math.min;i.exports=function mergeData(i,s){var u=i[1],W=s[1],X=u|W,Y=X<131,Z=W==M&&8==u||W==M&&256==u&&i[7].length<=s[8]||384==W&&s[7].length<=s[8]&&8==u;if(!Y&&!Z)return i;1&W&&(i[2]=s[2],X|=1&u?0:4);var ee=s[3];if(ee){var ie=i[3];i[3]=ie?m(ie,ee,s[4]):ee,i[4]=ie?_(i[3],j):s[4]}return(ee=s[5])&&(ie=i[5],i[5]=ie?v(ie,ee,s[6]):ee,i[6]=ie?_(i[5],j):s[6]),(ee=s[7])&&(i[7]=ee),W&M&&(i[8]=null==i[8]?s[8]:$(i[8],s[8])),null==i[9]&&(i[9]=s[9]),i[0]=s[0],i[1]=X,i}},89250:(i,s,u)=>{var m=u(70577),v=m&&new m;i.exports=v},94536:(i,s,u)=>{var m=u(10852)(Object,"create");i.exports=m},86916:(i,s,u)=>{var m=u(5569)(Object.keys,Object);i.exports=m},33498:i=>{i.exports=function nativeKeysIn(i){var s=[];if(null!=i)for(var u in Object(i))s.push(u);return s}},31167:(i,s,u)=>{i=u.nmd(i);var m=u(31957),v=s&&!s.nodeType&&s,_=v&&i&&!i.nodeType&&i,j=_&&_.exports===v&&m.process,M=function(){try{var i=_&&_.require&&_.require("util").types;return i||j&&j.binding&&j.binding("util")}catch(i){}}();i.exports=M},2333:i=>{var s=Object.prototype.toString;i.exports=function objectToString(i){return s.call(i)}},5569:i=>{i.exports=function overArg(i,s){return function(u){return i(s(u))}}},45357:(i,s,u)=>{var m=u(96874),v=Math.max;i.exports=function overRest(i,s,u){return s=v(void 0===s?i.length-1:s,0),function(){for(var _=arguments,j=-1,M=v(_.length-s,0),$=Array(M);++j{var m=u(97786),v=u(14259);i.exports=function parent(i,s){return s.length<2?i:m(i,v(s,0,-1))}},52060:i=>{i.exports={}},90451:(i,s,u)=>{var m=u(278),v=u(65776),_=Math.min;i.exports=function reorder(i,s){for(var u=i.length,j=_(s.length,u),M=m(i);j--;){var $=s[j];i[j]=v($,u)?M[$]:void 0}return i}},46460:i=>{var s="__lodash_placeholder__";i.exports=function replaceHolders(i,u){for(var m=-1,v=i.length,_=0,j=[];++m{var m=u(31957),v="object"==typeof self&&self&&self.Object===Object&&self,_=m||v||Function("return this")();i.exports=_},36390:i=>{i.exports=function safeGet(i,s){if(("constructor"!==s||"function"!=typeof i[s])&&"__proto__"!=s)return i[s]}},90619:i=>{i.exports=function setCacheAdd(i){return this.__data__.set(i,"__lodash_hash_undefined__"),this}},72385:i=>{i.exports=function setCacheHas(i){return this.__data__.has(i)}},258:(i,s,u)=>{var m=u(28045),v=u(21275)(m);i.exports=v},21814:i=>{i.exports=function setToArray(i){var s=-1,u=Array(i.size);return i.forEach((function(i){u[++s]=i})),u}},30061:(i,s,u)=>{var m=u(56560),v=u(21275)(m);i.exports=v},69255:(i,s,u)=>{var m=u(58775),v=u(83112),_=u(30061),j=u(87241);i.exports=function setWrapToString(i,s,u){var M=s+"";return _(i,v(M,j(m(M),u)))}},21275:i=>{var s=Date.now;i.exports=function shortOut(i){var u=0,m=0;return function(){var v=s(),_=16-(v-m);if(m=v,_>0){if(++u>=800)return arguments[0]}else u=0;return i.apply(void 0,arguments)}}},37465:(i,s,u)=>{var m=u(38407);i.exports=function stackClear(){this.__data__=new m,this.size=0}},63779:i=>{i.exports=function stackDelete(i){var s=this.__data__,u=s.delete(i);return this.size=s.size,u}},67599:i=>{i.exports=function stackGet(i){return this.__data__.get(i)}},44758:i=>{i.exports=function stackHas(i){return this.__data__.has(i)}},34309:(i,s,u)=>{var m=u(38407),v=u(57071),_=u(83369);i.exports=function stackSet(i,s){var u=this.__data__;if(u instanceof m){var j=u.__data__;if(!v||j.length<199)return j.push([i,s]),this.size=++u.size,this;u=this.__data__=new _(j)}return u.set(i,s),this.size=u.size,this}},42351:i=>{i.exports=function strictIndexOf(i,s,u){for(var m=u-1,v=i.length;++m{var m=u(44286),v=u(62689),_=u(676);i.exports=function stringToArray(i){return v(i)?_(i):m(i)}},55514:(i,s,u)=>{var m=u(24523),v=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,_=/\\(\\)?/g,j=m((function(i){var s=[];return 46===i.charCodeAt(0)&&s.push(""),i.replace(v,(function(i,u,m,v){s.push(m?v.replace(_,"$1"):u||i)})),s}));i.exports=j},40327:(i,s,u)=>{var m=u(33448);i.exports=function toKey(i){if("string"==typeof i||m(i))return i;var s=i+"";return"0"==s&&1/i==-Infinity?"-0":s}},80346:i=>{var s=Function.prototype.toString;i.exports=function toSource(i){if(null!=i){try{return s.call(i)}catch(i){}try{return i+""}catch(i){}}return""}},67990:i=>{var s=/\s/;i.exports=function trimmedEndIndex(i){for(var u=i.length;u--&&s.test(i.charAt(u)););return u}},676:i=>{var s="\\ud800-\\udfff",u="["+s+"]",m="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",v="\\ud83c[\\udffb-\\udfff]",_="[^"+s+"]",j="(?:\\ud83c[\\udde6-\\uddff]){2}",M="[\\ud800-\\udbff][\\udc00-\\udfff]",$="(?:"+m+"|"+v+")"+"?",W="[\\ufe0e\\ufe0f]?",X=W+$+("(?:\\u200d(?:"+[_,j,M].join("|")+")"+W+$+")*"),Y="(?:"+[_+m+"?",m,j,M,u].join("|")+")",Z=RegExp(v+"(?="+v+")|"+Y+X,"g");i.exports=function unicodeToArray(i){return i.match(Z)||[]}},2757:i=>{var s="\\ud800-\\udfff",u="\\u2700-\\u27bf",m="a-z\\xdf-\\xf6\\xf8-\\xff",v="A-Z\\xc0-\\xd6\\xd8-\\xde",_="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",j="["+_+"]",M="\\d+",$="["+u+"]",W="["+m+"]",X="[^"+s+_+M+u+m+v+"]",Y="(?:\\ud83c[\\udde6-\\uddff]){2}",Z="[\\ud800-\\udbff][\\udc00-\\udfff]",ee="["+v+"]",ie="(?:"+W+"|"+X+")",ae="(?:"+ee+"|"+X+")",ce="(?:['’](?:d|ll|m|re|s|t|ve))?",le="(?:['’](?:D|LL|M|RE|S|T|VE))?",pe="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",de="[\\ufe0e\\ufe0f]?",fe=de+pe+("(?:\\u200d(?:"+["[^"+s+"]",Y,Z].join("|")+")"+de+pe+")*"),ye="(?:"+[$,Y,Z].join("|")+")"+fe,be=RegExp([ee+"?"+W+"+"+ce+"(?="+[j,ee,"$"].join("|")+")",ae+"+"+le+"(?="+[j,ee+ie,"$"].join("|")+")",ee+"?"+ie+"+"+ce,ee+"+"+le,"\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",M,ye].join("|"),"g");i.exports=function unicodeWords(i){return i.match(be)||[]}},87241:(i,s,u)=>{var m=u(77412),v=u(47443),_=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];i.exports=function updateWrapDetails(i,s){return m(_,(function(u){var m="_."+u[0];s&u[1]&&!v(i,m)&&i.push(m)})),i.sort()}},21913:(i,s,u)=>{var m=u(96425),v=u(7548),_=u(278);i.exports=function wrapperClone(i){if(i instanceof m)return i.clone();var s=new v(i.__wrapped__,i.__chain__);return s.__actions__=_(i.__actions__),s.__index__=i.__index__,s.__values__=i.__values__,s}},39514:(i,s,u)=>{var m=u(97727);i.exports=function ary(i,s,u){return s=u?void 0:s,s=i&&null==s?i.length:s,m(i,128,void 0,void 0,void 0,void 0,s)}},68929:(i,s,u)=>{var m=u(48403),v=u(35393)((function(i,s,u){return s=s.toLowerCase(),i+(u?m(s):s)}));i.exports=v},48403:(i,s,u)=>{var m=u(79833),v=u(11700);i.exports=function capitalize(i){return v(m(i).toLowerCase())}},66678:(i,s,u)=>{var m=u(85990);i.exports=function clone(i){return m(i,4)}},75703:i=>{i.exports=function constant(i){return function(){return i}}},40087:(i,s,u)=>{var m=u(97727);function curry(i,s,u){var v=m(i,8,void 0,void 0,void 0,void 0,void 0,s=u?void 0:s);return v.placeholder=curry.placeholder,v}curry.placeholder={},i.exports=curry},23279:(i,s,u)=>{var m=u(13218),v=u(7771),_=u(14841),j=Math.max,M=Math.min;i.exports=function debounce(i,s,u){var $,W,X,Y,Z,ee,ie=0,ae=!1,ce=!1,le=!0;if("function"!=typeof i)throw new TypeError("Expected a function");function invokeFunc(s){var u=$,m=W;return $=W=void 0,ie=s,Y=i.apply(m,u)}function shouldInvoke(i){var u=i-ee;return void 0===ee||u>=s||u<0||ce&&i-ie>=X}function timerExpired(){var i=v();if(shouldInvoke(i))return trailingEdge(i);Z=setTimeout(timerExpired,function remainingWait(i){var u=s-(i-ee);return ce?M(u,X-(i-ie)):u}(i))}function trailingEdge(i){return Z=void 0,le&&$?invokeFunc(i):($=W=void 0,Y)}function debounced(){var i=v(),u=shouldInvoke(i);if($=arguments,W=this,ee=i,u){if(void 0===Z)return function leadingEdge(i){return ie=i,Z=setTimeout(timerExpired,s),ae?invokeFunc(i):Y}(ee);if(ce)return clearTimeout(Z),Z=setTimeout(timerExpired,s),invokeFunc(ee)}return void 0===Z&&(Z=setTimeout(timerExpired,s)),Y}return s=_(s)||0,m(u)&&(ae=!!u.leading,X=(ce="maxWait"in u)?j(_(u.maxWait)||0,s):X,le="trailing"in u?!!u.trailing:le),debounced.cancel=function cancel(){void 0!==Z&&clearTimeout(Z),ie=0,$=ee=W=Z=void 0},debounced.flush=function flush(){return void 0===Z?Y:trailingEdge(v())},debounced}},53816:(i,s,u)=>{var m=u(69389),v=u(79833),_=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,j=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");i.exports=function deburr(i){return(i=v(i))&&i.replace(_,m).replace(j,"")}},77813:i=>{i.exports=function eq(i,s){return i===s||i!=i&&s!=s}},13311:(i,s,u)=>{var m=u(67740)(u(30998));i.exports=m},30998:(i,s,u)=>{var m=u(41848),v=u(67206),_=u(40554),j=Math.max;i.exports=function findIndex(i,s,u){var M=null==i?0:i.length;if(!M)return-1;var $=null==u?0:_(u);return $<0&&($=j(M+$,0)),m(i,v(s,3),$)}},85564:(i,s,u)=>{var m=u(21078);i.exports=function flatten(i){return(null==i?0:i.length)?m(i,1):[]}},84599:(i,s,u)=>{var m=u(68836),v=u(69306),_=Array.prototype.push;function baseAry(i,s){return 2==s?function(s,u){return i(s,u)}:function(s){return i(s)}}function cloneArray(i){for(var s=i?i.length:0,u=Array(s);s--;)u[s]=i[s];return u}function wrapImmutable(i,s){return function(){var u=arguments.length;if(u){for(var m=Array(u);u--;)m[u]=arguments[u];var v=m[0]=s.apply(void 0,m);return i.apply(void 0,m),v}}}i.exports=function baseConvert(i,s,u,j){var M="function"==typeof s,$=s===Object(s);if($&&(j=u,u=s,s=void 0),null==u)throw new TypeError;j||(j={});var W={cap:!("cap"in j)||j.cap,curry:!("curry"in j)||j.curry,fixed:!("fixed"in j)||j.fixed,immutable:!("immutable"in j)||j.immutable,rearg:!("rearg"in j)||j.rearg},X=M?u:v,Y="curry"in j&&j.curry,Z="fixed"in j&&j.fixed,ee="rearg"in j&&j.rearg,ie=M?u.runInContext():void 0,ae=M?u:{ary:i.ary,assign:i.assign,clone:i.clone,curry:i.curry,forEach:i.forEach,isArray:i.isArray,isError:i.isError,isFunction:i.isFunction,isWeakMap:i.isWeakMap,iteratee:i.iteratee,keys:i.keys,rearg:i.rearg,toInteger:i.toInteger,toPath:i.toPath},ce=ae.ary,le=ae.assign,pe=ae.clone,de=ae.curry,fe=ae.forEach,ye=ae.isArray,be=ae.isError,_e=ae.isFunction,we=ae.isWeakMap,Se=ae.keys,xe=ae.rearg,Pe=ae.toInteger,Ie=ae.toPath,Te=Se(m.aryMethod),Re={castArray:function(i){return function(){var s=arguments[0];return ye(s)?i(cloneArray(s)):i.apply(void 0,arguments)}},iteratee:function(i){return function(){var s=arguments[1],u=i(arguments[0],s),m=u.length;return W.cap&&"number"==typeof s?(s=s>2?s-2:1,m&&m<=s?u:baseAry(u,s)):u}},mixin:function(i){return function(s){var u=this;if(!_e(u))return i(u,Object(s));var m=[];return fe(Se(s),(function(i){_e(s[i])&&m.push([i,u.prototype[i]])})),i(u,Object(s)),fe(m,(function(i){var s=i[1];_e(s)?u.prototype[i[0]]=s:delete u.prototype[i[0]]})),u}},nthArg:function(i){return function(s){var u=s<0?1:Pe(s)+1;return de(i(s),u)}},rearg:function(i){return function(s,u){var m=u?u.length:0;return de(i(s,u),m)}},runInContext:function(s){return function(u){return baseConvert(i,s(u),j)}}};function castCap(i,s){if(W.cap){var u=m.iterateeRearg[i];if(u)return function iterateeRearg(i,s){return overArg(i,(function(i){var u=s.length;return function baseArity(i,s){return 2==s?function(s,u){return i.apply(void 0,arguments)}:function(s){return i.apply(void 0,arguments)}}(xe(baseAry(i,u),s),u)}))}(s,u);var v=!M&&m.iterateeAry[i];if(v)return function iterateeAry(i,s){return overArg(i,(function(i){return"function"==typeof i?baseAry(i,s):i}))}(s,v)}return s}function castFixed(i,s,u){if(W.fixed&&(Z||!m.skipFixed[i])){var v=m.methodSpread[i],j=v&&v.start;return void 0===j?ce(s,u):function flatSpread(i,s){return function(){for(var u=arguments.length,m=u-1,v=Array(u);u--;)v[u]=arguments[u];var j=v[s],M=v.slice(0,s);return j&&_.apply(M,j),s!=m&&_.apply(M,v.slice(s+1)),i.apply(this,M)}}(s,j)}return s}function castRearg(i,s,u){return W.rearg&&u>1&&(ee||!m.skipRearg[i])?xe(s,m.methodRearg[i]||m.aryRearg[u]):s}function cloneByPath(i,s){for(var u=-1,m=(s=Ie(s)).length,v=m-1,_=pe(Object(i)),j=_;null!=j&&++u1?de(s,u):s}(0,v=castCap(_,v),i),!1}})),!v})),v||(v=j),v==s&&(v=Y?de(v,1):function(){return s.apply(this,arguments)}),v.convert=createConverter(_,s),v.placeholder=s.placeholder=u,v}if(!$)return wrap(s,u,X);var qe=u,ze=[];return fe(Te,(function(i){fe(m.aryMethod[i],(function(i){var s=qe[m.remap[i]||i];s&&ze.push([i,wrap(i,s,qe)])}))})),fe(Se(qe),(function(i){var s=qe[i];if("function"==typeof s){for(var u=ze.length;u--;)if(ze[u][0]==i)return;s.convert=createConverter(i,s),ze.push([i,s])}})),fe(ze,(function(i){qe[i[0]]=i[1]})),qe.convert=function convertLib(i){return qe.runInContext.convert(i)(void 0)},qe.placeholder=qe,fe(Se(qe),(function(i){fe(m.realToAlias[i]||[],(function(s){qe[s]=qe[i]}))})),qe}},68836:(i,s)=>{s.aliasToReal={each:"forEach",eachRight:"forEachRight",entries:"toPairs",entriesIn:"toPairsIn",extend:"assignIn",extendAll:"assignInAll",extendAllWith:"assignInAllWith",extendWith:"assignInWith",first:"head",conforms:"conformsTo",matches:"isMatch",property:"get",__:"placeholder",F:"stubFalse",T:"stubTrue",all:"every",allPass:"overEvery",always:"constant",any:"some",anyPass:"overSome",apply:"spread",assoc:"set",assocPath:"set",complement:"negate",compose:"flowRight",contains:"includes",dissoc:"unset",dissocPath:"unset",dropLast:"dropRight",dropLastWhile:"dropRightWhile",equals:"isEqual",identical:"eq",indexBy:"keyBy",init:"initial",invertObj:"invert",juxt:"over",omitAll:"omit",nAry:"ary",path:"get",pathEq:"matchesProperty",pathOr:"getOr",paths:"at",pickAll:"pick",pipe:"flow",pluck:"map",prop:"get",propEq:"matchesProperty",propOr:"getOr",props:"at",symmetricDifference:"xor",symmetricDifferenceBy:"xorBy",symmetricDifferenceWith:"xorWith",takeLast:"takeRight",takeLastWhile:"takeRightWhile",unapply:"rest",unnest:"flatten",useWith:"overArgs",where:"conformsTo",whereEq:"isMatch",zipObj:"zipObject"},s.aryMethod={1:["assignAll","assignInAll","attempt","castArray","ceil","create","curry","curryRight","defaultsAll","defaultsDeepAll","floor","flow","flowRight","fromPairs","invert","iteratee","memoize","method","mergeAll","methodOf","mixin","nthArg","over","overEvery","overSome","rest","reverse","round","runInContext","spread","template","trim","trimEnd","trimStart","uniqueId","words","zipAll"],2:["add","after","ary","assign","assignAllWith","assignIn","assignInAllWith","at","before","bind","bindAll","bindKey","chunk","cloneDeepWith","cloneWith","concat","conformsTo","countBy","curryN","curryRightN","debounce","defaults","defaultsDeep","defaultTo","delay","difference","divide","drop","dropRight","dropRightWhile","dropWhile","endsWith","eq","every","filter","find","findIndex","findKey","findLast","findLastIndex","findLastKey","flatMap","flatMapDeep","flattenDepth","forEach","forEachRight","forIn","forInRight","forOwn","forOwnRight","get","groupBy","gt","gte","has","hasIn","includes","indexOf","intersection","invertBy","invoke","invokeMap","isEqual","isMatch","join","keyBy","lastIndexOf","lt","lte","map","mapKeys","mapValues","matchesProperty","maxBy","meanBy","merge","mergeAllWith","minBy","multiply","nth","omit","omitBy","overArgs","pad","padEnd","padStart","parseInt","partial","partialRight","partition","pick","pickBy","propertyOf","pull","pullAll","pullAt","random","range","rangeRight","rearg","reject","remove","repeat","restFrom","result","sampleSize","some","sortBy","sortedIndex","sortedIndexOf","sortedLastIndex","sortedLastIndexOf","sortedUniqBy","split","spreadFrom","startsWith","subtract","sumBy","take","takeRight","takeRightWhile","takeWhile","tap","throttle","thru","times","trimChars","trimCharsEnd","trimCharsStart","truncate","union","uniqBy","uniqWith","unset","unzipWith","without","wrap","xor","zip","zipObject","zipObjectDeep"],3:["assignInWith","assignWith","clamp","differenceBy","differenceWith","findFrom","findIndexFrom","findLastFrom","findLastIndexFrom","getOr","includesFrom","indexOfFrom","inRange","intersectionBy","intersectionWith","invokeArgs","invokeArgsMap","isEqualWith","isMatchWith","flatMapDepth","lastIndexOfFrom","mergeWith","orderBy","padChars","padCharsEnd","padCharsStart","pullAllBy","pullAllWith","rangeStep","rangeStepRight","reduce","reduceRight","replace","set","slice","sortedIndexBy","sortedLastIndexBy","transform","unionBy","unionWith","update","xorBy","xorWith","zipWith"],4:["fill","setWith","updateWith"]},s.aryRearg={2:[1,0],3:[2,0,1],4:[3,2,0,1]},s.iterateeAry={dropRightWhile:1,dropWhile:1,every:1,filter:1,find:1,findFrom:1,findIndex:1,findIndexFrom:1,findKey:1,findLast:1,findLastFrom:1,findLastIndex:1,findLastIndexFrom:1,findLastKey:1,flatMap:1,flatMapDeep:1,flatMapDepth:1,forEach:1,forEachRight:1,forIn:1,forInRight:1,forOwn:1,forOwnRight:1,map:1,mapKeys:1,mapValues:1,partition:1,reduce:2,reduceRight:2,reject:1,remove:1,some:1,takeRightWhile:1,takeWhile:1,times:1,transform:2},s.iterateeRearg={mapKeys:[1],reduceRight:[1,0]},s.methodRearg={assignInAllWith:[1,0],assignInWith:[1,2,0],assignAllWith:[1,0],assignWith:[1,2,0],differenceBy:[1,2,0],differenceWith:[1,2,0],getOr:[2,1,0],intersectionBy:[1,2,0],intersectionWith:[1,2,0],isEqualWith:[1,2,0],isMatchWith:[2,1,0],mergeAllWith:[1,0],mergeWith:[1,2,0],padChars:[2,1,0],padCharsEnd:[2,1,0],padCharsStart:[2,1,0],pullAllBy:[2,1,0],pullAllWith:[2,1,0],rangeStep:[1,2,0],rangeStepRight:[1,2,0],setWith:[3,1,2,0],sortedIndexBy:[2,1,0],sortedLastIndexBy:[2,1,0],unionBy:[1,2,0],unionWith:[1,2,0],updateWith:[3,1,2,0],xorBy:[1,2,0],xorWith:[1,2,0],zipWith:[1,2,0]},s.methodSpread={assignAll:{start:0},assignAllWith:{start:0},assignInAll:{start:0},assignInAllWith:{start:0},defaultsAll:{start:0},defaultsDeepAll:{start:0},invokeArgs:{start:2},invokeArgsMap:{start:2},mergeAll:{start:0},mergeAllWith:{start:0},partial:{start:1},partialRight:{start:1},without:{start:1},zipAll:{start:0}},s.mutate={array:{fill:!0,pull:!0,pullAll:!0,pullAllBy:!0,pullAllWith:!0,pullAt:!0,remove:!0,reverse:!0},object:{assign:!0,assignAll:!0,assignAllWith:!0,assignIn:!0,assignInAll:!0,assignInAllWith:!0,assignInWith:!0,assignWith:!0,defaults:!0,defaultsAll:!0,defaultsDeep:!0,defaultsDeepAll:!0,merge:!0,mergeAll:!0,mergeAllWith:!0,mergeWith:!0},set:{set:!0,setWith:!0,unset:!0,update:!0,updateWith:!0}},s.realToAlias=function(){var i=Object.prototype.hasOwnProperty,u=s.aliasToReal,m={};for(var v in u){var _=u[v];i.call(m,_)?m[_].push(v):m[_]=[v]}return m}(),s.remap={assignAll:"assign",assignAllWith:"assignWith",assignInAll:"assignIn",assignInAllWith:"assignInWith",curryN:"curry",curryRightN:"curryRight",defaultsAll:"defaults",defaultsDeepAll:"defaultsDeep",findFrom:"find",findIndexFrom:"findIndex",findLastFrom:"findLast",findLastIndexFrom:"findLastIndex",getOr:"get",includesFrom:"includes",indexOfFrom:"indexOf",invokeArgs:"invoke",invokeArgsMap:"invokeMap",lastIndexOfFrom:"lastIndexOf",mergeAll:"merge",mergeAllWith:"mergeWith",padChars:"pad",padCharsEnd:"padEnd",padCharsStart:"padStart",propertyOf:"get",rangeStep:"range",rangeStepRight:"rangeRight",restFrom:"rest",spreadFrom:"spread",trimChars:"trim",trimCharsEnd:"trimEnd",trimCharsStart:"trimStart",zipAll:"zip"},s.skipFixed={castArray:!0,flow:!0,flowRight:!0,iteratee:!0,mixin:!0,rearg:!0,runInContext:!0},s.skipRearg={add:!0,assign:!0,assignIn:!0,bind:!0,bindKey:!0,concat:!0,difference:!0,divide:!0,eq:!0,gt:!0,gte:!0,isEqual:!0,lt:!0,lte:!0,matchesProperty:!0,merge:!0,multiply:!0,overArgs:!0,partial:!0,partialRight:!0,propertyOf:!0,random:!0,range:!0,rangeRight:!0,subtract:!0,zip:!0,zipObject:!0,zipObjectDeep:!0}},4269:(i,s,u)=>{i.exports={ary:u(39514),assign:u(44037),clone:u(66678),curry:u(40087),forEach:u(77412),isArray:u(1469),isError:u(64647),isFunction:u(23560),isWeakMap:u(81018),iteratee:u(72594),keys:u(280),rearg:u(4963),toInteger:u(40554),toPath:u(30084)}},72700:(i,s,u)=>{i.exports=u(28252)},92822:(i,s,u)=>{var m=u(84599),v=u(4269);i.exports=function convert(i,s,u){return m(v,i,s,u)}},69306:i=>{i.exports={}},28252:(i,s,u)=>{var m=u(92822)("set",u(36968));m.placeholder=u(69306),i.exports=m},27361:(i,s,u)=>{var m=u(97786);i.exports=function get(i,s,u){var v=null==i?void 0:m(i,s);return void 0===v?u:v}},79095:(i,s,u)=>{var m=u(13),v=u(222);i.exports=function hasIn(i,s){return null!=i&&v(i,s,m)}},6557:i=>{i.exports=function identity(i){return i}},35694:(i,s,u)=>{var m=u(9454),v=u(37005),_=Object.prototype,j=_.hasOwnProperty,M=_.propertyIsEnumerable,$=m(function(){return arguments}())?m:function(i){return v(i)&&j.call(i,"callee")&&!M.call(i,"callee")};i.exports=$},1469:i=>{var s=Array.isArray;i.exports=s},98612:(i,s,u)=>{var m=u(23560),v=u(41780);i.exports=function isArrayLike(i){return null!=i&&v(i.length)&&!m(i)}},29246:(i,s,u)=>{var m=u(98612),v=u(37005);i.exports=function isArrayLikeObject(i){return v(i)&&m(i)}},51584:(i,s,u)=>{var m=u(44239),v=u(37005);i.exports=function isBoolean(i){return!0===i||!1===i||v(i)&&"[object Boolean]"==m(i)}},44144:(i,s,u)=>{i=u.nmd(i);var m=u(55639),v=u(95062),_=s&&!s.nodeType&&s,j=_&&i&&!i.nodeType&&i,M=j&&j.exports===_?m.Buffer:void 0,$=(M?M.isBuffer:void 0)||v;i.exports=$},41609:(i,s,u)=>{var m=u(280),v=u(64160),_=u(35694),j=u(1469),M=u(98612),$=u(44144),W=u(25726),X=u(36719),Y=Object.prototype.hasOwnProperty;i.exports=function isEmpty(i){if(null==i)return!0;if(M(i)&&(j(i)||"string"==typeof i||"function"==typeof i.splice||$(i)||X(i)||_(i)))return!i.length;var s=v(i);if("[object Map]"==s||"[object Set]"==s)return!i.size;if(W(i))return!m(i).length;for(var u in i)if(Y.call(i,u))return!1;return!0}},18446:(i,s,u)=>{var m=u(90939);i.exports=function isEqual(i,s){return m(i,s)}},64647:(i,s,u)=>{var m=u(44239),v=u(37005),_=u(68630);i.exports=function isError(i){if(!v(i))return!1;var s=m(i);return"[object Error]"==s||"[object DOMException]"==s||"string"==typeof i.message&&"string"==typeof i.name&&!_(i)}},23560:(i,s,u)=>{var m=u(44239),v=u(13218);i.exports=function isFunction(i){if(!v(i))return!1;var s=m(i);return"[object Function]"==s||"[object GeneratorFunction]"==s||"[object AsyncFunction]"==s||"[object Proxy]"==s}},41780:i=>{i.exports=function isLength(i){return"number"==typeof i&&i>-1&&i%1==0&&i<=9007199254740991}},56688:(i,s,u)=>{var m=u(25588),v=u(7518),_=u(31167),j=_&&_.isMap,M=j?v(j):m;i.exports=M},45220:i=>{i.exports=function isNull(i){return null===i}},81763:(i,s,u)=>{var m=u(44239),v=u(37005);i.exports=function isNumber(i){return"number"==typeof i||v(i)&&"[object Number]"==m(i)}},13218:i=>{i.exports=function isObject(i){var s=typeof i;return null!=i&&("object"==s||"function"==s)}},37005:i=>{i.exports=function isObjectLike(i){return null!=i&&"object"==typeof i}},68630:(i,s,u)=>{var m=u(44239),v=u(85924),_=u(37005),j=Function.prototype,M=Object.prototype,$=j.toString,W=M.hasOwnProperty,X=$.call(Object);i.exports=function isPlainObject(i){if(!_(i)||"[object Object]"!=m(i))return!1;var s=v(i);if(null===s)return!0;var u=W.call(s,"constructor")&&s.constructor;return"function"==typeof u&&u instanceof u&&$.call(u)==X}},72928:(i,s,u)=>{var m=u(29221),v=u(7518),_=u(31167),j=_&&_.isSet,M=j?v(j):m;i.exports=M},47037:(i,s,u)=>{var m=u(44239),v=u(1469),_=u(37005);i.exports=function isString(i){return"string"==typeof i||!v(i)&&_(i)&&"[object String]"==m(i)}},33448:(i,s,u)=>{var m=u(44239),v=u(37005);i.exports=function isSymbol(i){return"symbol"==typeof i||v(i)&&"[object Symbol]"==m(i)}},36719:(i,s,u)=>{var m=u(38749),v=u(7518),_=u(31167),j=_&&_.isTypedArray,M=j?v(j):m;i.exports=M},81018:(i,s,u)=>{var m=u(64160),v=u(37005);i.exports=function isWeakMap(i){return v(i)&&"[object WeakMap]"==m(i)}},72594:(i,s,u)=>{var m=u(85990),v=u(67206);i.exports=function iteratee(i){return v("function"==typeof i?i:m(i,1))}},3674:(i,s,u)=>{var m=u(14636),v=u(280),_=u(98612);i.exports=function keys(i){return _(i)?m(i):v(i)}},81704:(i,s,u)=>{var m=u(14636),v=u(10313),_=u(98612);i.exports=function keysIn(i){return _(i)?m(i,!0):v(i)}},10928:i=>{i.exports=function last(i){var s=null==i?0:i.length;return s?i[s-1]:void 0}},88306:(i,s,u)=>{var m=u(83369);function memoize(i,s){if("function"!=typeof i||null!=s&&"function"!=typeof s)throw new TypeError("Expected a function");var memoized=function(){var u=arguments,m=s?s.apply(this,u):u[0],v=memoized.cache;if(v.has(m))return v.get(m);var _=i.apply(this,u);return memoized.cache=v.set(m,_)||v,_};return memoized.cache=new(memoize.Cache||m),memoized}memoize.Cache=m,i.exports=memoize},82492:(i,s,u)=>{var m=u(42980),v=u(21463)((function(i,s,u){m(i,s,u)}));i.exports=v},94885:i=>{i.exports=function negate(i){if("function"!=typeof i)throw new TypeError("Expected a function");return function(){var s=arguments;switch(s.length){case 0:return!i.call(this);case 1:return!i.call(this,s[0]);case 2:return!i.call(this,s[0],s[1]);case 3:return!i.call(this,s[0],s[1],s[2])}return!i.apply(this,s)}}},50308:i=>{i.exports=function noop(){}},7771:(i,s,u)=>{var m=u(55639);i.exports=function(){return m.Date.now()}},57557:(i,s,u)=>{var m=u(29932),v=u(85990),_=u(57406),j=u(71811),M=u(98363),$=u(60696),W=u(99021),X=u(46904),Y=W((function(i,s){var u={};if(null==i)return u;var W=!1;s=m(s,(function(s){return s=j(s,i),W||(W=s.length>1),s})),M(i,X(i),u),W&&(u=v(u,7,$));for(var Y=s.length;Y--;)_(u,s[Y]);return u}));i.exports=Y},39601:(i,s,u)=>{var m=u(40371),v=u(79152),_=u(15403),j=u(40327);i.exports=function property(i){return _(i)?m(j(i)):v(i)}},4963:(i,s,u)=>{var m=u(97727),v=u(99021),_=v((function(i,s){return m(i,256,void 0,void 0,void 0,s)}));i.exports=_},54061:(i,s,u)=>{var m=u(62663),v=u(89881),_=u(67206),j=u(10107),M=u(1469);i.exports=function reduce(i,s,u){var $=M(i)?m:j,W=arguments.length<3;return $(i,_(s,4),u,W,v)}},36968:(i,s,u)=>{var m=u(10611);i.exports=function set(i,s,u){return null==i?i:m(i,s,u)}},59704:(i,s,u)=>{var m=u(82908),v=u(67206),_=u(5076),j=u(1469),M=u(16612);i.exports=function some(i,s,u){var $=j(i)?m:_;return u&&M(i,s,u)&&(s=void 0),$(i,v(s,3))}},70479:i=>{i.exports=function stubArray(){return[]}},95062:i=>{i.exports=function stubFalse(){return!1}},18601:(i,s,u)=>{var m=u(14841),v=1/0;i.exports=function toFinite(i){return i?(i=m(i))===v||i===-1/0?17976931348623157e292*(i<0?-1:1):i==i?i:0:0===i?i:0}},40554:(i,s,u)=>{var m=u(18601);i.exports=function toInteger(i){var s=m(i),u=s%1;return s==s?u?s-u:s:0}},7334:(i,s,u)=>{var m=u(79833);i.exports=function toLower(i){return m(i).toLowerCase()}},14841:(i,s,u)=>{var m=u(27561),v=u(13218),_=u(33448),j=/^[-+]0x[0-9a-f]+$/i,M=/^0b[01]+$/i,$=/^0o[0-7]+$/i,W=parseInt;i.exports=function toNumber(i){if("number"==typeof i)return i;if(_(i))return NaN;if(v(i)){var s="function"==typeof i.valueOf?i.valueOf():i;i=v(s)?s+"":s}if("string"!=typeof i)return 0===i?i:+i;i=m(i);var u=M.test(i);return u||$.test(i)?W(i.slice(2),u?2:8):j.test(i)?NaN:+i}},30084:(i,s,u)=>{var m=u(29932),v=u(278),_=u(1469),j=u(33448),M=u(55514),$=u(40327),W=u(79833);i.exports=function toPath(i){return _(i)?m(i,$):j(i)?[i]:v(M(W(i)))}},59881:(i,s,u)=>{var m=u(98363),v=u(81704);i.exports=function toPlainObject(i){return m(i,v(i))}},79833:(i,s,u)=>{var m=u(80531);i.exports=function toString(i){return null==i?"":m(i)}},11700:(i,s,u)=>{var m=u(98805)("toUpperCase");i.exports=m},58748:(i,s,u)=>{var m=u(49029),v=u(93157),_=u(79833),j=u(2757);i.exports=function words(i,s,u){return i=_(i),void 0===(s=u?void 0:s)?v(i)?j(i):m(i):i.match(s)||[]}},8111:(i,s,u)=>{var m=u(96425),v=u(7548),_=u(9435),j=u(1469),M=u(37005),$=u(21913),W=Object.prototype.hasOwnProperty;function lodash(i){if(M(i)&&!j(i)&&!(i instanceof m)){if(i instanceof v)return i;if(W.call(i,"__wrapped__"))return $(i)}return new v(i)}lodash.prototype=_.prototype,lodash.prototype.constructor=lodash,i.exports=lodash},7287:(i,s,u)=>{var m=u(34865),v=u(1757);i.exports=function zipObject(i,s){return v(i||[],s||[],m)}},96470:(i,s,u)=>{"use strict";var m=u(47802),v=u(21102);s.highlight=highlight,s.highlightAuto=function highlightAuto(i,s){var u,j,M,$,W=s||{},X=W.subset||m.listLanguages(),Y=W.prefix,Z=X.length,ee=-1;null==Y&&(Y=_);if("string"!=typeof i)throw v("Expected `string` for value, got `%s`",i);j={relevance:0,language:null,value:[]},u={relevance:0,language:null,value:[]};for(;++eej.relevance&&(j=M),M.relevance>u.relevance&&(j=u,u=M));j.language&&(u.secondBest=j);return u},s.registerLanguage=function registerLanguage(i,s){m.registerLanguage(i,s)},s.listLanguages=function listLanguages(){return m.listLanguages()},s.registerAlias=function registerAlias(i,s){var u,v=i;s&&((v={})[i]=s);for(u in v)m.registerAliases(v[u],{languageName:u})},Emitter.prototype.addText=function text(i){var s,u,m=this.stack;if(""===i)return;s=m[m.length-1],(u=s.children[s.children.length-1])&&"text"===u.type?u.value+=i:s.children.push({type:"text",value:i})},Emitter.prototype.addKeyword=function addKeyword(i,s){this.openNode(s),this.addText(i),this.closeNode()},Emitter.prototype.addSublanguage=function addSublanguage(i,s){var u=this.stack,m=u[u.length-1],v=i.rootNode.children,_=s?{type:"element",tagName:"span",properties:{className:[s]},children:v}:v;m.children=m.children.concat(_)},Emitter.prototype.openNode=function open(i){var s=this.stack,u=this.options.classPrefix+i,m=s[s.length-1],v={type:"element",tagName:"span",properties:{className:[u]},children:[]};m.children.push(v),s.push(v)},Emitter.prototype.closeNode=function close(){this.stack.pop()},Emitter.prototype.closeAllNodes=noop,Emitter.prototype.finalize=noop,Emitter.prototype.toHTML=function toHtmlNoop(){return""};var _="hljs-";function highlight(i,s,u){var j,M=m.configure({}),$=(u||{}).prefix;if("string"!=typeof i)throw v("Expected `string` for name, got `%s`",i);if(!m.getLanguage(i))throw v("Unknown language: `%s` is not registered",i);if("string"!=typeof s)throw v("Expected `string` for value, got `%s`",s);if(null==$&&($=_),m.configure({__emitter:Emitter,classPrefix:$}),j=m.highlight(s,{language:i,ignoreIllegals:!0}),m.configure(M||{}),j.errorRaised)throw j.errorRaised;return{relevance:j.relevance,language:j.language,value:j.emitter.rootNode.children}}function Emitter(i){this.options=i,this.rootNode={children:[]},this.stack=[this.rootNode]}function noop(){}},42566:(i,s,u)=>{const m=u(94885);function coerceElementMatchingCallback(i){return"string"==typeof i?s=>s.element===i:i.constructor&&i.extend?s=>s instanceof i:i}class ArraySlice{constructor(i){this.elements=i||[]}toValue(){return this.elements.map((i=>i.toValue()))}map(i,s){return this.elements.map(i,s)}flatMap(i,s){return this.map(i,s).reduce(((i,s)=>i.concat(s)),[])}compactMap(i,s){const u=[];return this.forEach((m=>{const v=i.bind(s)(m);v&&u.push(v)})),u}filter(i,s){return i=coerceElementMatchingCallback(i),new ArraySlice(this.elements.filter(i,s))}reject(i,s){return i=coerceElementMatchingCallback(i),new ArraySlice(this.elements.filter(m(i),s))}find(i,s){return i=coerceElementMatchingCallback(i),this.elements.find(i,s)}forEach(i,s){this.elements.forEach(i,s)}reduce(i,s){return this.elements.reduce(i,s)}includes(i){return this.elements.some((s=>s.equals(i)))}shift(){return this.elements.shift()}unshift(i){this.elements.unshift(this.refract(i))}push(i){return this.elements.push(this.refract(i)),this}add(i){this.push(i)}get(i){return this.elements[i]}getValue(i){const s=this.elements[i];if(s)return s.toValue()}get length(){return this.elements.length}get isEmpty(){return 0===this.elements.length}get first(){return this.elements[0]}}"undefined"!=typeof Symbol&&(ArraySlice.prototype[Symbol.iterator]=function symbol(){return this.elements[Symbol.iterator]()}),i.exports=ArraySlice},17645:i=>{class KeyValuePair{constructor(i,s){this.key=i,this.value=s}clone(){const i=new KeyValuePair;return this.key&&(i.key=this.key.clone()),this.value&&(i.value=this.value.clone()),i}}i.exports=KeyValuePair},78520:(i,s,u)=>{const m=u(45220),v=u(47037),_=u(81763),j=u(51584),M=u(13218),$=u(28219),W=u(99829);class Namespace{constructor(i){this.elementMap={},this.elementDetection=[],this.Element=W.Element,this.KeyValuePair=W.KeyValuePair,i&&i.noDefault||this.useDefault(),this._attributeElementKeys=[],this._attributeElementArrayKeys=[]}use(i){return i.namespace&&i.namespace({base:this}),i.load&&i.load({base:this}),this}useDefault(){return this.register("null",W.NullElement).register("string",W.StringElement).register("number",W.NumberElement).register("boolean",W.BooleanElement).register("array",W.ArrayElement).register("object",W.ObjectElement).register("member",W.MemberElement).register("ref",W.RefElement).register("link",W.LinkElement),this.detect(m,W.NullElement,!1).detect(v,W.StringElement,!1).detect(_,W.NumberElement,!1).detect(j,W.BooleanElement,!1).detect(Array.isArray,W.ArrayElement,!1).detect(M,W.ObjectElement,!1),this}register(i,s){return this._elements=void 0,this.elementMap[i]=s,this}unregister(i){return this._elements=void 0,delete this.elementMap[i],this}detect(i,s,u){return void 0===u||u?this.elementDetection.unshift([i,s]):this.elementDetection.push([i,s]),this}toElement(i){if(i instanceof this.Element)return i;let s;for(let u=0;u{const s=i[0].toUpperCase()+i.substr(1);this._elements[s]=this.elementMap[i]}))),this._elements}get serialiser(){return new $(this)}}$.prototype.Namespace=Namespace,i.exports=Namespace},87526:(i,s,u)=>{const m=u(94885),v=u(42566);class ObjectSlice extends v{map(i,s){return this.elements.map((u=>i.bind(s)(u.value,u.key,u)))}filter(i,s){return new ObjectSlice(this.elements.filter((u=>i.bind(s)(u.value,u.key,u))))}reject(i,s){return this.filter(m(i.bind(s)))}forEach(i,s){return this.elements.forEach(((u,m)=>{i.bind(s)(u.value,u.key,u,m)}))}keys(){return this.map(((i,s)=>s.toValue()))}values(){return this.map((i=>i.toValue()))}}i.exports=ObjectSlice},99829:(i,s,u)=>{const m=u(3079),v=u(96295),_=u(16036),j=u(91090),M=u(18866),$=u(35804),W=u(5946),X=u(76735),Y=u(59964),Z=u(38588),ee=u(42566),ie=u(87526),ae=u(17645);function refract(i){if(i instanceof m)return i;if("string"==typeof i)return new _(i);if("number"==typeof i)return new j(i);if("boolean"==typeof i)return new M(i);if(null===i)return new v;if(Array.isArray(i))return new $(i.map(refract));if("object"==typeof i){return new X(i)}return i}m.prototype.ObjectElement=X,m.prototype.RefElement=Z,m.prototype.MemberElement=W,m.prototype.refract=refract,ee.prototype.refract=refract,i.exports={Element:m,NullElement:v,StringElement:_,NumberElement:j,BooleanElement:M,ArrayElement:$,MemberElement:W,ObjectElement:X,LinkElement:Y,RefElement:Z,refract,ArraySlice:ee,ObjectSlice:ie,KeyValuePair:ae}},59964:(i,s,u)=>{const m=u(3079);i.exports=class LinkElement extends m{constructor(i,s,u){super(i||[],s,u),this.element="link"}get relation(){return this.attributes.get("relation")}set relation(i){this.attributes.set("relation",i)}get href(){return this.attributes.get("href")}set href(i){this.attributes.set("href",i)}}},38588:(i,s,u)=>{const m=u(3079);i.exports=class RefElement extends m{constructor(i,s,u){super(i||[],s,u),this.element="ref",this.path||(this.path="element")}get path(){return this.attributes.get("path")}set path(i){this.attributes.set("path",i)}}},43500:(i,s,u)=>{const m=u(78520),v=u(99829);s.lS=m,u(17645),s.O4=v.ArraySlice,v.ObjectSlice,s.W_=v.Element,s.RP=v.StringElement,s.VL=v.NumberElement,s.hh=v.BooleanElement,s.zr=v.NullElement,s.ON=v.ArrayElement,s.Sb=v.ObjectElement,s.c6=v.MemberElement,s.tK=v.RefElement,s.EA=v.LinkElement,s.Qc=v.refract,u(28219),u(3414)},35804:(i,s,u)=>{const m=u(94885),v=u(3079),_=u(42566);class ArrayElement extends v{constructor(i,s,u){super(i||[],s,u),this.element="array"}primitive(){return"array"}get(i){return this.content[i]}getValue(i){const s=this.get(i);if(s)return s.toValue()}getIndex(i){return this.content[i]}set(i,s){return this.content[i]=this.refract(s),this}remove(i){const s=this.content.splice(i,1);return s.length?s[0]:null}map(i,s){return this.content.map(i,s)}flatMap(i,s){return this.map(i,s).reduce(((i,s)=>i.concat(s)),[])}compactMap(i,s){const u=[];return this.forEach((m=>{const v=i.bind(s)(m);v&&u.push(v)})),u}filter(i,s){return new _(this.content.filter(i,s))}reject(i,s){return this.filter(m(i),s)}reduce(i,s){let u,m;void 0!==s?(u=0,m=this.refract(s)):(u=1,m="object"===this.primitive()?this.first.value:this.first);for(let s=u;s{i.bind(s)(u,this.refract(m))}))}shift(){return this.content.shift()}unshift(i){this.content.unshift(this.refract(i))}push(i){return this.content.push(this.refract(i)),this}add(i){this.push(i)}findElements(i,s){const u=s||{},m=!!u.recursive,v=void 0===u.results?[]:u.results;return this.forEach(((s,u,_)=>{m&&void 0!==s.findElements&&s.findElements(i,{results:v,recursive:m}),i(s,u,_)&&v.push(s)})),v}find(i){return new _(this.findElements(i,{recursive:!0}))}findByElement(i){return this.find((s=>s.element===i))}findByClass(i){return this.find((s=>s.classes.includes(i)))}getById(i){return this.find((s=>s.id.toValue()===i)).first}includes(i){return this.content.some((s=>s.equals(i)))}contains(i){return this.includes(i)}empty(){return new this.constructor([])}"fantasy-land/empty"(){return this.empty()}concat(i){return new this.constructor(this.content.concat(i.content))}"fantasy-land/concat"(i){return this.concat(i)}"fantasy-land/map"(i){return new this.constructor(this.map(i))}"fantasy-land/chain"(i){return this.map((s=>i(s)),this).reduce(((i,s)=>i.concat(s)),this.empty())}"fantasy-land/filter"(i){return new this.constructor(this.content.filter(i))}"fantasy-land/reduce"(i,s){return this.content.reduce(i,s)}get length(){return this.content.length}get isEmpty(){return 0===this.content.length}get first(){return this.getIndex(0)}get second(){return this.getIndex(1)}get last(){return this.getIndex(this.length-1)}}ArrayElement.empty=function empty(){return new this},ArrayElement["fantasy-land/empty"]=ArrayElement.empty,"undefined"!=typeof Symbol&&(ArrayElement.prototype[Symbol.iterator]=function symbol(){return this.content[Symbol.iterator]()}),i.exports=ArrayElement},18866:(i,s,u)=>{const m=u(3079);i.exports=class BooleanElement extends m{constructor(i,s,u){super(i,s,u),this.element="boolean"}primitive(){return"boolean"}}},3079:(i,s,u)=>{const m=u(18446),v=u(17645),_=u(42566);class Element{constructor(i,s,u){s&&(this.meta=s),u&&(this.attributes=u),this.content=i}freeze(){Object.isFrozen(this)||(this._meta&&(this.meta.parent=this,this.meta.freeze()),this._attributes&&(this.attributes.parent=this,this.attributes.freeze()),this.children.forEach((i=>{i.parent=this,i.freeze()}),this),this.content&&Array.isArray(this.content)&&Object.freeze(this.content),Object.freeze(this))}primitive(){}clone(){const i=new this.constructor;return i.element=this.element,this.meta.length&&(i._meta=this.meta.clone()),this.attributes.length&&(i._attributes=this.attributes.clone()),this.content?this.content.clone?i.content=this.content.clone():Array.isArray(this.content)?i.content=this.content.map((i=>i.clone())):i.content=this.content:i.content=this.content,i}toValue(){return this.content instanceof Element?this.content.toValue():this.content instanceof v?{key:this.content.key.toValue(),value:this.content.value?this.content.value.toValue():void 0}:this.content&&this.content.map?this.content.map((i=>i.toValue()),this):this.content}toRef(i){if(""===this.id.toValue())throw Error("Cannot create reference to an element that does not contain an ID");const s=new this.RefElement(this.id.toValue());return i&&(s.path=i),s}findRecursive(...i){if(arguments.length>1&&!this.isFrozen)throw new Error("Cannot find recursive with multiple element names without first freezing the element. Call `element.freeze()`");const s=i.pop();let u=new _;const append=(i,s)=>(i.push(s),i),checkElement=(i,u)=>{u.element===s&&i.push(u);const m=u.findRecursive(s);return m&&m.reduce(append,i),u.content instanceof v&&(u.content.key&&checkElement(i,u.content.key),u.content.value&&checkElement(i,u.content.value)),i};return this.content&&(this.content.element&&checkElement(u,this.content),Array.isArray(this.content)&&this.content.reduce(checkElement,u)),i.isEmpty||(u=u.filter((s=>{let u=s.parents.map((i=>i.element));for(const s in i){const m=i[s],v=u.indexOf(m);if(-1===v)return!1;u=u.splice(0,v)}return!0}))),u}set(i){return this.content=i,this}equals(i){return m(this.toValue(),i)}getMetaProperty(i,s){if(!this.meta.hasKey(i)){if(this.isFrozen){const i=this.refract(s);return i.freeze(),i}this.meta.set(i,s)}return this.meta.get(i)}setMetaProperty(i,s){this.meta.set(i,s)}get element(){return this._storedElement||"element"}set element(i){this._storedElement=i}get content(){return this._content}set content(i){if(i instanceof Element)this._content=i;else if(i instanceof _)this.content=i.elements;else if("string"==typeof i||"number"==typeof i||"boolean"==typeof i||"null"===i||null==i)this._content=i;else if(i instanceof v)this._content=i;else if(Array.isArray(i))this._content=i.map(this.refract);else{if("object"!=typeof i)throw new Error("Cannot set content to given value");this._content=Object.keys(i).map((s=>new this.MemberElement(s,i[s])))}}get meta(){if(!this._meta){if(this.isFrozen){const i=new this.ObjectElement;return i.freeze(),i}this._meta=new this.ObjectElement}return this._meta}set meta(i){i instanceof this.ObjectElement?this._meta=i:this.meta.set(i||{})}get attributes(){if(!this._attributes){if(this.isFrozen){const i=new this.ObjectElement;return i.freeze(),i}this._attributes=new this.ObjectElement}return this._attributes}set attributes(i){i instanceof this.ObjectElement?this._attributes=i:this.attributes.set(i||{})}get id(){return this.getMetaProperty("id","")}set id(i){this.setMetaProperty("id",i)}get classes(){return this.getMetaProperty("classes",[])}set classes(i){this.setMetaProperty("classes",i)}get title(){return this.getMetaProperty("title","")}set title(i){this.setMetaProperty("title",i)}get description(){return this.getMetaProperty("description","")}set description(i){this.setMetaProperty("description",i)}get links(){return this.getMetaProperty("links",[])}set links(i){this.setMetaProperty("links",i)}get isFrozen(){return Object.isFrozen(this)}get parents(){let{parent:i}=this;const s=new _;for(;i;)s.push(i),i=i.parent;return s}get children(){if(Array.isArray(this.content))return new _(this.content);if(this.content instanceof v){const i=new _([this.content.key]);return this.content.value&&i.push(this.content.value),i}return this.content instanceof Element?new _([this.content]):new _}get recursiveChildren(){const i=new _;return this.children.forEach((s=>{i.push(s),s.recursiveChildren.forEach((s=>{i.push(s)}))})),i}}i.exports=Element},5946:(i,s,u)=>{const m=u(17645),v=u(3079);i.exports=class MemberElement extends v{constructor(i,s,u,v){super(new m,u,v),this.element="member",this.key=i,this.value=s}get key(){return this.content.key}set key(i){this.content.key=this.refract(i)}get value(){return this.content.value}set value(i){this.content.value=this.refract(i)}}},96295:(i,s,u)=>{const m=u(3079);i.exports=class NullElement extends m{constructor(i,s,u){super(i||null,s,u),this.element="null"}primitive(){return"null"}set(){return new Error("Cannot set the value of null")}}},91090:(i,s,u)=>{const m=u(3079);i.exports=class NumberElement extends m{constructor(i,s,u){super(i,s,u),this.element="number"}primitive(){return"number"}}},76735:(i,s,u)=>{const m=u(94885),v=u(13218),_=u(35804),j=u(5946),M=u(87526);i.exports=class ObjectElement extends _{constructor(i,s,u){super(i||[],s,u),this.element="object"}primitive(){return"object"}toValue(){return this.content.reduce(((i,s)=>(i[s.key.toValue()]=s.value?s.value.toValue():void 0,i)),{})}get(i){const s=this.getMember(i);if(s)return s.value}getMember(i){if(void 0!==i)return this.content.find((s=>s.key.toValue()===i))}remove(i){let s=null;return this.content=this.content.filter((u=>u.key.toValue()!==i||(s=u,!1))),s}getKey(i){const s=this.getMember(i);if(s)return s.key}set(i,s){if(v(i))return Object.keys(i).forEach((s=>{this.set(s,i[s])})),this;const u=i,m=this.getMember(u);return m?m.value=s:this.content.push(new j(u,s)),this}keys(){return this.content.map((i=>i.key.toValue()))}values(){return this.content.map((i=>i.value.toValue()))}hasKey(i){return this.content.some((s=>s.key.equals(i)))}items(){return this.content.map((i=>[i.key.toValue(),i.value.toValue()]))}map(i,s){return this.content.map((u=>i.bind(s)(u.value,u.key,u)))}compactMap(i,s){const u=[];return this.forEach(((m,v,_)=>{const j=i.bind(s)(m,v,_);j&&u.push(j)})),u}filter(i,s){return new M(this.content).filter(i,s)}reject(i,s){return this.filter(m(i),s)}forEach(i,s){return this.content.forEach((u=>i.bind(s)(u.value,u.key,u)))}}},16036:(i,s,u)=>{const m=u(3079);i.exports=class StringElement extends m{constructor(i,s,u){super(i,s,u),this.element="string"}primitive(){return"string"}get length(){return this.content.length}}},3414:(i,s,u)=>{const m=u(28219);i.exports=class JSON06Serialiser extends m{serialise(i){if(!(i instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${i}\` is not an Element instance`);let s;i._attributes&&i.attributes.get("variable")&&(s=i.attributes.get("variable"));const u={element:i.element};i._meta&&i._meta.length>0&&(u.meta=this.serialiseObject(i.meta));const m="enum"===i.element||-1!==i.attributes.keys().indexOf("enumerations");if(m){const s=this.enumSerialiseAttributes(i);s&&(u.attributes=s)}else if(i._attributes&&i._attributes.length>0){let{attributes:m}=i;m.get("metadata")&&(m=m.clone(),m.set("meta",m.get("metadata")),m.remove("metadata")),"member"===i.element&&s&&(m=m.clone(),m.remove("variable")),m.length>0&&(u.attributes=this.serialiseObject(m))}if(m)u.content=this.enumSerialiseContent(i,u);else if(this[`${i.element}SerialiseContent`])u.content=this[`${i.element}SerialiseContent`](i,u);else if(void 0!==i.content){let m;s&&i.content.key?(m=i.content.clone(),m.key.attributes.set("variable",s),m=this.serialiseContent(m)):m=this.serialiseContent(i.content),this.shouldSerialiseContent(i,m)&&(u.content=m)}else this.shouldSerialiseContent(i,i.content)&&i instanceof this.namespace.elements.Array&&(u.content=[]);return u}shouldSerialiseContent(i,s){return"parseResult"===i.element||"httpRequest"===i.element||"httpResponse"===i.element||"category"===i.element||"link"===i.element||void 0!==s&&(!Array.isArray(s)||0!==s.length)}refSerialiseContent(i,s){return delete s.attributes,{href:i.toValue(),path:i.path.toValue()}}sourceMapSerialiseContent(i){return i.toValue()}dataStructureSerialiseContent(i){return[this.serialiseContent(i.content)]}enumSerialiseAttributes(i){const s=i.attributes.clone(),u=s.remove("enumerations")||new this.namespace.elements.Array([]),m=s.get("default");let v=s.get("samples")||new this.namespace.elements.Array([]);if(m&&m.content&&(m.content.attributes&&m.content.attributes.remove("typeAttributes"),s.set("default",new this.namespace.elements.Array([m.content]))),v.forEach((i=>{i.content&&i.content.element&&i.content.attributes.remove("typeAttributes")})),i.content&&0!==u.length&&v.unshift(i.content),v=v.map((i=>i instanceof this.namespace.elements.Array?[i]:new this.namespace.elements.Array([i.content]))),v.length&&s.set("samples",v),s.length>0)return this.serialiseObject(s)}enumSerialiseContent(i){if(i._attributes){const s=i.attributes.get("enumerations");if(s&&s.length>0)return s.content.map((i=>{const s=i.clone();return s.attributes.remove("typeAttributes"),this.serialise(s)}))}if(i.content){const s=i.content.clone();return s.attributes.remove("typeAttributes"),[this.serialise(s)]}return[]}deserialise(i){if("string"==typeof i)return new this.namespace.elements.String(i);if("number"==typeof i)return new this.namespace.elements.Number(i);if("boolean"==typeof i)return new this.namespace.elements.Boolean(i);if(null===i)return new this.namespace.elements.Null;if(Array.isArray(i))return new this.namespace.elements.Array(i.map(this.deserialise,this));const s=this.namespace.getElementClass(i.element),u=new s;u.element!==i.element&&(u.element=i.element),i.meta&&this.deserialiseObject(i.meta,u.meta),i.attributes&&this.deserialiseObject(i.attributes,u.attributes);const m=this.deserialiseContent(i.content);if(void 0===m&&null!==u.content||(u.content=m),"enum"===u.element){u.content&&u.attributes.set("enumerations",u.content);let i=u.attributes.get("samples");if(u.attributes.remove("samples"),i){const m=i;i=new this.namespace.elements.Array,m.forEach((m=>{m.forEach((m=>{const v=new s(m);v.element=u.element,i.push(v)}))}));const v=i.shift();u.content=v?v.content:void 0,u.attributes.set("samples",i)}else u.content=void 0;let m=u.attributes.get("default");if(m&&m.length>0){m=m.get(0);const i=new s(m);i.element=u.element,u.attributes.set("default",i)}}else if("dataStructure"===u.element&&Array.isArray(u.content))[u.content]=u.content;else if("category"===u.element){const i=u.attributes.get("meta");i&&(u.attributes.set("metadata",i),u.attributes.remove("meta"))}else"member"===u.element&&u.key&&u.key._attributes&&u.key._attributes.getValue("variable")&&(u.attributes.set("variable",u.key.attributes.get("variable")),u.key.attributes.remove("variable"));return u}serialiseContent(i){if(i instanceof this.namespace.elements.Element)return this.serialise(i);if(i instanceof this.namespace.KeyValuePair){const s={key:this.serialise(i.key)};return i.value&&(s.value=this.serialise(i.value)),s}return i&&i.map?i.map(this.serialise,this):i}deserialiseContent(i){if(i){if(i.element)return this.deserialise(i);if(i.key){const s=new this.namespace.KeyValuePair(this.deserialise(i.key));return i.value&&(s.value=this.deserialise(i.value)),s}if(i.map)return i.map(this.deserialise,this)}return i}shouldRefract(i){return!!(i._attributes&&i.attributes.keys().length||i._meta&&i.meta.keys().length)||"enum"!==i.element&&(i.element!==i.primitive()||"member"===i.element)}convertKeyToRefract(i,s){return this.shouldRefract(s)?this.serialise(s):"enum"===s.element?this.serialiseEnum(s):"array"===s.element?s.map((s=>this.shouldRefract(s)||"default"===i?this.serialise(s):"array"===s.element||"object"===s.element||"enum"===s.element?s.children.map((i=>this.serialise(i))):s.toValue())):"object"===s.element?(s.content||[]).map(this.serialise,this):s.toValue()}serialiseEnum(i){return i.children.map((i=>this.serialise(i)))}serialiseObject(i){const s={};return i.forEach(((i,u)=>{if(i){const m=u.toValue();s[m]=this.convertKeyToRefract(m,i)}})),s}deserialiseObject(i,s){Object.keys(i).forEach((u=>{s.set(u,this.deserialise(i[u]))}))}}},28219:i=>{i.exports=class JSONSerialiser{constructor(i){this.namespace=i||new this.Namespace}serialise(i){if(!(i instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${i}\` is not an Element instance`);const s={element:i.element};i._meta&&i._meta.length>0&&(s.meta=this.serialiseObject(i.meta)),i._attributes&&i._attributes.length>0&&(s.attributes=this.serialiseObject(i.attributes));const u=this.serialiseContent(i.content);return void 0!==u&&(s.content=u),s}deserialise(i){if(!i.element)throw new Error("Given value is not an object containing an element name");const s=new(this.namespace.getElementClass(i.element));s.element!==i.element&&(s.element=i.element),i.meta&&this.deserialiseObject(i.meta,s.meta),i.attributes&&this.deserialiseObject(i.attributes,s.attributes);const u=this.deserialiseContent(i.content);return void 0===u&&null!==s.content||(s.content=u),s}serialiseContent(i){if(i instanceof this.namespace.elements.Element)return this.serialise(i);if(i instanceof this.namespace.KeyValuePair){const s={key:this.serialise(i.key)};return i.value&&(s.value=this.serialise(i.value)),s}if(i&&i.map){if(0===i.length)return;return i.map(this.serialise,this)}return i}deserialiseContent(i){if(i){if(i.element)return this.deserialise(i);if(i.key){const s=new this.namespace.KeyValuePair(this.deserialise(i.key));return i.value&&(s.value=this.deserialise(i.value)),s}if(i.map)return i.map(this.deserialise,this)}return i}serialiseObject(i){const s={};if(i.forEach(((i,u)=>{i&&(s[u.toValue()]=this.serialise(i))})),0!==Object.keys(s).length)return s}deserialiseObject(i,s){Object.keys(i).forEach((u=>{s.set(u,this.deserialise(i[u]))}))}}},27418:i=>{"use strict";var s=Object.getOwnPropertySymbols,u=Object.prototype.hasOwnProperty,m=Object.prototype.propertyIsEnumerable;i.exports=function shouldUseNative(){try{if(!Object.assign)return!1;var i=new String("abc");if(i[5]="de","5"===Object.getOwnPropertyNames(i)[0])return!1;for(var s={},u=0;u<10;u++)s["_"+String.fromCharCode(u)]=u;if("0123456789"!==Object.getOwnPropertyNames(s).map((function(i){return s[i]})).join(""))return!1;var m={};return"abcdefghijklmnopqrst".split("").forEach((function(i){m[i]=i})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},m)).join("")}catch(i){return!1}}()?Object.assign:function(i,v){for(var _,j,M=function toObject(i){if(null==i)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(i)}(i),$=1;${var m="function"==typeof Map&&Map.prototype,v=Object.getOwnPropertyDescriptor&&m?Object.getOwnPropertyDescriptor(Map.prototype,"size"):null,_=m&&v&&"function"==typeof v.get?v.get:null,j=m&&Map.prototype.forEach,M="function"==typeof Set&&Set.prototype,$=Object.getOwnPropertyDescriptor&&M?Object.getOwnPropertyDescriptor(Set.prototype,"size"):null,W=M&&$&&"function"==typeof $.get?$.get:null,X=M&&Set.prototype.forEach,Y="function"==typeof WeakMap&&WeakMap.prototype?WeakMap.prototype.has:null,Z="function"==typeof WeakSet&&WeakSet.prototype?WeakSet.prototype.has:null,ee="function"==typeof WeakRef&&WeakRef.prototype?WeakRef.prototype.deref:null,ie=Boolean.prototype.valueOf,ae=Object.prototype.toString,ce=Function.prototype.toString,le=String.prototype.match,pe=String.prototype.slice,de=String.prototype.replace,fe=String.prototype.toUpperCase,ye=String.prototype.toLowerCase,be=RegExp.prototype.test,_e=Array.prototype.concat,we=Array.prototype.join,Se=Array.prototype.slice,xe=Math.floor,Pe="function"==typeof BigInt?BigInt.prototype.valueOf:null,Ie=Object.getOwnPropertySymbols,Te="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol.prototype.toString:null,Re="function"==typeof Symbol&&"object"==typeof Symbol.iterator,qe="function"==typeof Symbol&&Symbol.toStringTag&&(typeof Symbol.toStringTag===Re||"symbol")?Symbol.toStringTag:null,ze=Object.prototype.propertyIsEnumerable,Ve=("function"==typeof Reflect?Reflect.getPrototypeOf:Object.getPrototypeOf)||([].__proto__===Array.prototype?function(i){return i.__proto__}:null);function addNumericSeparator(i,s){if(i===1/0||i===-1/0||i!=i||i&&i>-1e3&&i<1e3||be.call(/e/,s))return s;var u=/[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;if("number"==typeof i){var m=i<0?-xe(-i):xe(i);if(m!==i){var v=String(m),_=pe.call(s,v.length+1);return de.call(v,u,"$&_")+"."+de.call(de.call(_,/([0-9]{3})/g,"$&_"),/_$/,"")}}return de.call(s,u,"$&_")}var We=u(24654),He=We.custom,Xe=isSymbol(He)?He:null;function wrapQuotes(i,s,u){var m="double"===(u.quoteStyle||s)?'"':"'";return m+i+m}function quote(i){return de.call(String(i),/"/g,""")}function isArray(i){return!("[object Array]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}function isRegExp(i){return!("[object RegExp]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}function isSymbol(i){if(Re)return i&&"object"==typeof i&&i instanceof Symbol;if("symbol"==typeof i)return!0;if(!i||"object"!=typeof i||!Te)return!1;try{return Te.call(i),!0}catch(i){}return!1}i.exports=function inspect_(i,s,u,m){var v=s||{};if(has(v,"quoteStyle")&&"single"!==v.quoteStyle&&"double"!==v.quoteStyle)throw new TypeError('option "quoteStyle" must be "single" or "double"');if(has(v,"maxStringLength")&&("number"==typeof v.maxStringLength?v.maxStringLength<0&&v.maxStringLength!==1/0:null!==v.maxStringLength))throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`');var M=!has(v,"customInspect")||v.customInspect;if("boolean"!=typeof M&&"symbol"!==M)throw new TypeError("option \"customInspect\", if provided, must be `true`, `false`, or `'symbol'`");if(has(v,"indent")&&null!==v.indent&&"\t"!==v.indent&&!(parseInt(v.indent,10)===v.indent&&v.indent>0))throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`');if(has(v,"numericSeparator")&&"boolean"!=typeof v.numericSeparator)throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`');var $=v.numericSeparator;if(void 0===i)return"undefined";if(null===i)return"null";if("boolean"==typeof i)return i?"true":"false";if("string"==typeof i)return inspectString(i,v);if("number"==typeof i){if(0===i)return 1/0/i>0?"0":"-0";var ae=String(i);return $?addNumericSeparator(i,ae):ae}if("bigint"==typeof i){var fe=String(i)+"n";return $?addNumericSeparator(i,fe):fe}var be=void 0===v.depth?5:v.depth;if(void 0===u&&(u=0),u>=be&&be>0&&"object"==typeof i)return isArray(i)?"[Array]":"[Object]";var xe=function getIndent(i,s){var u;if("\t"===i.indent)u="\t";else{if(!("number"==typeof i.indent&&i.indent>0))return null;u=we.call(Array(i.indent+1)," ")}return{base:u,prev:we.call(Array(s+1),u)}}(v,u);if(void 0===m)m=[];else if(indexOf(m,i)>=0)return"[Circular]";function inspect(i,s,_){if(s&&(m=Se.call(m)).push(s),_){var j={depth:v.depth};return has(v,"quoteStyle")&&(j.quoteStyle=v.quoteStyle),inspect_(i,j,u+1,m)}return inspect_(i,v,u+1,m)}if("function"==typeof i&&!isRegExp(i)){var Ie=function nameOf(i){if(i.name)return i.name;var s=le.call(ce.call(i),/^function\s*([\w$]+)/);if(s)return s[1];return null}(i),He=arrObjKeys(i,inspect);return"[Function"+(Ie?": "+Ie:" (anonymous)")+"]"+(He.length>0?" { "+we.call(He,", ")+" }":"")}if(isSymbol(i)){var Ye=Re?de.call(String(i),/^(Symbol\(.*\))_[^)]*$/,"$1"):Te.call(i);return"object"!=typeof i||Re?Ye:markBoxed(Ye)}if(function isElement(i){if(!i||"object"!=typeof i)return!1;if("undefined"!=typeof HTMLElement&&i instanceof HTMLElement)return!0;return"string"==typeof i.nodeName&&"function"==typeof i.getAttribute}(i)){for(var Qe="<"+ye.call(String(i.nodeName)),et=i.attributes||[],tt=0;tt"}if(isArray(i)){if(0===i.length)return"[]";var rt=arrObjKeys(i,inspect);return xe&&!function singleLineValues(i){for(var s=0;s=0)return!1;return!0}(rt)?"["+indentedJoin(rt,xe)+"]":"[ "+we.call(rt,", ")+" ]"}if(function isError(i){return!("[object Error]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i)){var nt=arrObjKeys(i,inspect);return"cause"in Error.prototype||!("cause"in i)||ze.call(i,"cause")?0===nt.length?"["+String(i)+"]":"{ ["+String(i)+"] "+we.call(nt,", ")+" }":"{ ["+String(i)+"] "+we.call(_e.call("[cause]: "+inspect(i.cause),nt),", ")+" }"}if("object"==typeof i&&M){if(Xe&&"function"==typeof i[Xe]&&We)return We(i,{depth:be-u});if("symbol"!==M&&"function"==typeof i.inspect)return i.inspect()}if(function isMap(i){if(!_||!i||"object"!=typeof i)return!1;try{_.call(i);try{W.call(i)}catch(i){return!0}return i instanceof Map}catch(i){}return!1}(i)){var ot=[];return j&&j.call(i,(function(s,u){ot.push(inspect(u,i,!0)+" => "+inspect(s,i))})),collectionOf("Map",_.call(i),ot,xe)}if(function isSet(i){if(!W||!i||"object"!=typeof i)return!1;try{W.call(i);try{_.call(i)}catch(i){return!0}return i instanceof Set}catch(i){}return!1}(i)){var it=[];return X&&X.call(i,(function(s){it.push(inspect(s,i))})),collectionOf("Set",W.call(i),it,xe)}if(function isWeakMap(i){if(!Y||!i||"object"!=typeof i)return!1;try{Y.call(i,Y);try{Z.call(i,Z)}catch(i){return!0}return i instanceof WeakMap}catch(i){}return!1}(i))return weakCollectionOf("WeakMap");if(function isWeakSet(i){if(!Z||!i||"object"!=typeof i)return!1;try{Z.call(i,Z);try{Y.call(i,Y)}catch(i){return!0}return i instanceof WeakSet}catch(i){}return!1}(i))return weakCollectionOf("WeakSet");if(function isWeakRef(i){if(!ee||!i||"object"!=typeof i)return!1;try{return ee.call(i),!0}catch(i){}return!1}(i))return weakCollectionOf("WeakRef");if(function isNumber(i){return!("[object Number]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i))return markBoxed(inspect(Number(i)));if(function isBigInt(i){if(!i||"object"!=typeof i||!Pe)return!1;try{return Pe.call(i),!0}catch(i){}return!1}(i))return markBoxed(inspect(Pe.call(i)));if(function isBoolean(i){return!("[object Boolean]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i))return markBoxed(ie.call(i));if(function isString(i){return!("[object String]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i))return markBoxed(inspect(String(i)));if(!function isDate(i){return!("[object Date]"!==toStr(i)||qe&&"object"==typeof i&&qe in i)}(i)&&!isRegExp(i)){var at=arrObjKeys(i,inspect),st=Ve?Ve(i)===Object.prototype:i instanceof Object||i.constructor===Object,ct=i instanceof Object?"":"null prototype",lt=!st&&qe&&Object(i)===i&&qe in i?pe.call(toStr(i),8,-1):ct?"Object":"",ut=(st||"function"!=typeof i.constructor?"":i.constructor.name?i.constructor.name+" ":"")+(lt||ct?"["+we.call(_e.call([],lt||[],ct||[]),": ")+"] ":"");return 0===at.length?ut+"{}":xe?ut+"{"+indentedJoin(at,xe)+"}":ut+"{ "+we.call(at,", ")+" }"}return String(i)};var Ye=Object.prototype.hasOwnProperty||function(i){return i in this};function has(i,s){return Ye.call(i,s)}function toStr(i){return ae.call(i)}function indexOf(i,s){if(i.indexOf)return i.indexOf(s);for(var u=0,m=i.length;us.maxStringLength){var u=i.length-s.maxStringLength,m="... "+u+" more character"+(u>1?"s":"");return inspectString(pe.call(i,0,s.maxStringLength),s)+m}return wrapQuotes(de.call(de.call(i,/(['\\])/g,"\\$1"),/[\x00-\x1f]/g,lowbyte),"single",s)}function lowbyte(i){var s=i.charCodeAt(0),u={8:"b",9:"t",10:"n",12:"f",13:"r"}[s];return u?"\\"+u:"\\x"+(s<16?"0":"")+fe.call(s.toString(16))}function markBoxed(i){return"Object("+i+")"}function weakCollectionOf(i){return i+" { ? }"}function collectionOf(i,s,u,m){return i+" ("+s+") {"+(m?indentedJoin(u,m):we.call(u,", "))+"}"}function indentedJoin(i,s){if(0===i.length)return"";var u="\n"+s.prev+s.base;return u+we.call(i,","+u)+"\n"+s.prev}function arrObjKeys(i,s){var u=isArray(i),m=[];if(u){m.length=i.length;for(var v=0;v{var s,u,m=i.exports={};function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}function runTimeout(i){if(s===setTimeout)return setTimeout(i,0);if((s===defaultSetTimout||!s)&&setTimeout)return s=setTimeout,setTimeout(i,0);try{return s(i,0)}catch(u){try{return s.call(null,i,0)}catch(u){return s.call(this,i,0)}}}!function(){try{s="function"==typeof setTimeout?setTimeout:defaultSetTimout}catch(i){s=defaultSetTimout}try{u="function"==typeof clearTimeout?clearTimeout:defaultClearTimeout}catch(i){u=defaultClearTimeout}}();var v,_=[],j=!1,M=-1;function cleanUpNextTick(){j&&v&&(j=!1,v.length?_=v.concat(_):M=-1,_.length&&drainQueue())}function drainQueue(){if(!j){var i=runTimeout(cleanUpNextTick);j=!0;for(var s=_.length;s;){for(v=_,_=[];++M1)for(var u=1;u{"use strict";var m=u(50414);function emptyFunction(){}function emptyFunctionWithReset(){}emptyFunctionWithReset.resetWarningCache=emptyFunction,i.exports=function(){function shim(i,s,u,v,_,j){if(j!==m){var M=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw M.name="Invariant Violation",M}}function getShim(){return shim}shim.isRequired=shim;var i={array:shim,bigint:shim,bool:shim,func:shim,number:shim,object:shim,string:shim,symbol:shim,any:shim,arrayOf:getShim,element:shim,elementType:shim,instanceOf:getShim,node:shim,objectOf:getShim,oneOf:getShim,oneOfType:getShim,shape:getShim,exact:getShim,checkPropTypes:emptyFunctionWithReset,resetWarningCache:emptyFunction};return i.PropTypes=i,i}},45697:(i,s,u)=>{i.exports=u(92703)()},50414:i=>{"use strict";i.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},55798:i=>{"use strict";var s=String.prototype.replace,u=/%20/g,m="RFC1738",v="RFC3986";i.exports={default:v,formatters:{RFC1738:function(i){return s.call(i,u,"+")},RFC3986:function(i){return String(i)}},RFC1738:m,RFC3986:v}},80129:(i,s,u)=>{"use strict";var m=u(58261),v=u(55235),_=u(55798);i.exports={formats:_,parse:v,stringify:m}},55235:(i,s,u)=>{"use strict";var m=u(12769),v=Object.prototype.hasOwnProperty,_=Array.isArray,j={allowDots:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decoder:m.decode,delimiter:"&",depth:5,ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictNullHandling:!1},interpretNumericEntities=function(i){return i.replace(/&#(\d+);/g,(function(i,s){return String.fromCharCode(parseInt(s,10))}))},parseArrayValue=function(i,s){return i&&"string"==typeof i&&s.comma&&i.indexOf(",")>-1?i.split(","):i},M=function parseQueryStringKeys(i,s,u,m){if(i){var _=u.allowDots?i.replace(/\.([^.[]+)/g,"[$1]"):i,j=/(\[[^[\]]*])/g,M=u.depth>0&&/(\[[^[\]]*])/.exec(_),$=M?_.slice(0,M.index):_,W=[];if($){if(!u.plainObjects&&v.call(Object.prototype,$)&&!u.allowPrototypes)return;W.push($)}for(var X=0;u.depth>0&&null!==(M=j.exec(_))&&X=0;--_){var j,M=i[_];if("[]"===M&&u.parseArrays)j=[].concat(v);else{j=u.plainObjects?Object.create(null):{};var $="["===M.charAt(0)&&"]"===M.charAt(M.length-1)?M.slice(1,-1):M,W=parseInt($,10);u.parseArrays||""!==$?!isNaN(W)&&M!==$&&String(W)===$&&W>=0&&u.parseArrays&&W<=u.arrayLimit?(j=[])[W]=v:"__proto__"!==$&&(j[$]=v):j={0:v}}v=j}return v}(W,s,u,m)}};i.exports=function(i,s){var u=function normalizeParseOptions(i){if(!i)return j;if(null!==i.decoder&&void 0!==i.decoder&&"function"!=typeof i.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==i.charset&&"utf-8"!==i.charset&&"iso-8859-1"!==i.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var s=void 0===i.charset?j.charset:i.charset;return{allowDots:void 0===i.allowDots?j.allowDots:!!i.allowDots,allowPrototypes:"boolean"==typeof i.allowPrototypes?i.allowPrototypes:j.allowPrototypes,allowSparse:"boolean"==typeof i.allowSparse?i.allowSparse:j.allowSparse,arrayLimit:"number"==typeof i.arrayLimit?i.arrayLimit:j.arrayLimit,charset:s,charsetSentinel:"boolean"==typeof i.charsetSentinel?i.charsetSentinel:j.charsetSentinel,comma:"boolean"==typeof i.comma?i.comma:j.comma,decoder:"function"==typeof i.decoder?i.decoder:j.decoder,delimiter:"string"==typeof i.delimiter||m.isRegExp(i.delimiter)?i.delimiter:j.delimiter,depth:"number"==typeof i.depth||!1===i.depth?+i.depth:j.depth,ignoreQueryPrefix:!0===i.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof i.interpretNumericEntities?i.interpretNumericEntities:j.interpretNumericEntities,parameterLimit:"number"==typeof i.parameterLimit?i.parameterLimit:j.parameterLimit,parseArrays:!1!==i.parseArrays,plainObjects:"boolean"==typeof i.plainObjects?i.plainObjects:j.plainObjects,strictNullHandling:"boolean"==typeof i.strictNullHandling?i.strictNullHandling:j.strictNullHandling}}(s);if(""===i||null==i)return u.plainObjects?Object.create(null):{};for(var $="string"==typeof i?function parseQueryStringValues(i,s){var u,M={},$=s.ignoreQueryPrefix?i.replace(/^\?/,""):i,W=s.parameterLimit===1/0?void 0:s.parameterLimit,X=$.split(s.delimiter,W),Y=-1,Z=s.charset;if(s.charsetSentinel)for(u=0;u-1&&(ie=_(ie)?[ie]:ie),v.call(M,ee)?M[ee]=m.combine(M[ee],ie):M[ee]=ie}return M}(i,u):i,W=u.plainObjects?Object.create(null):{},X=Object.keys($),Y=0;Y{"use strict";var m=u(37478),v=u(12769),_=u(55798),j=Object.prototype.hasOwnProperty,M={brackets:function brackets(i){return i+"[]"},comma:"comma",indices:function indices(i,s){return i+"["+s+"]"},repeat:function repeat(i){return i}},$=Array.isArray,W=String.prototype.split,X=Array.prototype.push,pushToArray=function(i,s){X.apply(i,$(s)?s:[s])},Y=Date.prototype.toISOString,Z=_.default,ee={addQueryPrefix:!1,allowDots:!1,charset:"utf-8",charsetSentinel:!1,delimiter:"&",encode:!0,encoder:v.encode,encodeValuesOnly:!1,format:Z,formatter:_.formatters[Z],indices:!1,serializeDate:function serializeDate(i){return Y.call(i)},skipNulls:!1,strictNullHandling:!1},ie={},ae=function stringify(i,s,u,_,j,M,X,Y,Z,ae,ce,le,pe,de,fe,ye){for(var be=i,_e=ye,we=0,Se=!1;void 0!==(_e=_e.get(ie))&&!Se;){var xe=_e.get(i);if(we+=1,void 0!==xe){if(xe===we)throw new RangeError("Cyclic object value");Se=!0}void 0===_e.get(ie)&&(we=0)}if("function"==typeof Y?be=Y(s,be):be instanceof Date?be=ce(be):"comma"===u&&$(be)&&(be=v.maybeMap(be,(function(i){return i instanceof Date?ce(i):i}))),null===be){if(j)return X&&!de?X(s,ee.encoder,fe,"key",le):s;be=""}if(function isNonNullishPrimitive(i){return"string"==typeof i||"number"==typeof i||"boolean"==typeof i||"symbol"==typeof i||"bigint"==typeof i}(be)||v.isBuffer(be)){if(X){var Pe=de?s:X(s,ee.encoder,fe,"key",le);if("comma"===u&&de){for(var Ie=W.call(String(be),","),Te="",Re=0;Re0?be.join(",")||null:void 0}];else if($(Y))qe=Y;else{var Ve=Object.keys(be);qe=Z?Ve.sort(Z):Ve}for(var We=_&&$(be)&&1===be.length?s+"[]":s,He=0;He0?fe+de:""}},12769:(i,s,u)=>{"use strict";var m=u(55798),v=Object.prototype.hasOwnProperty,_=Array.isArray,j=function(){for(var i=[],s=0;s<256;++s)i.push("%"+((s<16?"0":"")+s.toString(16)).toUpperCase());return i}(),M=function arrayToObject(i,s){for(var u=s&&s.plainObjects?Object.create(null):{},m=0;m1;){var s=i.pop(),u=s.obj[s.prop];if(_(u)){for(var m=[],v=0;v=48&&X<=57||X>=65&&X<=90||X>=97&&X<=122||_===m.RFC1738&&(40===X||41===X)?$+=M.charAt(W):X<128?$+=j[X]:X<2048?$+=j[192|X>>6]+j[128|63&X]:X<55296||X>=57344?$+=j[224|X>>12]+j[128|X>>6&63]+j[128|63&X]:(W+=1,X=65536+((1023&X)<<10|1023&M.charCodeAt(W)),$+=j[240|X>>18]+j[128|X>>12&63]+j[128|X>>6&63]+j[128|63&X])}return $},isBuffer:function isBuffer(i){return!(!i||"object"!=typeof i)&&!!(i.constructor&&i.constructor.isBuffer&&i.constructor.isBuffer(i))},isRegExp:function isRegExp(i){return"[object RegExp]"===Object.prototype.toString.call(i)},maybeMap:function maybeMap(i,s){if(_(i)){for(var u=[],m=0;m{"use strict";var u=Object.prototype.hasOwnProperty;function decode(i){try{return decodeURIComponent(i.replace(/\+/g," "))}catch(i){return null}}function encode(i){try{return encodeURIComponent(i)}catch(i){return null}}s.stringify=function querystringify(i,s){s=s||"";var m,v,_=[];for(v in"string"!=typeof s&&(s="?"),i)if(u.call(i,v)){if((m=i[v])||null!=m&&!isNaN(m)||(m=""),v=encode(v),m=encode(m),null===v||null===m)continue;_.push(v+"="+m)}return _.length?s+_.join("&"):""},s.parse=function querystring(i){for(var s,u=/([^=?#&]+)=?([^&]*)/g,m={};s=u.exec(i);){var v=decode(s[1]),_=decode(s[2]);null===v||null===_||v in m||(m[v]=_)}return m}},14419:(i,s,u)=>{const m=u(60697),v=u(69450),_=m.types;i.exports=class RandExp{constructor(i,s){if(this._setDefaults(i),i instanceof RegExp)this.ignoreCase=i.ignoreCase,this.multiline=i.multiline,i=i.source;else{if("string"!=typeof i)throw new Error("Expected a regexp or string");this.ignoreCase=s&&-1!==s.indexOf("i"),this.multiline=s&&-1!==s.indexOf("m")}this.tokens=m(i)}_setDefaults(i){this.max=null!=i.max?i.max:null!=RandExp.prototype.max?RandExp.prototype.max:100,this.defaultRange=i.defaultRange?i.defaultRange:this.defaultRange.clone(),i.randInt&&(this.randInt=i.randInt)}gen(){return this._gen(this.tokens,[])}_gen(i,s){var u,m,v,j,M;switch(i.type){case _.ROOT:case _.GROUP:if(i.followedBy||i.notFollowedBy)return"";for(i.remember&&void 0===i.groupNumber&&(i.groupNumber=s.push(null)-1),m="",j=0,M=(u=i.options?this._randSelect(i.options):i.stack).length;j{"use strict";var m=u(34155),v=65536,_=4294967295;var j=u(89509).Buffer,M=u.g.crypto||u.g.msCrypto;M&&M.getRandomValues?i.exports=function randomBytes(i,s){if(i>_)throw new RangeError("requested too many random bytes");var u=j.allocUnsafe(i);if(i>0)if(i>v)for(var $=0;${"use strict";function _typeof(i){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},_typeof(i)}Object.defineProperty(s,"__esModule",{value:!0}),s.CopyToClipboard=void 0;var m=_interopRequireDefault(u(67294)),v=_interopRequireDefault(u(20640)),_=["text","onCopy","options","children"];function _interopRequireDefault(i){return i&&i.__esModule?i:{default:i}}function ownKeys(i,s){var u=Object.keys(i);if(Object.getOwnPropertySymbols){var m=Object.getOwnPropertySymbols(i);s&&(m=m.filter((function(s){return Object.getOwnPropertyDescriptor(i,s).enumerable}))),u.push.apply(u,m)}return u}function _objectSpread(i){for(var s=1;s=0||(v[u]=i[u]);return v}(i,s);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(i);for(m=0;m<_.length;m++)u=_[m],s.indexOf(u)>=0||Object.prototype.propertyIsEnumerable.call(i,u)&&(v[u]=i[u])}return v}function _defineProperties(i,s){for(var u=0;u{"use strict";var m=u(74300).CopyToClipboard;m.CopyToClipboard=m,i.exports=m},53441:(i,s,u)=>{"use strict";function _typeof(i){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(i){return typeof i}:function(i){return i&&"function"==typeof Symbol&&i.constructor===Symbol&&i!==Symbol.prototype?"symbol":typeof i},_typeof(i)}Object.defineProperty(s,"__esModule",{value:!0}),s.DebounceInput=void 0;var m=_interopRequireDefault(u(67294)),v=_interopRequireDefault(u(91296)),_=["element","onChange","value","minLength","debounceTimeout","forceNotifyByEnter","forceNotifyOnBlur","onKeyDown","onBlur","inputRef"];function _interopRequireDefault(i){return i&&i.__esModule?i:{default:i}}function _objectWithoutProperties(i,s){if(null==i)return{};var u,m,v=function _objectWithoutPropertiesLoose(i,s){if(null==i)return{};var u,m,v={},_=Object.keys(i);for(m=0;m<_.length;m++)u=_[m],s.indexOf(u)>=0||(v[u]=i[u]);return v}(i,s);if(Object.getOwnPropertySymbols){var _=Object.getOwnPropertySymbols(i);for(m=0;m<_.length;m++)u=_[m],s.indexOf(u)>=0||Object.prototype.propertyIsEnumerable.call(i,u)&&(v[u]=i[u])}return v}function ownKeys(i,s){var u=Object.keys(i);if(Object.getOwnPropertySymbols){var m=Object.getOwnPropertySymbols(i);s&&(m=m.filter((function(s){return Object.getOwnPropertyDescriptor(i,s).enumerable}))),u.push.apply(u,m)}return u}function _objectSpread(i){for(var s=1;s=m?u.notify(i):s.length>v.length&&u.notify(_objectSpread(_objectSpread({},i),{},{target:_objectSpread(_objectSpread({},i.target),{},{value:""})}))}))})),_defineProperty(_assertThisInitialized(u),"onKeyDown",(function(i){"Enter"===i.key&&u.forceNotify(i);var s=u.props.onKeyDown;s&&(i.persist(),s(i))})),_defineProperty(_assertThisInitialized(u),"onBlur",(function(i){u.forceNotify(i);var s=u.props.onBlur;s&&(i.persist(),s(i))})),_defineProperty(_assertThisInitialized(u),"createNotifier",(function(i){if(i<0)u.notify=function(){return null};else if(0===i)u.notify=u.doNotify;else{var s=(0,v.default)((function(i){u.isDebouncing=!1,u.doNotify(i)}),i);u.notify=function(i){u.isDebouncing=!0,s(i)},u.flush=function(){return s.flush()},u.cancel=function(){u.isDebouncing=!1,s.cancel()}}})),_defineProperty(_assertThisInitialized(u),"doNotify",(function(){u.props.onChange.apply(void 0,arguments)})),_defineProperty(_assertThisInitialized(u),"forceNotify",(function(i){var s=u.props.debounceTimeout;if(u.isDebouncing||!(s>0)){u.cancel&&u.cancel();var m=u.state.value,v=u.props.minLength;m.length>=v?u.doNotify(i):u.doNotify(_objectSpread(_objectSpread({},i),{},{target:_objectSpread(_objectSpread({},i.target),{},{value:m})}))}})),u.isDebouncing=!1,u.state={value:void 0===i.value||null===i.value?"":i.value};var m=u.props.debounceTimeout;return u.createNotifier(m),u}return function _createClass(i,s,u){return s&&_defineProperties(i.prototype,s),u&&_defineProperties(i,u),Object.defineProperty(i,"prototype",{writable:!1}),i}(DebounceInput,[{key:"componentDidUpdate",value:function componentDidUpdate(i){if(!this.isDebouncing){var s=this.props,u=s.value,m=s.debounceTimeout,v=i.debounceTimeout,_=i.value,j=this.state.value;void 0!==u&&_!==u&&j!==u&&this.setState({value:u}),m!==v&&this.createNotifier(m)}}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.flush&&this.flush()}},{key:"render",value:function render(){var i,s,u=this.props,v=u.element,j=(u.onChange,u.value,u.minLength,u.debounceTimeout,u.forceNotifyByEnter),M=u.forceNotifyOnBlur,$=u.onKeyDown,W=u.onBlur,X=u.inputRef,Y=_objectWithoutProperties(u,_),Z=this.state.value;i=j?{onKeyDown:this.onKeyDown}:$?{onKeyDown:$}:{},s=M?{onBlur:this.onBlur}:W?{onBlur:W}:{};var ee=X?{ref:X}:{};return m.default.createElement(v,_objectSpread(_objectSpread(_objectSpread(_objectSpread({},Y),{},{onChange:this.onChange,value:Z},i),s),ee))}}]),DebounceInput}(m.default.PureComponent);s.DebounceInput=j,_defineProperty(j,"defaultProps",{element:"input",type:"text",onKeyDown:void 0,onBlur:void 0,value:void 0,minLength:0,debounceTimeout:100,forceNotifyByEnter:!0,forceNotifyOnBlur:!0,inputRef:void 0})},775:(i,s,u)=>{"use strict";var m=u(53441).DebounceInput;m.DebounceInput=m,i.exports=m},64448:(i,s,u)=>{"use strict";var m=u(67294),v=u(27418),_=u(63840);function y(i){for(var s="https://reactjs.org/docs/error-decoder.html?invariant="+i,u=1;u