From 5ac75512f483778cb93e64c27379aaa613fc9f30 Mon Sep 17 00:00:00 2001 From: Trinh Dai Phuc <1653068@student.hcmus.edu.vn> Date: Sat, 22 Aug 2020 14:03:28 +0700 Subject: [PATCH] Set up envoy and make file for easy docker-compose run and build --- Dockerfile.app | 2 - Makefile | 22 +++++- clients/index.html | 31 +++++++++ clients/main.go | 45 +++++++++++++ docker-compose.yml | 20 ++++-- envoy-proxy.yaml | 64 ++++++++++++++++++ protos/entity.pb.go | 150 +++++++++++++++++++++-------------------- protos/entity.pb.gw.go | 3 +- protos/entity.proto | 3 +- protos/proto.pb | Bin 0 -> 70199 bytes services/listEntity.go | 3 +- 11 files changed, 259 insertions(+), 84 deletions(-) create mode 100644 clients/index.html create mode 100644 clients/main.go create mode 100644 envoy-proxy.yaml create mode 100644 protos/proto.pb diff --git a/Dockerfile.app b/Dockerfile.app index 7d2f0cc7..351bcf30 100644 --- a/Dockerfile.app +++ b/Dockerfile.app @@ -16,6 +16,4 @@ WORKDIR /app COPY --from=build /app/src/bin/ /app/ -RUN ls - ENTRYPOINT ["/app/server"] diff --git a/Makefile b/Makefile index 7794e18a..6efa8940 100644 --- a/Makefile +++ b/Makefile @@ -3,14 +3,32 @@ pb: -Ithird_party/googleapis \ -Ithird_party/grpc-gateway \ --go_out=plugins=grpc:protos/ \ - --grpc-gateway_out=logtostderr=true:protos/ + --grpc-gateway_out=logtostderr=true:protos/ \ + --include_imports --include_source_info \ + --descriptor_set_out=protos/proto.pb build: - go build -o bin/grpc-service main.go - go build -o bin/gateway gateway/main.go + - go build -o bin/client clients/main.go + +client: + - ./bin/client grpc-service: - ./bin/grpc-service gateway-service: - - ./bin/gateway \ No newline at end of file + - ./bin/gateway + +dc-gateway: + - docker-compose up grpc_gateway grpc_app mongo + +dc-gateway-build: + - docker-compose --build up grpc_gateway grpc_app mongo + +dc-envoy: + - docker-compose up envoy-proxy grpc_app mongo + +dc-envoy-build: + - docker-compose up --build envoy-proxy grpc_app mongo \ No newline at end of file diff --git a/clients/index.html b/clients/index.html new file mode 100644 index 00000000..122677d0 --- /dev/null +++ b/clients/index.html @@ -0,0 +1,31 @@ + + + + + + + + + GRPC chat + + + +
+ +
+ + + + + + \ No newline at end of file diff --git a/clients/main.go b/clients/main.go new file mode 100644 index 00000000..ebd6311d --- /dev/null +++ b/clients/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "context" + "io" + "log" + "os" + + "github.com/joho/godotenv" + pb "github.com/trinhdaiphuc/Example-CRUD-with-Mongo-use-http-transcoding-to-gRPC/protos" + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/emptypb" +) + +func main() { + var conn *grpc.ClientConn + + err := godotenv.Load() + + conn, err = grpc.Dial(os.Getenv("SERVER_HOST"), grpc.WithInsecure()) + log.Println("Host: ", os.Getenv("SERVER_HOST")) + if err != nil { + log.Fatalf("Did not connect %s ", err) + } + defer conn.Close() + + client := pb.NewEntityServiceClient(conn) + + response, err := client.ListEntities(context.Background(), &emptypb.Empty{}) + + if err != nil { + log.Fatalf("Error when calling ListEntities: %s", err) + } + + for { + entities, err := response.Recv() + if err == io.EOF { + break + } + if err != nil { + log.Fatalf("%v.ListEntities(_) = _, %v", client, err) + } + log.Println(entities) + } +} diff --git a/docker-compose.yml b/docker-compose.yml index 9c6a5c10..e3b47286 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,12 +1,24 @@ version: "3" services: + envoy-proxy: + image: envoyproxy/envoy-dev + ports: + - 8080:51051 + volumes: + - ./protos/proto.pb:/data/proto.pb + - ./envoy-proxy.yaml:/etc/envoy/envoy.yaml + depends_on: + - grpc_app + environment: + - GRPC_VERBOSITY=debug + grpc_app: build: dockerfile: Dockerfile.app context: . volumes: - - ./server:/app/src/server + - .:/app/src/server depends_on: - mongo ports: @@ -30,11 +42,11 @@ services: - ENTITY_SERVER_HOST=grpc_app:50051 mongo: - image: "mongo:4.2.1" + image: mongo:latest volumes: - - "mongo:/data/db" + - mongo:/data/db ports: - - "27100:27017" + - 27100:27017 volumes: mongo: diff --git a/envoy-proxy.yaml b/envoy-proxy.yaml new file mode 100644 index 00000000..1eecd918 --- /dev/null +++ b/envoy-proxy.yaml @@ -0,0 +1,64 @@ +admin: + access_log_path: /tmp/admin_access.log + address: + socket_address: { address: 0.0.0.0, port_value: 9901 } + +static_resources: + listeners: + - name: service-entity-http-listeners + address: + socket_address: { address: 0.0.0.0, port_value: 51051 } + filter_chains: + - filters: + - name: envoy.filters.network.http_connection_manager + typed_config: + "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager + stat_prefix: grpc_json + codec_type: AUTO + route_config: + name: local_route + virtual_hosts: + - name: local_service + domains: ["*"] + cors: + allow_origin_string_match: + - safe_regex: + google_re2: {} + regex: \* + allow_methods: "GET, POST, PUT, DELETE" + filter_enabled: + default_value: + numerator: 100 + denominator: HUNDRED + runtime_key: cors.www.enabled + shadow_enabled: + default_value: + numerator: 0 + denominator: HUNDRED + runtime_key: cors.www.shadow_enabled + routes: + - match: { prefix: "/entity.EntityService", grpc: {} } + route: { cluster: grpc-backend-services, timeout: { seconds: 60 } } + http_filters: + - name: envoy.filters.http.grpc_json_transcoder + config: + proto_descriptor: "/data/proto.pb" + services: ["entity.EntityService"] + print_options: + add_whitespace: true + always_print_primitive_fields: true + always_print_enums_as_ints: false + preserve_proto_field_names: true + - name: envoy.filters.http.cors + - name: envoy.filters.http.router + + clusters: + - name: grpc-backend-services + connect_timeout: 1.25s + type: logical_dns + lb_policy: round_robin + http2_protocol_options: {} + hosts: + - socket_address: + address: grpc_app + port_value: 50051 diff --git a/protos/entity.pb.go b/protos/entity.pb.go index f959124d..fcc66809 100644 --- a/protos/entity.pb.go +++ b/protos/entity.pb.go @@ -9,6 +9,7 @@ package entity import ( context "context" proto "github.com/golang/protobuf/proto" + empty "github.com/golang/protobuf/ptypes/empty" _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" @@ -578,74 +579,76 @@ var file_entity_proto_rawDesc = []byte{ 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 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, 0x22, 0x60, 0x0a, 0x06, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x39, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x22, 0x39, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x52, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 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, 0x22, 0x60, 0x0a, 0x06, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x22, 0x39, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, + 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x39, + 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x49, 0x0a, 0x0f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x06, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x22, 0x39, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, + 0x1f, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x37, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x21, 0x0a, 0x0f, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x0f, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x4c, 0x69, 0x73, + 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x22, 0x39, 0x0a, 0x0f, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, - 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x39, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x22, 0x1f, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x22, 0x37, 0x0a, 0x0d, 0x52, 0x65, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x52, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x21, 0x0a, 0x0f, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x2b, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x11, 0x0a, 0x0f, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x22, - 0x39, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x12, 0x26, 0x0a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x32, 0xd3, 0x03, 0x0a, 0x0d, 0x45, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0c, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x17, 0x2e, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x22, 0x19, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x09, 0x2f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x3a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x52, 0x0a, 0x0a, 0x52, 0x65, 0x61, - 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x15, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x2e, 0x52, 0x65, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x15, - 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x52, 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x60, 0x0a, - 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x17, 0x2e, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x0e, 0x2f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, - 0x58, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, - 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x2a, 0x0e, 0x2f, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x55, 0x0a, 0x0c, 0x4c, 0x69, 0x73, - 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x22, 0x11, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x30, 0x01, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x32, 0xd2, 0x03, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0c, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x22, 0x19, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x13, 0x22, 0x09, 0x2f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3a, 0x06, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x52, 0x0a, 0x0a, 0x52, 0x65, 0x61, 0x64, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x15, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x65, + 0x61, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x60, 0x0a, 0x0c, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x17, 0x2e, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x1a, 0x0e, 0x2f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2f, + 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x58, 0x0a, 0x0c, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x17, 0x2e, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x2a, 0x0e, 0x2f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x54, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x69, 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, 0x17, + 0x2e, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, + 0x09, 0x2f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x30, 0x01, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -673,6 +676,7 @@ var file_entity_proto_goTypes = []interface{}{ (*DeleteEntityRes)(nil), // 8: entity.DeleteEntityRes (*ListEntitiesReq)(nil), // 9: entity.ListEntitiesReq (*ListEntitiesRes)(nil), // 10: entity.ListEntitiesRes + (*empty.Empty)(nil), // 11: google.protobuf.Empty } var file_entity_proto_depIdxs = []int32{ 0, // 0: entity.CreateEntityReq.entity:type_name -> entity.Entity @@ -685,7 +689,7 @@ var file_entity_proto_depIdxs = []int32{ 5, // 7: entity.EntityService.ReadEntity:input_type -> entity.ReadEntityReq 3, // 8: entity.EntityService.UpdateEntity:input_type -> entity.UpdateEntityReq 7, // 9: entity.EntityService.DeleteEntity:input_type -> entity.DeleteEntityReq - 9, // 10: entity.EntityService.ListEntities:input_type -> entity.ListEntitiesReq + 11, // 10: entity.EntityService.ListEntities:input_type -> google.protobuf.Empty 2, // 11: entity.EntityService.CreateEntity:output_type -> entity.CreateEntityRes 6, // 12: entity.EntityService.ReadEntity:output_type -> entity.ReadEntityRes 4, // 13: entity.EntityService.UpdateEntity:output_type -> entity.UpdateEntityRes @@ -873,7 +877,7 @@ type EntityServiceClient interface { ReadEntity(ctx context.Context, in *ReadEntityReq, opts ...grpc.CallOption) (*ReadEntityRes, error) UpdateEntity(ctx context.Context, in *UpdateEntityReq, opts ...grpc.CallOption) (*UpdateEntityRes, error) DeleteEntity(ctx context.Context, in *DeleteEntityReq, opts ...grpc.CallOption) (*DeleteEntityRes, error) - ListEntities(ctx context.Context, in *ListEntitiesReq, opts ...grpc.CallOption) (EntityService_ListEntitiesClient, error) + ListEntities(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (EntityService_ListEntitiesClient, error) } type entityServiceClient struct { @@ -920,7 +924,7 @@ func (c *entityServiceClient) DeleteEntity(ctx context.Context, in *DeleteEntity return out, nil } -func (c *entityServiceClient) ListEntities(ctx context.Context, in *ListEntitiesReq, opts ...grpc.CallOption) (EntityService_ListEntitiesClient, error) { +func (c *entityServiceClient) ListEntities(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (EntityService_ListEntitiesClient, error) { stream, err := c.cc.NewStream(ctx, &_EntityService_serviceDesc.Streams[0], "/entity.EntityService/ListEntities", opts...) if err != nil { return nil, err @@ -958,7 +962,7 @@ type EntityServiceServer interface { ReadEntity(context.Context, *ReadEntityReq) (*ReadEntityRes, error) UpdateEntity(context.Context, *UpdateEntityReq) (*UpdateEntityRes, error) DeleteEntity(context.Context, *DeleteEntityReq) (*DeleteEntityRes, error) - ListEntities(*ListEntitiesReq, EntityService_ListEntitiesServer) error + ListEntities(*empty.Empty, EntityService_ListEntitiesServer) error } // UnimplementedEntityServiceServer can be embedded to have forward compatible implementations. @@ -977,7 +981,7 @@ func (*UnimplementedEntityServiceServer) UpdateEntity(context.Context, *UpdateEn func (*UnimplementedEntityServiceServer) DeleteEntity(context.Context, *DeleteEntityReq) (*DeleteEntityRes, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteEntity not implemented") } -func (*UnimplementedEntityServiceServer) ListEntities(*ListEntitiesReq, EntityService_ListEntitiesServer) error { +func (*UnimplementedEntityServiceServer) ListEntities(*empty.Empty, EntityService_ListEntitiesServer) error { return status.Errorf(codes.Unimplemented, "method ListEntities not implemented") } @@ -1058,7 +1062,7 @@ func _EntityService_DeleteEntity_Handler(srv interface{}, ctx context.Context, d } func _EntityService_ListEntities_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(ListEntitiesReq) + m := new(empty.Empty) if err := stream.RecvMsg(m); err != nil { return err } diff --git a/protos/entity.pb.gw.go b/protos/entity.pb.gw.go index 216da407..b358eac1 100644 --- a/protos/entity.pb.gw.go +++ b/protos/entity.pb.gw.go @@ -15,6 +15,7 @@ import ( "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" + "github.com/golang/protobuf/ptypes/empty" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" "google.golang.org/grpc" @@ -244,7 +245,7 @@ func local_request_EntityService_DeleteEntity_0(ctx context.Context, marshaler r } func request_EntityService_ListEntities_0(ctx context.Context, marshaler runtime.Marshaler, client EntityServiceClient, req *http.Request, pathParams map[string]string) (EntityService_ListEntitiesClient, runtime.ServerMetadata, error) { - var protoReq ListEntitiesReq + var protoReq empty.Empty var metadata runtime.ServerMetadata stream, err := client.ListEntities(ctx, &protoReq) diff --git a/protos/entity.proto b/protos/entity.proto index e3fecc20..15654b4c 100644 --- a/protos/entity.proto +++ b/protos/entity.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package entity; import "google/api/annotations.proto"; +import "google/protobuf/empty.proto"; // The entity service definition with http transcoding service EntityService { @@ -28,7 +29,7 @@ service EntityService { delete: "/entities/{id}" }; } - rpc ListEntities(ListEntitiesReq) returns (stream ListEntitiesRes) { + rpc ListEntities(google.protobuf.Empty) returns (stream ListEntitiesRes) { option (google.api.http) = { get: "/entities" }; diff --git a/protos/proto.pb b/protos/proto.pb new file mode 100644 index 0000000000000000000000000000000000000000..8ae96495d48d5ed52f6c42c148277c4790d8279f GIT binary patch literal 70199 zcmd?S4}4u$b?57Q?v*SbIktT5B#x4hgOU*0vE;-F1e}Icwq-}bwmgyy4ZL7qN!PLx zSy$DS;uyk|bokdt`A{ew$~<7+z%X=pv>m3?$Gn*iGi~X#rIVIFo$zly(4mFW52Y}) z)7MU0`o6!l_CDuaNhYBs)A@X!KKaCVpR@PcYp=cb+H0-7_B!dOA5E{EYqjPUn)@3| z^ZU=QtSk*LEw@%$_0%5^^LXG=TDy-o^}T7=^6Emfy}OcC2YV0f8ZPP#tHJ~?C%j61 zG`->6>cYaMGqcT^)@<|4a#W)lt2GfSjmA0y zpG(r72)f>%_OzP|&6$adOfYqHCGJgmisnMsGw&{t1G*!s;Xxc>bug~ zQmehPyA~c=slGeyo(1wsb9YyG9?JEr(ypb(%FOxQ-Qk57>vyHyGpp^D)`i_Yyy!h} zeVG`C?Tzq0)mT|+E-%u1s18!K>DKI}-J1n(!hY9pOs{}GORdFr^NhXRYA?6OhlgkY zMRzu4XXjTSU1Q38{g*(;e$D6@Cv>HxSr< z>ltm%J9Q`Q_o0W?698UJ3c?tgrc+A>f&s3Ia@j3%tn?PGyD_Y?8{!< zTox;42ZnFU2327oyc*bZcbZ*lt!5V*mom`HR@+S=%(t_1^9#+a`RGh@X(gLq%%H*2 z!hBhhYxx-+%GqMV6fq zHL@-EFxvZ%j~yO8IXOB6vNSlo$VzNy%grBLonK~<)0eWw5~$2Hra^F_aWQKxXN|e# zCht~SLiOS@%(FPRFKf5Xtz2v@H`8o(zP++MKfSurL8X9y#%RkGpi^Tp8yK0)#wG`{ zLnD)8ll#)_C1X?fjh~*%UNSN-QhY;-akpU4i6pFA=)H8y^d($Q?>RX_dVu1y2>Fs)bh(;r^BX|Fv5l79Nbt2W(Y4=eSme)_|!L-U*JRsDRTk|woH z_1blt_Eh@+LnS-XJU74CY}WWr!1bEpIcqFg<-US_$-D@auk*r&c;?$NsPtV z8F+gI&PubFMS1z)%QleD4>AX^Rv_vn(NHwL0PpBGtVuT$rw(Tqnk(m95ER~NEjBe% z7h22B%y63+ot!dUyi$8O<*!=X#DK5s*_ytmlGbXQl1=q$mOQKfZIx^!V&}~}hh|#} zNHkWAfiF3?&dxtFKfBskSkq0mckjvZsnLUb_hust3y~IUh~*H^wH6jy7qfwdh6uwD zE<&gQ27)jE;jL+xaI6W*ywpvpcV~RZaI#(3#8Q>gb=RkFOKfnw8%%EPe_fKjD2DQ0=L zd9Ja#umT?E8;{Iu@xgE{lW&eqHgWWD_Ppobbz9NT%y|YeV`HHE3pAfk*CLjav(hE9 zbO(}EM5N8ni6sa)xMy$rbCYm>rQZFolTBYwD*gX-GP^OG6UR+0Ga&F~?BKihk#KEf z=bDX`RR$~B5P5dGxpJ||95lR*^Q5FfVBB;q=QbB-ms<0SD{Wgt4Y3K5uK7rFp@lp# zl1#78FU$flOhjqju_DB(?bW5F*78a_n{F}DhAfp#2xW130RKc|@lw{l)Lv;`XzyeG zW)@a8zU*bbQ>9|>_Jf0x{B1=49O7|xdYDb6yh#@O+y*<-_>uEN-IwO4`u5SsL>}-^4XT`_4 zuxzt3E;QnvszL5I`Umb9HpY*v61I|NJI&4`8)oOvonz^+!Zeq*iG;n`CRBTC6X9`z ztxDStTc$Cc@2C=+tn}2Dx-WXFFJCIH`h7+-6PXc~)VsiT?Uu>!<<>&mumNCT`>6Nj zJwrJSq3Afkbe$0%6wnfZ<{9A1r6rUBRPeZg(z+oA&CZtg1##Y49!3?6HDeos5x|#{ zh(D@5V;vP)Ai1oA!1eu zM{Te9^aQ*DgT(pVkT)bFj5!RR(eKd)Tlc2BvMaKJ)3m<{ZI*Pt7)zzKx{UU%xnd>f;545so93eQVPpG3bz#qQ{tj9XTr`dFzo_Z4T94WL zG#k?2WA=Xp(6P~}O!Uerb^C!k?tJd^&Su$Tye#HSBZjnVstxQp3-}TCgH8@#%Sji{ z&$HGfYh-s!x3FHM+>4_+xD)1I#r{M;^i@8M6WN({zv9Za(U01oW2C3v#ME@etwSct`nD>hk)r!{0}55}*Pp*pk4vF+!(iS`e( zwm~NBI~%?1*q9>Ag}rCYcU>6(W`h-wRAFCO{lS{RPFR#Jk@tpT9yT1?5zh_}58rFH z$2}v@@qZ7UMd?`EM;V7;7CMLf9*5o>7DI>nfl}NQP>7h@H~17*CA3gGtaFGx+@N#) zJAKa~`*-G^!|<2OnUZoKlUJsn8EXy31l6Ikgpv>YtbU$#p^4?;&HyC3MjSMfVf;Y& z6y@bNvY^q3@~$%nnTAN~Y@$hxJHM-5 zZm&yYFz(n$*5v#7Y&3f5J=HppS&S>hbf2K18Gx`d%3P%_a8^e71#Adyty;=BE!&y3 zFq0W9ofg(3*nVjrVbhm_~JW@7X8^u%l+>8_-mUu5npNRJ*BUYb?z$aj{Q)jelq5B5R*- ztzrQqWjf|f#4Z--aMrm^2!Uc68w>I>GbhMPL&JR6h&NY{SIbNEZ?ybQIFJ2ZuDHG5 z#aavKKGpJyszp#cg2sCws2ps~e}m=ncfiag7GAUK;;vf6pRScICfMq z9QUqV+AA%LcI~|;9`daRw~DM1-gua5nnCni){oszFA6hrMuvkrhkMH>m;~GrSBe{UdXtFzqh8)doXVfd2Nj zaTrb9S=TK6fEAl=Y4v|6iMw*K#Y!lo?&UVp_EX4%%Nn|!c5Z<^dsW!PSnGwM?9{!` zEXW!y=1xFipr*kLMAZSJlr~3`AvfNb>5SPK+jU5{LRcEN4`;`ljdS__6r{o6a&u;t zLq6n2?lI3eXpwU$@=_E*VQaHl2=DfoAwI(yLYpHf+h*BRSI%>+#_qe)oNF!5HzB9k zVJJK5t}AnEg)=#Ai5+IUIV3r&!xmoxDj*-3Z`jt|=@GdswETQ$SaNK`Lmq!~`JP0& zz-t}bc^JkB!W6GI+H@e|WsqHKAGy1eh5>diqg`V`a)}xS(`m9sI}0=)=DaAHHUW~i zDa;;M_n;l3KNo##(J7t(weiRVP*R>`H6OqrI#(Q)Jryw}cL(+km`RemQ8q9Vp+UYC zd5>#|7ial0u3_5T@!ezA!mkNOcVcG?q&&Zdnt;bDV;_65y|57h=I;s?0yakrD?yNNsy_&)!$98-AF>V)P61?4cN1 zrh5k=6(_+kHd4lBoZI@~R^0G9a`zpHia* zYO-m5Wik~V;;@}rK~t5M*GZ}1kjc&t7(oWm?v~k_tppJU&YB6$5t}(~@)1df_ zWA;VJRyyMeXG1dtY%H$ei^1dK@~$+rz-(tIm7qiu+uz7PXdSsr{V;W)5A8F03 z>g2pQ<}8kP%Lk-{w|En|^=;c`9xN8F&CV}xmUGj0n1OuzDU+WS+DU);Gj*^6U$Uy> zEc~se0k*SwcpB5N|EcD|P0FV=4>$^4oOrx}4u$!3ZouYOK?f=OF8r`KN8G{R(VX3C zB0!VIUUk|mO*`+=G5(~7&&Xp~#Me;sJ6FgCMI4!ctaaM$(K=B$R|!ZSpOl*672nCu z4WS7U2CFKZ)-+^eE)Sh+%&1y8`7SMsqDOVuRgQ)*68PT7Lz1d9^AY!zyT>VbAFz46!4a8c73nO z>HZ9^WryGdhy!dbipro6luB)Q^E0c&A-LU7oQ@977)c96X}8>D=FIJu zOMozF#&|M6V$hCIB2eML&OLT(NM(US5@X9qSKCnHHqZ$t&Vu_q!zN`YYI4_D@H*vp zBL&69!lUw1M)=L7Mb(O-%VgHl#=Jtvw6hp{A==N!Lsn@)Lr8BA$vqfP4~HMQefWgA z=CpSe=Qpk&s!=$6?l?;=8{GR}Sw0KWX%y>tQl5W#KcQ`#M;3Qw_?7~PG&43Y;0f=< z5m7Sdt~qQX(;%ebmAEou73ivsN6{yyUWG6+an;L=ym#bthyh5or`ltz(M)S$XnIxA zChh&Rt(o?I2X*5^?bhNRP1sA$E3VXd7pn0ys66?G7aXh3%WXnl7U5R~i?Q>?sI3B( zl@?JY!}HCRa~4B-e&xc#{^fHs3hmm%bbEBo9m5BP4`h=PD$Q)tPC3Ond0d&WG3H*6 z%-+4WQ8O1r;sp{#EF%0AOXk4v9oa-wh;q=b_%1gaj9xQlYf8PXuZp)#8i7@ehCngPjA$!1 zhz2OcO@3j18mFX|qVy<{V}=-E`9)Fp*==VRB>PP1h#fn@#K~f?r@{+x7Fj2nh++aK zb1WxwdD2X~&S&ic0rl((!TBl22zUpzvzWfibbuNYBMgTv27v|GCYBXNi~~R!(`%?{ zv~1HREEnu~h~)u|8t6nkgAMM4=){O~K;=kl*1XjEwT^>*k@zWu?wo*2wqJzcKPNW> zx3FvTD7iaIXvnTvwCL4ELa^brmIM<5$plejc^TtH{@G}t+s{%wm-)c8Il&k1v%OqR z-w&h5#D_ba-PgJ(4H`vMQ6Z9(@IZN|)~c6|Y(h-&Wgh4r$7cI;2-jmgy~Ott&sqD| zNl#z;CI$Fb2=J}_LXuq7|3jq>B%HW1S~pP*jCP#3mG~5exUZMR&7;GO6}5N6Ob)-{ zyqb|Ln5`V*HRh3WX?g{*yr9!%`1Hgg*#1JYWk)PlRor!D`f)?PXH&iV7n9`ENwxpq zEBZQ|2f9oMww@fR5>IZEhA13u{qjKu^#SIzYOY40`${SBcr$kXV2ZyIhx23HK6y-6 zPagA|CXdl_=KQPTnSjjaj#C0f1KTOTpWtze!Sq-y&s)6WEn%v|_vlJ_p?p=<(61(b60kKUjY`B6){3 zIs{1Ukhp1zy^*JDbohjLdc-=U?#GkbmHl^gc6drh)usOI;Po>7bvcaKUl;v-Jn8KV z1MH%|k0(2Kr9Y`4_)5}UuRWR6p56Z=iES@|f8&yfs+jn!tmSvahWg%5Rkk#C6$_Ad zwOX8hHoywuAB9zY-{=UpNdPR5Ai{$NW?NxlE)osM?CA4EqK`tAY0c)rCRf)=xCk$gdA02L9d?C(W? z;Bdewq*F+ZU6pOt*-|^8x^@+|=OE==he05a= z74a=J|6{l#uN8(EMz}|%WH@Qq;3_SVs^ic zPpN$_0Cxd!kDw8AbI)vYv}Sdp(>?K_G@8~T=Dd8w_(z?UW}D3=SzN9&Y(YqaeO_eQ z{$aumpzxNF|6#K0mRMxuf0*pummcE=OH%LtW}+L3{VyoC?zmjaqA!mY2;$L}DVo_d zNJy*FUiQtT=bH2YGBuG>^)1PQn@pq@%m~O000>XoFkv+E38M(aZ$-|h2-@Eg=Remv z;N^c;2e%X^!CD0;bQF;EKD6P}F7}}f|GyV~Xv6>S^fBEXY~(-q^8}xoUoEyrSik#c zo9&t9`6ce}hFiwlLzsH3F>oT?aTG)NNM3Q0d%Vw2Yw{h1YsWW52X1UM+}Yxk+%yx` zV&L~`>CO$_>O!k18!x%)H+O)!7(4TDW3CzQxyEAsS!p_pQGrVwn}qAcRW9z9p44wm zcPy<=bM=zT&Uv+zYF!h3{^Cgfynai%{bIB6aJj0k@ODjX)8kUb!|B!_8_r0~absDR zuCsNcFKFc>?+vY{XjC6bw=@@5FF1rQgRq`{qtsXnrAN&Ih|OUqSh(@8|1iSM3>BWbS(KR8E-m!A$#rQT>gOF2`1w=DGo>Gqr-&R~~z$Y7%d0bW2K%UrQ4Uf>S{(^$l zbWOkaz#LJcm zWeBi`Cy`+NuSmCbl80;uUF{V-+a~C`CcIGZORESolX6`X`dR<}V!+Cl(0kxH>(K3l zyms9EccoW!4B+W@J@8n1<%Xc^KalQP<&HPjHEJQwl{3EjcmKW%ko7!wx?I~4oY>g` z!XNJ4((~2LeXr&(8TiTWbk|0LXT#;o@<%96H+`5i- z8}%@JTummtW&MR|&4j$tPi#A|_vt~3LU}W6nV|ZF ztt~Gr^#lrvZUvt)vm)fB*cu+bSf)n(hP2mL6^S95kDB!Cn(&1-rYGuNo^0rtqp53*_3dfz)B~qR&m0*)edzdTU!}e+P3^(a&Ut?)PN(hTuCdT=PHgwrobCBrwJ?QYxzs}2MbW}v=Pd@_x+U$E2^Bi8KRey} zP~(xtnP@9{BBowFJLTpRo$RtIjFGTv3!b%oNz#AIL|yO3_3E&~YW1f6+;pe4h)3yX zWbd_iYbVJu+o2jKlz)PQ3t`ko+q>SHky(g%t(E2(0=^jc8NAtN&NtfUckdE_L&@&S z#5JmTEYusdY9ouY_fe^SFuls4Ktl+4hI|4u51(0GIrseC*OvP?4515k4y(#(YSbsw ztu4Gq7v^8lJcEC6c_G%!%o!UqCa30$71iF|S4MWn%#00oekSmEoAq#IL9BAa9p#2L%C$}Dap}_f z9_!_XJC-i3ZFX0>Yw7&b`gVKE?dnun+wf*HxQX0mPG@&tU9K*>JG`jxhy7>H_zmwf zoChv8+PiNkSKc-=Givw0N9-jD%yzVJ3X`<;+E#tXh${w#@j+#mKHu3&+w+sKa`rO8t0x!(t1Wh~(fn z0P8V2s?IcKSX^zEwgh_)<+{bzWT;&1KO>=Py_0_>@$-gd{zYrXDGvj$EPFn)U#r%PqJ$+mF|CYXV;7iqXs~IYqCeGkx*38I;F#2sfaO1jNsa$*bu=cWp-L4%^ zcuP4dy^p;SMXc0bfM*xG!y9awM7b-=!V(tvNdfAY-9@re^7$0tJb`ZZ~7 zq4A1Kox7erdb*PU1UcS1_ZoZj%uT_-{JRZr7EvA#|9p0sv&eBuZTf)(I&JacMn z^e}5;;JInH6G4k5Cj*VV7;F+-N_u}n?n>I1YtWH+oy%N`(1y$W ze+HTZ@2sTT!dAaAde8nlMelc#^okB8cFi1L7P}uzcW~-@VTqtWobPAs3}^R%361s6 z!j2w>$BK5xb&7a!C)YYooZ=Ajfv>U1Nt zSlK(%?I*|C6WJI?j~*R8JT>W#k9-g~KFX`?A63(x8@Rv_<9^oRR`bw0DZW9QVd)H~ z@EcB8Q|UrbiG#~?^C+B+%}z5dJrN)>Z8-m#SXcI!m1Kl3Uaz%=H_ zi>b_J0gxLe+w#X&vH$+GC(=OSWH;1dXvr4@4yCfAeh;+r|@)BufT+CVJ=F zxnpzS{U|J*hYJ`lJqs-lA!Ub^qk3@N+;lb>J|5~%VyLj@wQ?0sxI@QF&g!|Va+{`twvi8L)Dw*$G>v+}xj!y|cO zvxyRb{tIbZytypd*r)se$jnjOr?A}pkqkQdU#6RL^NYbB>;-mjbFYgy?p{Ci<_acT zkt{d*#18cpx}%-lwePFE^o8Ywe3m@dV}*5oY7NQB*IXQ$Yn4t@?=JLJ%bHs~cIwav zlKx|M{5ou)X+AvBJQuQ^-2btUBuc4!%cei+uB0E>ZYgzdA*JpwZq2MZ@ygjDk5?wd z+X3A|-VBTl-3sCwkKORl!9MD9+L4F%w&%w@ykmeV_ZzA4{#J1lD=}roULsD*h!UjE7>k3`wHf?dnyCA6%T>5B>etADq(Uq9*AM zb5h#`F}6}FV&*m<)X9)9SfiJ?RUnWvV`jXyXfa*>&ggDe5+NOX09lP&B=ZcH1T8L; zC?-z3cnTo9+j2qoG@K@IC;5ZehzN{aZe36)39}JXB}Wd57a(V7r39+Vsf^e!(J7K5kCH7pJ2f%>V)pGL*`Wt`IZAruQx8mx9lLKTyKnsXkqOh~k>H%g#9`U9u9zF^sv$4;C&J_fWR=kmU6?BwC&r;l(lu`dIH zVy(!4J$3>^`bai4zR$W{-%ih#2^@yXFlBReuSdHDDUHu@26MV_S3Z1lytI6HaY$noQy15GoOty3{S2oTgoJky>(twIzhanya9w)*Ff7#(NenAhEIWT%)UjRDEc?Pw3 znH?E9!3oS{HuzLjVPX!So)|qLtRcnZ=|huKV^gQ6Mzdq%<426xlcN(aCiC{>-P!SR zk^g9RdU6y*j*Lu=Sl7UST)bxhhfZ@UBf@buGdeMG+KyfJFv~B2G85V15!z}xk7Q(0 zV^+m0qvI0~2(0K}Gq5jv$$g_dpAb=vDMmyP8F`1N%GKx)USXn(ab_n+j~yR7hKf5X ze8vUlC1aDLdzi2>a62ZLVyBmk&?$^U$KpuvVv6*;#JUif`OL=1;CS4F^n) z1$N=liUB{I4^xvBH|o5X_BUG zix8O+d_5tXDC=2%W!Aa8J4A&^tax~qc|4H!O16j~^YA3A4J^CatcxS1$61KZM)z54 zFGyD*n=Fn=UB*SsG`MtL4r8)0k@v;-AuuI0jo!(?Tne@xv!o9?oQH`lBB z=@0jBdbT|zSGj)r!`q5X>H6sp@7#1<`a`5o-%_vgvwtPfwg~a^jYko9!RzgD=Y-`# zv3SP?k84m&hNi_1#6K=5v&PE#3rJj})b4862- z1~rMppr&U$=gtK9zA)fxHz=wvB)VL=(J9f%3sH_k34C98O@F%Ay5!Zp$+HHo&x~a) zx#B*{u{b>4SO$~k$_%J_%L;wmoA;p<;rHf!Xdw6E#S1m*<6d&C-)Vio=7*AJ6Q_8R z5!vn@ro$G4*hg1k!=lc6OX%%T-W&G@s)zF42(_#ps$Um+9VW`mTSn{0y3u{r4pYrJ;g3Q9P9aNG>GKR{D&C*$>t~xm+b;sQ%hJ^p#I@7aMSu6_ zH0mM&|NXuFp$BdsRPVp`mRO>{`}f{zt4>!BsxL~0!mDn8yeJ1k?0xk`VbxI)ATPSX z*C!=_yy(__0m$Zh^>{KIfNTcH@f^rzfE@3|vbUu`EP3_#z@AtF$nkwc0SKRdIFSSC z0mz9QNDn|x^xhDf5l3A;kwqYcQCCmoK#-r~iHn9xLQpcLI0st*GTs}P;TC|5U+p4= zngAJp_CWe49*WJUDNZN*`@d2_2pXY@s)?eF1!R7G*r2@Uz_F`t?Bx4z5EF`)gpYJx zTRL>RaZV}GmYWx3z1X^wM+gfFrx4x5ZHpr_yF9bJ%3EdKIY&AGZLc_cSMnQCg~8e; z$+F4ZGFBk3TXQTo58!6!4|bxQ6!4dBw?+b`kn40#t`u^e?u`;9g~$^Wq~}93!+}odVq*y=dNDRdf?jY(_1X8y!POxS5^A2?br%}9uqQ^+a@Gg z_F&J|#)OI*uf9CF*5FZ~=a+|`Dbe%GL(i0G_VOUqDbe%G5$f8>5})XnDF7yY&M7p5V4Z83?+cf1`$CCAhSV4Py)#8 zt^4R4npDv%&Lt0XG^RlNs;GA^-JM>WcB>?^&(*FU*eYvuVO3einEq|)W`9YSbG5BS znTeRYf>5jY9$<4jcNb+kp1bzC95}Df*RBQl=%ed_YkJO?fNNVlUjnWvI=}O(9JnUw zJTrYoz?^A%sJ1_Ut%-W51Wr@+&=mv4d%!((86|04@i!RscNgqqt*WZqmo(pt(2$ey2@4>%+`n2(jPFiTii@;a;i_{nKXH0CnhKeJbFAz|_du0z73Dn9B5P2b5!=2W z%aPv#6&}mQueR^UH~{rwYWsd{;3ig)q)yilZF+5`V!~Zw?T31aXD|UOwUAo3Z(J#C5l3T>Dsa&}`y#s31>fLXsYA$&Sqbzh0rm~SQC%-T7i@LHWmM(LbleGucb$=U$48 z;=B|MjvP$fweuskD7Fw*h0-ymyZqmsg-JR8^z#b6K! z>bXFTi)B0jwKy1<=Pl4M$6d0O2gUHKw0Mh#9|r?(zU_N9m^%(U{lSPm=(!jScl>xz z8Vt<;6P4PP`CxQCng@Nw16uqBOL3byi0abZ96mti|4wbSb2!;7tpi$Q{ycoR{pK^D`w z1v0#=vSVjD6sVBaYwxbquEL9Pytz2Ha(-hvrR&3MeXbC)w=UWve9DAp!=&tj6OuIua;b<$7gun*XECxsvAP*Q|1hu1Hd;ik{ zwF6MpEI{o5)cc)Q68e02?gN$NXLF%1;rfBf=B@a(G)z>UdhLS@v%mkcLO)KWsY|LH z7b_3w?1PmnBhk=t>b0LPh(_5T6fJP(Qlr#@^3Rl82m}v`780>PqZZmTYr^+K6-+h{XC(1??le1=fcuSbw32aQ;vQ4a_0&@?TaG&r!gwWFS$DkaYd`UsggU z2;N%d9ajfPy8inwFj_?T8Oo`gX<2HkPY*ryo`Zf||(k zkxG*F|5Remx@hAI+a?Bvp=>$I7%TtD85z$&^;;wIk;XS9Cevjfo;h=`%vY;b;< zzR%4sllaMc_uKqJ$$K|NT3?~dM`c8B5H}Fg6!Se=u(WzgHleTZk*c}NQa(~Jxwi3-REXH|DMGQP_^cb!zi&jR?k`o68~T@w=D98Q z6m({v($Robcb&>I@q1z%au5{B{LF|WR0W+-c?ToE<{X1{ECeF%%D3`M1@2NPeyPHR zJ;z=7R(`2+{j<^!Imf_Wzg|gh>VJ=O3{1j_^-N@xaE9TWl6&(khwa9RB2BYnqnE3g zGZi9o7NNs{K4Plxq~g!lB@#SZR>NbcsL;_*xF_hTa`lFJBqM{=1CBBp%4o(M>%5Dv zPBMkwne@&zfDY&N9j(kf$)=%ZFXWS32cB;WHvk3D)cBF{K|f&JbI{KbhxnS7tG)L| z0^>*!&GI7j{`G?1QpbM1f<5N+#+N{G;KuYdE_~3%o~UpH@rdM!i3}NnPGGwVDT%?i zClyf}&G_<360=XxjJ>uC$$XU+(}2Y{Rk&waoU&7NtyIt~_QYD`EQ1?EXv85X&B+sm z{FHw9L}f=5+juf4a;ot^dn`o+pNqRECAy~QT~lNbpNoT_NYl^79i1Xwe=hFmUD{ed z9|u7RNE9O^T)Gs)Ab4w)!yqUE>GK+doYLL(?k`q0{W*iUraTDD`?ya*bB#pn>5CN( zCN+|7jpTRYNGQ=iMem;?Bl(>;5{fkaoj4MT^#40?B;6XxmnygzwN5DkiDHDLk$kDr zdt-cSm2cV;i$MBP1vjJPgl_VC6^>dQk~U$A5t4M1->Y!g65ayo_bQyWgd&iBuflQ5 z&q^G3;~Vb&!%FgvO11yp$p((XD4vbs%f3Q?u%Vj}>1jzG!@g)fK@oXFhoGrEg+H*A zb=FoN3tVw&O7k+O=;#HZO?M(DRz`~5^27K zbRhnTs0TX{;v$v4zGdr_e`U9Erl2Sib1|!S?8^k z!Js# zxqnpdLCfNgDtImPCiL(}VodWDcS}M2lS*>i#=hdqvOwpHOism;$C&J0mwasnR$0pq z$VcM;{4DpftU;>r+*j-jEOixRBe!#uLb2Dk4o1RI|D&F)Vs!~4?(Tgx>4 zGwB{LFI=m(`VGU(w6y%Q1jT4POR|z1Zs0;?n9ahg7JR6VsZ>0=iSrw9|1)UQnwpHa)OIzq)R(f3YZx&PjRg_wk zz=Wb>LJ>^PT2z#PL@`1Vt9?7}l!a_f%NL+Iu~&if%NKxNRykOPEWo2HOZzQfjU=p zP)CA**v}xwwKcvb>Cq{3t=1!gyfz6YCM7zj=$%t!7_W^f2`SR_wMj5BDbo3CG2a3t zUcN5D%dcVd7(pmTND||(OM0{T)+#^SlW$QONUuxq^gB)vj`gx^oE4Po=^nR8xl@?Zi66O>fJw@Z2CtKWT1l}1o)nBar`X(u9G<0?SC}EIWI)E zh&XSG#GwQt6de(Y5a&&iI2396rbrx$Ao3;==k3zfwrJkolAx=-0b5rW%FWRhf|g`S z_$o8?5rJ#!Fp{^m&i+8twvQJa-5{gVaBh;2<(4i&aB|4UntROMx{SjR=Ym;YWK?e{ zMkUUDOF~$U$jc}g)mxO@(CNcOy){V&!b?pQ#Ry4hJ>ObD5(VCxaR1pMiF4nYWICi1 zc__UtNp21=CCeyANRnl5OE@I*rjliEORjNVqN%mL@uqatAkp;gNpe^JT^ZML{8|ee z-np3S7fXlh@@;72m(AnzV9Szx+&htw0#06JFmI39K(|;_*V~i6h=PRF+Y?X-ZBfkM zp4|MrSd`m0x$U_DK_IB5 zK=2&}f?Xi^4k7rn+gLSez5CxKoBnmRa^Pfk&)@!!QxreON)LSeip;(>Z>CUZbf%qQ z*;Z+v0UQX&OoU&o_#Kk+%1E<^^s!zn@m9=m9KM;u;s}|wIUbSWz$V0v3QHhBcJT$> zR6woao&bvi?pWa96=PUibg=C>;E|E5qaGcxxP3!H_W32gAAn_B7*BCRkgNH5nE-8k zUWQ3kI3(N{Y-W1{X`&}ZXHHY+wf;+WqyBISi;Us8M;u*FK6N=R6p5ou(59l9qunAR zp^bb-93BQ`Pe(Op%+-uix}sBypL8i!ACuc_UXsAy0W<$DL`Y|8Ub(2t@L3T1VgPD6 zISBpUg}(KZ!M1a73vJ|m>r*g4A2y^TLX;cIuT)w%Q8 z3-l+huTGOJ2#{NrFKLmFpk@{uXJmhrl-bw@ z`Vx}Ju0T(@X+71v)~eDz?>kC#4xl)A$&*rriIuJ@z19+0@F4W z46VhHeYaP~1jMh--53TTAb9jlaPZNCMSOG$g0!u`?IoP{Y*JR z#!`?2*Hnrcp`hc9rquy{Y5F=CRX zJZYVSadd^NWZEN~e4n&66Wilc@U_j=s|z-4J9F?OhiQ<%$i)u){%-jPjnx$pMvXqg zu=67N$S+6jkGIh1mlLwBN<*TEKJv>6-j;taZ%ZoO@Hdj=*8YEy#l|u) zG{nL1C6PvHgt&ly>?c+RJW}SaA`b~81>_^2?T`tP%u(o_UCUD)Rz|j8%f!%(YV*tp}?#NdE?Exx;*i_Gw+qQ0M+U*JtN|N;()U!xJtLb{IDz>u%y`u&rF0W5idIV+OY4Sx!Q{Yl(Uy16cpE>XghN? z$S}0Tc9D19*|*yU#r)`yhA-HJ@1U`>nhu;RkG25xtxL{(Em%LFLs_;EI?kcoZ(k_p zQ0})cBz;j-$g=%Hvd8^~=3}C`@18KFIOHha^?m7aF_MDrzLX@t&u3S@FFTemlPJK$ zr8=>fGNhI7iXl#H=Gr`ucv{Hbmy*pp(<3;P0j_=Zcaz$-fje{Hv&WoAbVVgL1BP^*f*A=n$Fd8YbzHM(aSlkCHB&0j zwIFK;1(L@v*#iSjw3_@YseCbCMZ|}Blkb3HWC7y1DTdP`>H_Pl$!_;%P=p1(n%oj) ziF^lNEo6y&2Va#e`I4_`j=!mvL$a+iT|z7lN)?{qN||57q_}dPz>0ISCM;tBYgb>wD}_`@*vD2V zNQet=GlQEc`)r~5{9 z*`>M_Me&Abr@sxOzzNLPx3$^-N-dl8FV)&C%+Ex1xUJ2!m>Kq>rgrcJ0@_y_bIp6R zY`_-x{LDb!!~<_+7KU%K5V(M-Br<^Y7{0xj@tG>VN{rV*?gysAKa^hdglz$7aWly5 z>C`qXkiG*A)T}_CM)6?^H@VZL2xCyHbEcA=eYMxuPXkSLptLy;&hxp?{4 zNfLJ)9s5&^{pi^LuZw-wFKLq+y48dP%qGN(rS95JkK>@F>=GxX4`gwIV*S5CM&#SBXcnC~=yqZKL zxZkE?>?ft4$BTYsSw3Fvi;|ctZWM3v!|yan>F4q4-YC?``9krz2h%^+i9?zYu=@IH za-jeBIB}2>is~SRvc!n@lIXzPDcWq{0Id#!%+O$EaIU~gDCpKudv}vmDykncbh5fx z@8*8OB-GX`&FT`>0aj9A?K?%Z47O~(WnnW}!b)_+B({%-vi+LJ#UWA^nFX*Z8+}Bt8JOm30LC@D$ulLvviqP}*)$H~N3VOc2 zdh2c6ffqRm+l<2*DXj>T?7{sA%WoU0KhNd{;H&(-m1lTgPH&(g9>txx=(B4>m z&Rwy{(B4?R{dwtIomB`i{;_JZr~e<6JQn0kb*EM~6YOYao}8*da4<8J%@=1*DVgh~ zCS^M*ACTe{j1a!hi4+pbfI^WCvML|$6$}@o;&88ExIb16(XMHtAm|^fD#N|`6Ru#m zKc*EpW^+XV^p97$@O^i764#_f7#ca(5&7=et=Z%@b*>KNXlw%wU_~^xfyR#)XehG! z$E$Te0ZWr@pz-5X?s~t)l_A2a-%;gU{fCpRaNJ~*$|oBqTxo1e8(lo5TJc zE1Q?#Leq>y^~Wr3ToO{T94;?CE&xkgCkV1-FWXJtOC;cS=m|~oBJ_MmK~KeN*BMa;@XaBmT_?!-8k^?^GG z-@)MDQw(0A z`R}QQV9PYw!QkIh<@VdheDHPR^sC8m|G)iP3?BQ+avnzkiITT&rk;`t`Q2}K;Riy5 zPkTz@J~big5Q4!(LewF|`wK$UA;kNu^=K{CA;kNuw+^MhGC9Rf*&pL;4o#P!eS zq8!faIrnKZfobI)PG8t9Pm>L->wrqm2|FPGgNOv!2?0J>5MU<+_+YVwcS3*yBiI;=ZH!vojN!CQeTW#{INGhKV0HlUg87H4;cg^FF#k}MyOFQ25dA34?B}Zlbi5)z?DeA*3DNKFa^&B96s8gD zCgsmp!%fQ6Zc^;C zqKWIvpKD?_X5mxGxSzGXg69QowdQ=% zp)4meN(=`^LFMz4Z_Mbh$1+$xHfzU7j4Yl6XLp`<#&ubqqG;Yy zT^PgIFolXgH69s7xD@QqSL$9|%UZ}e-D{JnC}eX^Py z?f)-)k$S$Z!(X=`f=c3NqlO+nCCgNw4HRJvgL?>t2`T7fC?<4NhR4NooDpe#*}Wh? z=Vwwh&^+YA94-(}tjkRh(+n@@qHvxyC@4Z<-C}}~4ft-(ROG|JTM!l#UJFvCIlI^n z%9&V!B)3TdEp!~kX!9a;{A58#`9(ij?b{zKL&r~65BQyQ2n8KKS-o>KzJ-pTtloPh z{UfI%V(K&1>8img5qE!ti?_xVhfOGVC-I`{cZ^@iJG5mJ7px_5v2e|8&7LicY}$&&MyZs|=7 z(s$8FPG4x9=ir3`&BqKBf@x+h#k$a7$?|V`6(iEq7 z`?447Gi3VtLOmxPuQCpCDF{(ErNye02y&k(d794DvV~UbVdYYNxM^{)sUc~{NpLe*=Cme}d#0fwxhhKvY6xX?6`!tG$ z3UWlo%DIC?rhGIyWGV~3#kd3FLMpk#xneQm$LLYZV2s>SxMPWAvT_k&XT=)= z#BT{=-5@SD_^3&veMXQYF!1?S0Zd}HTm+aEm3X9AV&zYziH{Vk?7Ps!O%X3E*8p^g zkyczRqJyAZ^A=?OG%D8=kv)GZZVWETR`6KB$qbKS>gWj^@i3VH(`CE!=k@aip-3b>|(0~SMj-ePlE7lpLK`?6F{ZB2opSB3pdMo3rQcZh5O(XVS>kN#K>#6qR4Lb zc8nj%|6Z`FTyPw!MFQ?iL^+ zxK1c^Mrsx4of@SFO#W+XS8TJ01l6Fz>uTY=*2?~%CkLS${jaOBT$MOMH7LKK7P5v| znHD_ob69&|H8_X;oO2QH-&{+s?f(tuBH7kVNSH2Jl!z*P$w&x4AkX&_?quPBmvlGr zX%0)Ts8Ay_NOId{9c#I7UnUqgiW;z)c6vIC(531t-F0;TC=Zr4hJ0(cvo|`(h%Sxd_vgj!rI&$(}ZSn+cc&WL7S5QJH|O-wtH+LT&DOZJG64& zqideww9JWSJ%VwN)>|zI3gSlQQxMdfYvIs_w?_ItzyC)O=6kc4?;pvi-Kv>gy@E>^fq{DPTXyt zww1NgB#S3eLeL&xJ5V(PP;`*+&*$AqC~x=|`dZm4=|wyI+Jgib3A?YE1Ysb2ImkaG zWIn@O^w0z67Nzlca7#2XjOyrGiq=LxA+KiUE$N9&OND_<_C=VD#O-vFC(8Rt~s`ns!v4<5}8D>2-MC_YXV(?smy12&JARd=hAT@WY6gVZF z$FHDi&_3B&>5$rHRIga+JXW}-Y-3JL_@u)y{)_X&W5oK-DgS?vjM}VW&b)|JeP=D4 zg}}Km_B(52oOCg&*spiixF#8jNY!`NuJQSb>1)HUV+ zFHMc}T#TGiTcJVS0+X^C(Fs=3X3D`HJgKZVTK3XIC^mn$# zkO;HZT!m$pf(gRM$mSO=5&v+Uuaf1Vqqc^b&7j;4i7a8|EB)3O*RYg(LGo4?5kf?z zhbBgaSlqRU^tG5<@6Cj)6kBDR2=#DMDc}&E3ui{!+Y9`3j%AuFjQdrsLv+yN22T|yeEAo<;}TQeH%8jD6Qm~*707P|+_2B^OO zm`0=k3pib#AARf1NG%bdPxvg)$|V=qrioTBs9RHd=rP9Can~j69X5AC+M1!%UY#Qq zqXlB?Obl_7JAg25$z=}>$#>_;A0*a%m+8RAPRET9vQGJdy@S6+z)DM-L>mu3+-!QD z6UErwc70~-49Lg1uGVDs$lwfNw@Fs(iV3=SJq z>y%AVo`Ih^ZCGMatTUVPax>XZ@q9m*TY()X?&oqVe6&zhebJ-v^ ziu5T5`j}GsRIX9CdvYSm-@s5K5f#V$v4V*5H+-xXLVX|$MEqDSI7TT##E;d2W0WF9 z{8$ag=)FcmAU#nd;r;FAzVvSrJK1YhL1wuqkcXOX8P*Z&E6UF>0zV?aQ)$T>w znkc^ZiCVv(Do_NqCu%qEwREvtb@}}hweOwR27sUn#E2@{m?;LY4R1m96SZ(8N)c2) zQ43xh1t9%)?V0h~Y?asMw`<{$lM;APbgvCX6u956;kCIA@6lE~ZBN$li*08`D}nuN z_K+!I=3(0^58IP6*==gf!&WW=$%^v-Tv6}-Y;DsQga1b%MxU+W|B=7!3b_|P|2?EU z0HHh(o$?f+{O2R(DboArBjqVV`OinnD;DYt&k*IW5aquRDNhMJC_3dSLa#4~@}k$a zdiQ^=ZTgcyFU3Or*BaO0&O)zkqSu#eWWby7Gvbng#9m-}8UM145+#c(S1MEC8}p3Y zC@SXVh+0ePc4ZI%^Z)_r!U;$bs(d-FGK!${n&jk@ zg`BjMC(oFe)F}MQ6FbE-C?)MEHK&md;uvS7kz68QD`+G$>uXU+LKA58wJ0PhB8k2h zg(O8J(bps-<&56OqWiiQ-Q}Fo+qCY!9@iZux+)jpBP(igZIeOv&F|sj0wCiCVjQ>R z<~QTw;w{L0GcGQQjQg8$aVf&@kDsB%wM~obkK^K^1RfN9aZ!W}e;gOr_Imf9);9fc zmph{s826{Op55vHEB4*4)%6!*->H;aVGYa_)MRL+JbbKT3~1f&crfupIC~_ z)?Y-1rU;q-A~G~ZCiX8PLsNvI{~|IpMHu=o#L(iw?c#}Ve-C*OfS?M*h^kWHd^_?W zZ>_(uwNeDtZ$}>7&Zr*mdSnyyX%Fz}!P z9ADE#7|>^RZM083_~tGG%u6Tn@jAsb%7CGhXPWy$H+Yf`u*yynP(!59Q9GRuKBnw; zSKq=to!D!5Jpdt zRrcnt5JpdtRrcmC!sxZi`n1a4+V#CtU;zlKK#ZtrmA$nqD6qV>{=zDw2&!-G3JPo= zqxy+wXqEM8mHk9qWt6~!qOUTFtg@eot87QT`zO0L{d`zuilqI?uAVE?C$-9UXqCNJ ztBkmzF?kWO|AT+$8C_)F$1}agg3IXte@l#cg>RWy=Ua*}<9p*0qX-wgH!d-X@a=o! z5~Iixdv9D~6j@^L)e`%rl!F~QD*dUhXdvHM2nD<*(ZON_;O?)$9|S7Y0>>D_j+CXqN82xTjK#Lx!aD7PU)C<+N7I$!slam z;*nzw&bdzUq0;<4*oE$5rQD^x=8T5VluiYC#fTx-Pjzj++RkMuYSsMnuG)2WaBF2M z@W6B8+XGhMKkp)|`AwWo=m8Zz&{f+#u*;lTQw`YI!yPfQLN*&Ih`#x;nip zz@hwqb=7tb+)`?90^8hx7Efsj3VaU8H>TrhK@tYE^lt~)0|RBBsE{DwsOG1;lAr1F ztJ#!cARa^plHmL4u8=5@w?O;puIv0TogxhM(_P^%K1CSlXS%xmdJshz=x4fi++;F( zhqUnzeGg?c06`Uq5mjm9ABr-Xx1jo=t{|f+g6fB&jMg=SfAtK>=pB;L|0>F8O5j1! zWi&;|@UJAJ-&n=gt=GFh(zWT6U6ua7OgLbTF24LARrV{{qCI+7ww}5CxKF@`d(1JI zf4L{z0Mo$5%NM` zV8JUOU6(9A(nTub-$)R6btUWlXjk&92)uveVHI}0Aqb3)G-buXk!7OulShaaB5@S1 z)^5&)3*9;em~E{LwVO<)O@`p2w9U8A)Hbr z>92HM;X=_K0OD7=c3odIVNL%^7ug;aH=`O<_>Wz+8}kYhW;`fh%2V+lwHPHHt%Wt= zYFPdNnE$bh96~z8tqaRv>qJ)+WYh9d} z+jlAILhe6xCAa9i6s(RA&F~$#iHrUUfPh2T$2=m0Ddn(=4ECt?gcY)taD;^eo3lgC zH^}tjUptnNutSv5a6v$Mx4b77Z-`*zaD=nXI6o%$K`#zXg!)fiAs7JM4f${*ks?F; zPhB_bt9c?4BJGK;#4iw2f=Co2B!w0~Q9u$Ip6IIk4`4VKsY2yzu6U%*47gp zXi$uhbfEE@T_Nm?w?O*Mt{pc9>gzz`H@iq$>yT*rTU{Y(cRi6;pJIe0ul{cpILWL3 zTV3IPAeDjiTLlYH_v2lOU&gE_a>7%LkmQ8_c!86g@E`Bm5&1<<_>YT09Vgi36I~$# zZQXt31tjHL_(Xw|`N+HKo`IIiK>9=%8E8LOVcXb=OSx;)=ejHX4{>jpZzi-u8p-k( zQT@D2ER%oPA$+IRE^OP;sbAM8uhLO=fkKj+5l6zPQZ5aY>9gO<#GTl!rLV@q>gQT6 zg>}>Gv+@W0@D7-3r&i!=yGe2T$9-&&$6H*C(WQo*^(9-E<~h0)gLgvYO-a!C@gYZW zgduWyx3xHHZeZn4%X3NC%@rahT8nl_hzu?h)Qae=1lQP^F)N6OAik5L1LUzIqdLLW ztp@wf0}+fIcD82t;6@C^%;PqLirOahj>sm#@{iNn!4Q{vblynpm2!6RMZN~Xc^qOf zK}B?WR20@-@ex_MtHQ2~EY3sCi6B4TwA)C85|E?FGo6Yx;wc{Y&1~Ej`|i8##-Lt~ zU9Z2F`w#u2|6cxb8T<`{Cp~pgpI^HwaZFEav{v8hwyWydXa`o zmJ$HPe~Nui-Mp-^Z+;K|WJIXlwl6!t|FZ|J>J&q|NF@6Dfw9Y3!|62*_i@RIwrWW3 z#O6Xa7)P&-ktQ?yX4f@&Zfv3xp={789_lyuom*G`_E_IEh(V?%RG!;+eqH4|^2(kZ zaqxC3dk})iG{iE9WD79>c`9be&K4J9dn0*;6#E64U!BSgiCA$uWISe*`BrKkv3Tti*w6~`#Z#A2>yo63`jZmdjf2xW^OEfX->Ku9}U z3CcA2S{IFtTo($nUQh%-Bcs$Xlaj7xF{T^##VWiA!WQWp- z%foE9NNa16HEU}M$K0?}cpr!>PDQ~%z?IR&=EFU^b&Dt)ux}g=P)8Ssi4S44$~@U{ zy-^MkZ6OwAR`6b#;f$9;D#RQy15|97T7hA~nBWsw2dZCCd0rXU@U$$l=Y?Rx{DTs# zn8Vr~ooW1=B>>CKvZB+dp53hU|JOVg{fpYUg*-ZS2~qMJAKX8^H%7( zBd#D8rEb*rp#FajZC~~ju4thUD zG?v$P@AA-Cil}O@?IxSOZW!#875TdE(MD`@K_mah1t0y$aZ zRu^O5Hc*5+I!C^Ti-_S6CA-tGjGIQuAK_Yb8FLh}I~7gIYFVRfJO1l|ALs;rR7-eG z)35~nzMw#FRB6~Wk9D};Zs4QF6IDm6Yj-6@pC}akKD4n#@lCVHY9@*UCTh;4lUfh; zH3ZK%6On_6i_?DJ!+I`HzGgmWje-Y^n>uy6VwW5Yc~%s3AA~#pCXa!1buP*)%R}OU zhi!6BaYEHvlwKvf-xeWDoK@(q0(*cx_U`WRrh!i;%qFQO`Qa z#7GVh94foOelvj83yZkJl)hUp3dI!)QJ3RV}X!J~m|s zgKT}Qe7ik_WY+D9pv1Y<&{1N%4>WU$N!9@-Glb|74$j&RGCyM!NZb{zA$RLb^TUTHMm|b~e6d>`h7)?Jt}#Tq%gqB(i@B5c;(g`0lmFs< z<++mw<9+41lkfU{<+-b9?%t=ld*9YDcRYBqySAtQZCl0M#;cRe(@awv+ZYxsTw8Ma z#Yn~SHftfJ=%6ABfu}M@FUUeY9QSOGZE-vpk_Itvx0?LMV7#O~bw==CD~pg(nt&vL!xRI~Y08LjMs?R28D&kN2_| z+qiBoXcLT0WWg}W+J8}MECHy(+im92z?UDEDdHaR{rgG#EptdlB{OXLzi**Ifsb_9 z7ilO}fp3VgY{gSh91V|<=jHkK!^KAvb8zb=rUa&~He(D|O`&nngmgy(@xbS)ZGw$+ z!?n#^UBWgZf4`=6)V&uNs@iz-jRjdkEJJij*zSEe48P2{RG_QNzLsZs1F$@1W97Dd z$GhML!F$ciJM1bwJN`z!QYH2}0t+EJeTkGYvpU}aHGJIxMyPaINU>&4o7on(Fq#?9 zT|Ec@j)aAg^ND0HTIw8oYgAgq@L?fo(;yc-xonUikwpS1M1-Kn_N*DVRWwu=Mbn(k zKI}{%SA*bSdbkE?QzDB(b8LmnqgO0j`-pj&4Z@t*C>ZQ>eOC5nhfpIPj#%fSOg-_5 z53moz#))M@BWG{3PpA@O!-KLhoDqH{G%p7km;pHA1v5T2$mhiQ)n9@r={&=*L&!NI z-NjZ!I^GPEULXfJ`$VxF$p!vocR0zg8f-^TcJI0=-@)Vtf3h1lxK1)ugYu`lYkTtw za)tAtfGKDAr^_(q4*zubuA7S{24iqf4igZc>8>5fE66F%g94`9;-4wQlww$^JBEn&o9AmD;ITNq4Qdi$toHB zYuwWkq-gwXS;u0w?|graeoq<1?RINMACwGdUUp?nayst?8EU(;!7C2SgFDGJOdM9i zm_(8B27PQ)avf`ObwH?8USI6)xh8!S%WjwKwl8&)d+#CLRT;_imckOY1)*%o)Hkn( zR8l+%+B0(WsE0XB*GSr+>6z{-l7vcHgC#sbL*eH1%*@esUc?^#Qg`o_@hxb6srxGb zj2M-fvoCe?88O+TyJV04Zg=v>!5*bd?ceQAccpKxz@wzY&?D@ zNqVWekX{PJ0&nT1e-Ia#)v!Ky-B2_E??33~!;}{TQXu*D?%MVJ+zKmv1M1y0c`-=q z+&OvBU@iajb#P&H@|jF4lyqB`&hUbfpQ4~;SYp-^@{(foTp%wg_VqH+b(Ht@?(iv9 zjYd-I>)o7qem=4i55Co1ySD#hgqd}skL~fakvH5emjuf__t}<_HxgLXff+S{B*jUm z#X|AQ@K*Q)O`{6|EcfY>^bbIZf z?=BJGJxT2tDT40*+3pm%wr$h1D(NrP(#qC)b=#);fe+Wv;g&8f>zjMo;LM)vz-_lb zcVCE#B?ZI`ESw$Z!=xB8`j{LkY;Dd*P>-4V@P_%9G?DX8O(Q+um7s~d<$R=(d?Y~= zx!|m5B$yI3k+<#V%f4%ZvNP_EbnGATasr&(mBLB()1APv=ed*Y7jy4SE}L*s zvf6k`xXa#Y&EpdGt1pZCo9%di^u0S)Wn@46mbuSYNxytW8`LJfiBRq&Zv4ipjQ!); z#|=+Y`=UJf#aDhoQ@(n+Nlt!gX_}D=0t839DeYgm-0$=5LBH{b{Ne$(P%x-d2vpVP z5w8~ggtrX7N+ti(|IEt2zUb`CdVikLe|?dE{ZBLI=`0*d*kbv54N`-j_U@F72};y<#B-pkj?mV@xcH3J{&(`d^Y?+WIuw;yG2p( zv)MtX#JuErG|p2CUzsO`o^4kX*|7RGqfWW%69kqjn2U`raY6R#Cs5m`Kg00Z5gA~f z>S{ebU;bq_zMA>AOqVV*rk)eak&ZX*>%FR!%;{|LmFYGR7DB32!~$l{mcOEofK3NZfcj0{_7jZAxIJ!qsKxyDI47I!V-XEMD= zRihZg^e{?-q_>}X#!+LC z_Tq%CeOC8NisNeYhR@6P%2tWwBy%eJyb)uAfX>UV| z{r-1iFgjt}Jj9yR8&Nw-kCm1EDD6sN`@L8^nf-d4M$JLH9<$3kX2*6INX=SN(rnkG zPT1lqs4is&;j^%t2FYQ)-M(B=Ty#g>Ft+AuSk0gj!ezbD4y7oqXDf=sW-1jLg_;Nt z2HTjxq#rgTLdYXT4E6YU!-6K^PY2{8F=*90^#hFK>VK084bvRNVMn+|6v?2Gq)|FZ z!{DITYpJl4Fn-2hAo(DXdYUb53PRSELdAyb3RoAeb09#XbklG&gUA5(U+i!Ty{1xQ!YUh zdC$48kr;gmn#d1E!vhJL$Q9>3&56;Mpov^HLyppt?@I9BdAumt{~c$x`cK&au9G%y zWHC@^d=G}=h*m+m7K4JX4(?zhq78HSckb0{mZ@M06-1w4D8VpF&E$UQ+a zAkM6jJ?uu>@FwaYIRED7LF2{w>Xkvrrj9YzDA&BN`i69M83w^?QEYJeG@RV@P)wd0| zYA0SXR7jtP(7!lc$T8KLiV69?R}f>dkk=Ru`++x|&EqgW3$7-ONBOg!`|AA5g@UF? zu(s!wo4T>zloOx*idQ);=UUwKgX^2NS~iPK{r;yH@BC@xl?UH22s;~E5byK})iJ27tIH}X*9d7AMI?~eSQS8m}XcuW0i_pfHT;KH;?F1D4cbX4-CI3sK9 zI&U+cQcgJuL@SB(FGsyIcMtx`h7wchgi$O*Hvebd%y=*GZ)HtB9!sg!HzZutZvXag z|M*?LQk&X3lMV}$k8D5jW6v8&(Z88NkKzRQ2cs`)^9nobUmwD5ef!1fYyZTX8E^Fw z!{f1+7`~ivQCn2xh3XaLA=l5nneiqZl`tNAsf5c3L*Cb~l;Ee{%y`TB^O<9W0i1EM zs0JFzdOUZ0c2S#C)~EfEthaMd|8h;{L5`E=#9-j^a2#JkOagOGS?q~STwUh_4WhdW z&ONWrbA0%0C!OV7^<&kF+In0wWje;#UK}&T6`znS7JbEjKJmiojIt=IaFP?E>{TzS z6S&07Lr@b!kya}D83j9~iX4&9G-jWr5B2FW$%#|UD_kpbKi`y+;#)FN)p-^P^kEA< z5oqt{z($)A@s*YHm8?Wo?A>y4)|MdxD9TOopZW`x!C|G49e3xd8G~Mb1n}{kamE8<6E; zJEbUR=}}~5BTGC%p_Y|Xu;pmfwvIgtE6zr)y38>GF?!jM!5Dclq;{`-)=Si2u9U8` z9#Y_RA)RqGuZ<+cgis}6L?~EZotn-l*jl|_wx5x-me&>_BTjLs>@#WiwW(|NGq!2C zYh0;lN~7BA`P()LcQjP?nKbJ9)Qv2S&(^uy%6tZKKR;)a@Xja$w~x$3UzvwG-&LC?7v73qB6h(>0@xV2=riv8a>eTi45AT`-4-BKpx#!GiQ zZ}@|t$+j&MddH=^JyljFpkQL#uKKe2GGz&*6>2!V(mS~w^&KD6x!1>8g1j;^q@XSslYi@o7zQu{s2 z1!;V?XStwDe&&2`xR8GRndPD&Ts*dL5WqdQa8P7?Y~i4Qdu-wGxj%6l29D!5?h{m) zwEKj>)orC9s8rp;L6Na;D+L8yol1$wQNJx`-@tJO$8A}-qQHfgI|#T7EgTdXL(3f$ zaG~W6N8h3I)WGpxrF&>AJ1KCHjF91zcpgV-c(EbPXKOQo3ymR}#2R zzM_2y0=Q1Tm{DZxOv-aT69v+M>u~%RTT+VuGX>^H`)C e+fqC!C9yJqKn96r8j6gGl>ro`Bz`3uSAPcxLTAhX literal 0 HcmV?d00001 diff --git a/services/listEntity.go b/services/listEntity.go index 7477f000..ed033e55 100644 --- a/services/listEntity.go +++ b/services/listEntity.go @@ -10,10 +10,11 @@ import ( "go.mongodb.org/mongo-driver/bson" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" ) // ListEntities is a gRPC function to list all entities in MongoDB -func (s *EntityServiceServer) ListEntities(req *pb.ListEntitiesReq, stream pb.EntityService_ListEntitiesServer) error { +func (s *EntityServiceServer) ListEntities(req *emptypb.Empty, stream pb.EntityService_ListEntitiesServer) error { // Initiate a EntityItem type to write decoded data to data := &models.EntityItem{} // collection.Find returns a cursor for our (empty) query